我一直都明白 Shiny
conditionalPanel()
不能与另一个条件面板共享同一个反应对象。我的解决方案是一遍又一遍地构建基本相同的反应对象,每个反应对象都标记到每个条件面板。但这很麻烦。是否有一种有效的解决方法,可以在多个条件面板之间共享相同的反应目标?
我相信 Stack Overflow 中有一些相关的问题,但示例非常繁琐,难以破译。我在这里提供一个非常简单明了的例子。
我展示了下面的示例代码,我在其中注释掉了其中一个条件面板(第二个面板)的共享标题,以便用户可以有条件地渲染绘图或表格。如果我在第二个条件面板中取消注释该行,则绘图和表格都不会呈现。除了我在此示例中创建两个标头对象之外,还有人有解决方案吗?在实际的代码中,这将有两个以上的标头,所以你可以明白为什么我想分享那个响应式标头。
library(shiny)
DF <- data.frame(row.names = LETTERS[1:5], X = c(1:5), Y = c(6:10))
ui <- fluidPage(
selectInput("view","View options:",c("Plot","Table")),
conditionalPanel(
condition = "input.view == 'Plot'",
textOutput("header"),
plotOutput("plot")
),
conditionalPanel(
condition = "input.view == 'Table'",
# textOutput("header"),
tableOutput("table")
)
)
server <- function(input, output, session) {
output$header <-renderText({paste(input$view,"has been selected")})
output$plot <- renderPlot({plot(DF$X,DF$Y)})
output$table <- renderTable(DF)
}
shinyApp(ui, server)
考虑到 Limey 的评论,它现在有效:
library(shiny)
DF <- data.frame(row.names = LETTERS[1:5], X = c(1:5), Y = c(6:10))
ui <- fluidPage(
selectInput("view","View options:",c("Plot","Table")),
textOutput("header"),
conditionalPanel(
condition = "input.view == 'Plot'",
plotOutput("plot")
),
conditionalPanel(
condition = "input.view == 'Table'",
tableOutput("table")
)
)
server <- function(input, output, session) {
output$header <-renderText({paste(input$view,"has been selected")})
output$plot <- renderPlot({plot(DF$X,DF$Y)})
output$table <- renderTable(DF)
}
shinyApp(ui, server)