代码之家  ›  专栏  ›  技术社区  ›  Tyler Rinker DaniM

呈现函数的被动参数

  •  4
  • Tyler Rinker DaniM  · 技术社区  · 8 年前

    我在flexdashboard中有一个表,其列数可以更改。我可以动态计算柱的对齐方式(默认对齐方式为 $23.45 作为字符向量,因此左对齐值,尽管它是一个数字,应该右对齐)。问题是我无法将此对齐传递回 renderTable 作为一个值 align 因为这是一个无功值。

    如何将无功校准传递回 可渲染 函数的 排列 论点(或者另一种方法,让我用反应式对齐方式渲染表)

    MWE公司

    ---
    title: "test"
    output: flexdashboard::flex_dashboard
    runtime: shiny
    ---
    
    ```{r}
    library(flexdashboard)
    library(shiny)
    ```
    
    Inputs {.sidebar}
    -------------------------------------
    
    ```{r}
    selectInput(
        "ncols", 
        label = "How many columns?",
        choices = 1:5, 
        selected = 5
    )
    ```  
    
    Column  
    -------------------------------------
    
    ### Test
    
    ```{r}
    nc <- reactive({input$ncols})
    aln <- reactive({substring('lllrr', 1, nc())})
    
    renderTable({
        x <- CO2[1:5, seq_len(nc()), drop = FALSE]
        x[, 1] <- as.character(x[, 1])
        x[3, 1] <- '<b>Mc1</b>'
        x
    }, align = aln(), sanitize.text.function = function(x) x)
    ```
    

    结果如下:

     Warning: Error in .getReactiveEnvironment()$currentContext: Operation not 
     allowed without an active reactive context. (You tried to do something 
     that can only be done from inside a reactive expression or observer.)
    
    2 回复  |  直到 8 年前
        1
  •  7
  •   Weihuang Wong    8 年前

    尝试包装 aln() 在里面 renderText(...) 即

    renderTable({
        x <- CO2[1:5, seq_len(nc()), drop = FALSE]
        x[, 1] <- as.character(x[, 1])
        x[3, 1] <- '<b>Mc1</b>'
        x
    }, align = renderText(aln()), 
       sanitize.text.function = function(x) x)
    
        2
  •  6
  •   zx8754    8 年前

    首先,发生的具体错误是非常正确的。功能 renderTable 只能在其第一个参数中保留被动表达式 renderTable({ ... }, ...) . 所有其他事物都必须是普通对象。所以,把一个无功值 aln() 真的有一个 reactive 在正常的环境中。或者,从 反应性 对其本身进行了评估 没有主动-被动上下文 就像错误消息中所说的那样。

    使这些事情也具有反应性的一种解决方法是对 可渲染 即 renderUI . 内部 伦德鲁 我们可以对包括对齐在内的整个表渲染进行反应性塑造。(解决方案部分改编自 here .)

    以下是您必须更换的 可渲染 适用于:

    renderUI({
      output$table <- renderTable({
          x <- CO2[1:5, seq_len(isolate(nc())), drop = FALSE]
          x[, 1] <- as.character(x[, 1])
          x[3, 1] <- '<b>Mc1</b>'
          x
      }, align = aln(), sanitize.text.function = function(x) x)
    
      tableOutput("table")
    })
    

    快速解释: 使用 output 变量就像是在一个有光泽的常规环境中进行操作,如果不是在降价的情况下。将由渲染什么 伦德鲁 然后是对 可渲染 我们每次都会从头开始重新创建。

    注: 我使用了 isolate 内部 可渲染 . 原因如下: 可渲染 是反应性的,如果 nc() 变化。但这可能发生在周围 伦德鲁 对更改作出反应。你看,在这个中间步骤中, 可渲染 尝试绘制 data.frame 具有不同的列计数,但 align 还是以前的那个。将引发错误,因为它们不匹配。隔离内部 nc() 停止内部 可渲染 来自更新。但没关系,因为外面 伦德鲁 不管怎样,一旦轮到更新,就会这样做。