【问题标题】:R shiny: grouping actionButton eventsR闪亮:分组actionButton事件
【发布时间】:2017-04-10 02:40:11
【问题描述】:

在我的应用程序中,用户输入 3 个元素(年、日期、站),单击 actionButton 并获取温度图。 没有按钮,应用程序很慢,每次输入更改都会生成一个新图。所以我添加了按钮,但我不确定我是否正确执行此操作。我为所有输入单独制作了eventReactive,但我不能把它们放在一起吗?我尝试了一些东西,但无法弄清楚。

我需要这个,因为我正在尝试实现这个家伙的“加载”和“完成” gif(我的应用程序太慢了,人们需要放心一些事情正在发生):

https://github.com/daattali/advanced-shiny/tree/master/busy-indicator

但是对于单独的反应事件,gif 会随着每个步骤重新出现和消失,并且它们必须在整个actionButton 过程中保持不变。

编辑 感谢 T.Holme 我插入了isolate()。但在我尝试实现 gif 之前,我必须调整第二部分,我在那里苦苦挣扎。

编辑 2 我刚刚了解到,为了避免在应用程序开始时在 renderPlot 中运行所有内容,您可以使用 req(input$button) 而不是

if(input$button == 0){return(NULL)} 
input$button

if 解决方案呈现了一个空白的白色矩形(绘图将出现的位置),而使用req(),在您单击之前什么都没有发生/出现。认为这也可能对其他人有所帮助。

我更正的代码:

ui <- fluidPage(
  selectInput("jaartal" , choices = 2014:2100, selected = format(Sys.Date(), "%Y")),
  uiOutput("datums")
  selectInput("weerstation", choices = list("ALDENEIK", "ALKEN")),
  actionButton("button", label = "Bereken"),
  plotOutput("plotTemp")
)

server <- function(input, output){
  # datum range
  output$datums <- renderUI({
    dateRangeInput("datums", label = h4("Periode"), 
                   start = paste(input$jaartal, "-01-01", sep = ""),
                   end = paste(input$jaartal, format(Sys.Date(), "%m"),
                               format(Sys.Date(), "%d"), sep = "-"),
                   min = paste(input$jaartal, "-01-01", sep = ""), 
                   max = paste(input$jaartal, "-12-31", sep = ""))
  })

  # plot temperatuur
  output$plotTemp <- renderPlot({
    req(input$button)
    isolate({
      importdata(input$jaartal)
      weerstation <- which(weerstations == input$weerstation)
      temperatuur(input$datums, weerstation)
    })
  })

我的应用显示了第二个图,其中包含所选物种的种群动态。它与我的旧代码一样工作: 1)开始时没有情节。 2) 通过单击按钮,制作温度和人口图。 3)选择另一个物种,情节立即调整,无需按钮。 4)当其他输入(日期、电台)发生变化时,用户必须单击按钮来调整两个图。

目前要求 1)、2) 和 3) 已满足,但 4) 尚未满足。当我改变车站时,情节不动=好,但是当我改变年份或日期时,人口情节调整=不好。有什么想法吗?

output$plotSoort <- renderPlot({
    req(input$button)
    isolate({
      importdata(input$jaartal)
      weerstation <- which(weerstations == input$weerstation)
      temperatuur(input$datums, weerstation)})
      if(input$populatie == "PER"){            
        perenbladvlo(input$datums, weerstation) # 1st species model
      }                                        
      else if(input$populatie == "OOR"){
        oorworm(input$datums, weerstation) # 2nd species model
      }
      else if(input$populatie == "FLU"){
        fluweelmijt(input$datums, weerstation) # 3rd species model
      }
  })

【问题讨论】:

    标签: r shiny action-button


    【解决方案1】:

    您可以将渲染绘图功能更改为以下内容:

      output$plotTemp <- renderPlot({
        input$button
        isolate({
          importdata(inputJaar())
          temperatuur(inputDatum(), inputStation())
        })
      })
    

    isolate 中的代码只会在input$button 的值发生变化时运行。这是反应式编程的关键部分。

    为了演示这一点,运行以下脚本(在下面的 cmets 中编辑):

    library(shiny)
    
    ui <- shinyUI(fluidPage(
      selectInput("jaartal" , label = h4("Jaar"), choices = 2014:2100, selected = format(Sys.Date(), "%Y")),
      actionButton("button", label = "Bereken"),
      plotOutput("plotTemp")
    
    ))
    
    server <- shinyServer(function(input, output){
      # datum range
    
      output$plotTemp <- renderPlot({
        if(input$button == 0){return(NULL)}
    
        input$button
        isolate({
          plot(x = 1:100,y=101:200)
            title(main=input$jaartal)
        })
      })
    })
    
    runApp(shinyApp(ui,server))
    

    【讨论】:

    • 我目前正在尝试您的解决方案。我试过你的最后一个脚本来理解代码,但它不起作用。我没有得到情节(ui 中缺少 plotOutput)。但是当我添加plotOutput("plotTemp") 然后运行它时,在我点击按钮之前,情节已经出现了。还缺什么吗?
    • 我想我误解了你的问题。情节标题只会在您点击按钮时更新。
    • 如果您希望在启动应用程序时没有绘图,请将if(input$button=0){return(NULL)) 放在您的渲染图的开头
    • 做噩梦if(input$button==0){return(NULL)}。太早了!
    • 好的,我按照你的建议做了,效果很好,谢谢!我现在还有一个问题。我的应用程序中有第二个图,显示了一个物种的种群动态。用户通过 selectInput 选择他想看的物种。应用程序启动时不显示图,但单击按钮时会显示所选物种的图。 When another species is selected, the plot should show immediately, without clicking the button because no date or station input has changed.我对那里的订单感到困惑(也将其添加到我的原始帖子中+代码)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2015-07-09
    • 1970-01-01
    • 2023-03-25
    • 2018-10-19
    相关资源
    最近更新 更多