2017-02-12 3 views
3

さまざまな入力を使っていくつかの光沢のあるアプリを開発しています。一般的には、入力値を受け入れるためにボタンを押して、設定する必要があるオブジェクトを作成する設定があります。シミュレーションは、ユーザーがアニメーションのsliderInputオブジェクトの再生ボタンを押したときに実行されます。作成されたオブジェクトは、繰り返しごとに更新されます。R shiny:reactiveValuesオブジェクトの値を変更する方法

1つの問題は、オブジェクトの1つがreactiveValuesリストであることです。ユーザーが設定を変更して「同意する」をクリックして実行するたびに、オブジェクト全体を再作成(初期値の消去)したいと思います。代わりに、reactiveValuesリスト内のオブジェクトは上書きされませんが、毎回次の設定で拡張されています。したがって、各オブジェクトスロットは実際には複数のオブジェクトを保持します。

これを確認するには、反復の最大値を値に設定し、受け入れを押してから値を変更して再度受け入れてから、再生をクリックしてみてください。あなたはそれが異なった長さのreactiveValuesオブジェクトをプリントアウトするのを見るでしょう。

rm()のようないくつかの試みを試みて、reactiveValuesを削除しようとしました。また、私はここで解決策を試しましたが(shiny: How to update a reactiveValues object?)、どちらもうまくいきませんでした。

library(shiny) 

iter_test <- shinyApp(

ui=shinyUI(fluidPage(
    titlePanel("title panel"), 

    sidebarLayout(position = "left", 
          sidebarPanel("Simulation parameters",         
           sliderInput("iter","Progress of simulation",value=1, min=1, max=30, round=TRUE, step=1, 
           animate=animationOptions(interval=1, loop=FALSE)), 
           actionButton('run',"Accept settings, press play above"), 
           sliderInput('max_iter','Maximum number of iterations',value=20, min=1, max=30, round=TRUE, step=1) 
          ), 
       mainPanel( plotOutput("plots")) 
       )#end of layout 
) 
)#end of UI definition 
, 

server=shinyServer(function(input, output, session) 
{ 

    observeEvent(input$run, { 
     #only set up simulation objects if accept is clicked 

    updateSliderInput(session, "iter", label="Progress of simulation", value=1, min=1, max=input$max_iter, step=1) 
    #try(rm(params)) 
    #set up objects needed for simulation 
    params <- reactiveValues(tmp=rep(1, input$max_iter)) 

    #when the play button is pressed, the following loop should trigger.  

    observeEvent(input$iter, { 
      print(length(params$tmp)) 

    }) 
}) 
} 
) 
) 
+0

私はあなたと一緒に働くことができると思うが、私は本当にあなたがこれで行くのか分からないので、完全にはわからない。 –

答えて

2

私はこれが何をしたいあなたを取得思う:

library(shiny) 

iter_test <- shinyApp(

    ui=shinyUI(fluidPage(
    titlePanel("title panel"), 

    sidebarLayout(position = "left", 
        sidebarPanel("Simulation parameters",         
           sliderInput("iter","Progress of simulation",value=1, min=1, max=30, round=TRUE, step=1, 
              animate=animationOptions(interval=1, loop=FALSE)), 
           actionButton('run',"Accept settings, press play above"), 
           sliderInput('max_iter','Maximum number of iterations',value=20, min=1, max=30, round=TRUE, step=1) 
       ), 
        mainPanel( plotOutput("plots")) 
    )#end of layout 
)),#end of UI definition 
    server=shinyServer(function(input, output, session) 
    { 
    params <- reactiveValues(tmp=NULL) 

    observeEvent(input$run, { 
     req(input$run)   
     updateSliderInput(session, "iter", label="Progress of simulation", value=1, min=1, max=input$max_iter, step=1) 
     #try(rm(params)) 
     #set up objects needed for simulation 
     params$tmp =rep(1, input$max_iter) 
    })   
    #when the play button is pressed, the following loop should trigger.  
    observeEvent(input$iter, { 
     req(input$iter) 
     print(length(params$tmp)) 
    }) 
    }) 
) 

は、この降伏:私は20に設定以上で

enter image description here

は、その後、6に設定し、それを実行しましたそれをもう一度走らせた。

  • observeEventのネスティングを削除ループの外param$tmpを初期化:それは私が行った変更があっ20と6

    を交互ただろう前に、それはもはや値を繰り返している見ることができませんコール。

私は一種のあなたがinput$run場合はこちらeventReactiveを使用しなければならないと思うが、私はあなたがこれを行っているところは本当にわからないので、私はそれができます。

+0

こんにちはマイクは入力していただきありがとうございます。私はあなたが正しいと思う、observeEventの中のparamsを持っていることによって、私が実行をクリックする度に実行されていた。これは私が期待したものではない。私はオブジェクトが毎回上書きされることを期待しました。あなたの質問に答えるために、最初のobserveEventをeventReactiveに置き換えようとしましたが、paramsの値が設定されていないため動作しません。私はobserveEventが反作用値に反応して一連のアクションを実行するのに対し、eventReactiveは計算を行い、値を返すと考えられていると思います。 –

+0

また、2番目のobserveEventの先頭にreq(input $ run)を追加すると問題が解決すると思います。何も初期化していないと(inpu $ run)結果のプロットや出力を繰り返し実行したくないからです。 –

+0

これは受け入れられる答えですか? –

関連する問題