R shiny:如何更改reactiveValues对象中的值

时间:2017-02-12 01:11:00

标签: r shiny shiny-reactivity

我正在开发一些带有各种输入的闪亮应用程序。一般来说,我有一个设置,我希望用户按下按钮接受输入值,然后创建需要设置的对象。当用户按下动画sliderInput对象上的播放按钮时,应运行模拟。已创建的对象将在每次迭代时更新。

一个问题是其中一个对象是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))

   })
 }) 
}
)
)

1 个答案:

答案 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))
    })
  })
)

产生这个:

enter image description here

在上面我设置为20,运行它,然后设置为6,然后再次运行它。你可以看到它不再重复这些值,之后它会交替出现20和6。

我所做的改变是:

  • 在循环之外初始化param$tmp
  • 删除了observeEvent来电的嵌套。

我觉得你应该在这里使用eventReactive作为input$run案例,但我不确定你要去哪里,所以我让它成为。