【问题标题】:isolate conditionalPanel in shiny在闪亮中隔离条件面板
【发布时间】: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)

假设我启动应用程序并选择SLengthSWidth,单击Go-按钮并获得一个点图。然后我想显示SLengthPLength,所以我从选择字段中删除SWidth,同时我得到两个直方图,一个用于之前的选择。条件面板立即对input$variable 的更改做出反应,而服务器脚本中的观察者仍在等待我按下按钮。显然,这不是用户所期望的行为。预期的行为将是条件面板条件的评估仅在按下Go 按钮时发生。有没有办法做到这一点?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    在服务器端做条件怎么样?

        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() 并将observeEvent() 附加到input$variable()。 “包含提交按钮的表单不会在输入更改时自动更新其输出,而是等到用户明确点击提交按钮。” submitButton

    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)
    

    【讨论】:

    • 如果您只有依赖于输入的不同绘图,那效果很好。但是,我可能有一个情节,或者一个表格,或者一个文本,或者一个情节和一个文本在一起(我不想让这个例子太复杂,所以我跳过了那部分)。如果我将renderPlot 与一个条件一起使用,并将renderText 与另一个条件一起使用,并且在这种特定的条件组合下,仅应打印文本,则用户界面仍为绘图保留空间(因此会有一个白色矩形将被占用否则按情节)。所以我不认为我可以在服务器端条件下达到预期的结果。
    猜你喜欢
    • 2017-04-29
    • 2016-04-10
    • 1970-01-01
    • 2021-04-06
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多