0

私のアプリでは、ユーザーは 3 つの要素 (年、日付、測点) を入力し、クリックしactionButtonて温度プロットを取得します。ボタンがないとアプリは遅くなり、入力が変更されるたびに新しいプロットが作成されました。ボタンを追加しましたが、これを適切に行ったかどうかはわかりません。入力ごとにバラバラeventReactiveにしたのですが、まとめられないのでしょうか?いくつか試してみましたが、わかりませんでした。

この男の「読み込み中」と「完了」の GIF を実装しようとしているので、これが必要です (私のアプリは非常に遅いため、何かが起こっていることを人々に安心させる必要があります)。

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

しかし、個別のリアクティブ イベントでは、各ステップで gif が再表示されたり消えたりするため、actionButtonプロセス全体でそれらを維持する必要があります。

編集 T.Holme のおかげで挿入しisolate()ました。しかし、gif を実装しようとする前に、2 番目の部分を調整する必要があり、そこで苦労しています。

EDIT 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)
    })
  })

私のアプリは、選択した種の人口動態を示す 2 番目のプロットを表示します。私の古いコードでは次のように機能しました: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 に答える