[英]isolate conditionalPanel in shiny
我有一個shiny
標簽,用戶可以在其中通過selectInput
選擇多個參數。 選擇之后,用戶單擊一個actionButton
,服務器端將進行大量計算。 根據結果和選擇,應該顯示一個或幾個conditionalPanels
。 問題在於,一旦用戶更改了選擇,顯示的conditionalPanel
就會立即更改。 但是,我希望僅在用戶再次按下actionButton
並更新服務器端的計算之后才能評估條件。 有沒有辦法將conditionalPanel的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
-Button並得到一個點圖。 然后,我想顯示SLength
vs. PLength
,所以我從選擇字段中刪除了SWidth
,同時獲得了兩個直方圖,每個先前的選擇一個。 條件面板會立即對input$variable
的更改作出反應,而服務器腳本中的觀察者仍在等待我按下按鈕。 顯然,這不是用戶期望的行為。 預期的行為是對條件面板條件的評估僅在按下“ Go
按鈕時進行。 有沒有辦法做到這一點?
在服務器端做條件怎么樣?
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(),
plotOutput("oneplot")
# 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({
#Added actionButton dependency here
input$goButton
isolate({
if(length(input$variable)== 1) {
if (is.null(v$summary)) return(NULL)
if (input$variable == "Species") return(NULL)
hist(v$summary)
}
else {
if (is.null(v$summary)) return(NULL)
plot(v$summary)
}
})
})
#output$twoplot <- renderPlot({
#if (is.null(v$summary)) return(NULL)
#plot(v$summary)
#})
}
shinyApp(ui, server)
編輯:通過使用submitButton添加了另一個選項
您還可以使用submitButton()
,並將observeEvent()
附加到input$variable()
。 “包含輸入按鈕的表單不會在輸入發生更改時自動更新其輸出,而是會等到用戶顯式單擊提交按鈕之后。” 提交按鈕
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(),
submitButton("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$variable, {
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.