0

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

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

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

但是随着单独的反应事件,gifs 会随着每一步重新出现和消失,并且它们必须在整个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
      }
  })
4

1 回答 1

1

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

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

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

为了证明这一点,运行以下脚本(编辑以下评论):

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))
于 2016-11-25T19:06:12.543 回答