【发布时间】:2015-04-17 12:59:33
【问题描述】:
我有一个shiny 选项卡,用户可以在其中通过selectInput 选择多个参数。选择后,用户点击actionButton,服务器端会进行一系列计算。根据结果和选择,应该显示一个或多个conditionalPanels。问题是一旦用户更改选择,显示的conditionalPanel 会立即更改。但是,我希望仅在用户再次推送actionButton 并且服务器端的计算已更新后才评估条件。有没有办法将conditionalPanel 的条件与actionButton 联系起来?
这是我能想到的最好的 MWE 来捕捉所有细微差别(实际上,这里仍然缺少条件面板对某些服务器结果的依赖性):
library(shiny)
library(plyr)
ui <- fluidPage(
selectInput("variable", "Variable:",
c("SLength" = "Sepal.Length",
"SWidth" = "Sepal.Width",
"PLength" = "Petal.Length",
"PWidth" = "Petal.Width",
"Species" = "Species"),
multiple = TRUE),
br(),
actionButton("goButton", "Go!"),
hr(),
conditionalPanel(condition = "input['variable'].length == 1",
plotOutput("oneplot")),
conditionalPanel(condition = "input['variable'].length == 2",
plotOutput("twoplot"))
)
server <- function(input, output){
v <- reactiveValues(plot.type = NULL)
observeEvent(input$goButton, {
if (is.null(input$variable)) return(NULL)
if ("Species" %in% input$variable & length(input$variable > 1)){
sec.var <- input$variable[which(input$variable != "Species")]
v$summary <- ldply(by(iris[,sec.var], iris$Species, mean))
v$summary[,1] <- as.factor(v$summary[,1])
} else if ("Species" %in% input$variable)
v$summary <- table(iris$Species) else
v$summary <- iris[,input$variable]
})
output$oneplot <- renderPlot({
if (is.null(v$summary)) return(NULL)
if (input$variable == "Species") return(NULL)
hist(v$summary)
})
output$twoplot <- renderPlot({
if (is.null(v$summary)) return(NULL)
plot(v$summary)
})
}
shinyApp(ui, server)
假设我启动应用程序并选择SLength 和SWidth,单击Go-按钮并获得一个点图。然后我想显示SLength 与PLength,所以我从选择字段中删除SWidth,同时我得到两个直方图,一个用于之前的选择。条件面板立即对input$variable 的更改做出反应,而服务器脚本中的观察者仍在等待我按下按钮。显然,这不是用户所期望的行为。预期的行为将是条件面板条件的评估仅在按下Go 按钮时发生。有没有办法做到这一点?
【问题讨论】: