渲染之前,不评估renderUI

时间:2019-08-15 20:08:40

标签: r shiny

我正在创建一个带有selectInput的闪亮应用程序,该输入动态地使用通过renderUI创建的反应函数来填充。 selectInput在单独的“配置”选项卡面板中。 我注意到运行该应用程序后,input $ id值将保持为NULL,直到我单击uiOutput()所在的tabPanel为止。然后,在渲染之后,为输入$ id分配“选定”值。

我尝试在需要的地方使用req(input $ id),但没有用。如果我尝试在调试控制台中运行req(input $ id),则返回的错误只是“ Error:”。我也尝试过Shinydashboard,但行为却相同。

我创建了一个最小的可复制示例。 tabPanel“ A”中的textOutput应该显示selectInput的选择。但是直到您对第二个tabPanel满意为止,它什么也不显示。

library(shiny)

ui <- fluidPage(
  tabsetPanel(
    tabPanel("one", textOutput('text')),
    tabPanel("two",
             uiOutput('select'))
  )
)

server <- function(input, output, session) {
  c <- reactive({
    list("A", "B", "C")
  })

  output$select <- renderUI({
    selectInput(
      inputId = "choice",
      label = "Select input",
      choices = c(),
      selected = 1
    )
  })

  output$text <- renderText(
    input$choice
  )
}

shinyApp(ui, server)

如果我直接将selectInput放置在第二个tabPanel中(没有renderUI),则从应用程序开始就立即初始化input $ choice

例如

library(shiny)

ui <- fluidPage(
  tabsetPanel(
    tabPanel("one", textOutput('text')),
    tabPanel("two",
             selectInput(
               inputId = "choice",
               label = "Select input",
               choices = c("A", "B", "C"),
               selected = 1
             ))
  )
)

server <- function(input, output, session) {

  output$text <- renderText({
    input$choice
  })
}

shinyApp(ui, server)

有什么方法可以“初始化” renderUI元素而不必加载其tabPanel?

谢谢

1 个答案:

答案 0 :(得分:1)

这是因为光泽中的延迟加载。

看看RStudios article on reactivity

  

但是,您必须告诉R运行这种表达,因为R使用一种称为懒惰求值的执行方式。换句话说,R在强制执行之前不会执行表达式。

因此,您必须强制ncol = 3 # user input nrow = 10 # your configuration x = 1:6 # make the data frame as.data.frame(matrix(sample(x, size = ncol * nrow, replace = TRUE), ncol = ncol)) 进行评估。这意味着您的用户为renderUI输入有效的唯一方法是使用textOutput提供默认值,该默认值在呈现reactive时立即更新。

在这里,我添加了input$choice用于代码中的反应变量reactiveValues

d