我正在创建一个带有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?
谢谢
答案 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