【问题标题】:R shiny: how to change values in a reactiveValues objectR闪亮:如何更改reactiveValues对象中的值
【发布时间】:2017-06-30 04:55:29
【问题描述】:

我正在开发一些具有各种输入的闪亮应用。一般来说,我有一个设置,我希望用户按下按钮来接受输入值,然后创建需要设置的对象。当用户按下动画 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))

   })
 }) 
}
)
)

【问题讨论】:

  • 我想我得到了一些你可以使用的东西,但我不完全确定,因为我真的不知道你会去哪里。

标签: r shiny shiny-reactivity


【解决方案1】:

我认为这会让你得到你想要的:

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,运行它,然后设置为 6,然后再次运行。您可以看到它不再重复这些值,而是在 20 和 6 交替之前。

我所做的更改是:

  • 在循环外初始化param$tmp
  • 删除了observeEvent 调用的嵌套。

我有点认为你应该在这里使用eventReactive 来处理input$run 的情况,但我不太确定你会用这个去哪里,所以我就这样吧。

【讨论】:

  • 嗨,迈克,感谢您的意见。我想你是对的,通过像我一样在 observeEvent 中设置参数,每次单击运行时它都会运行,这不是我所期望的。我预计这些对象每次都会被覆盖。为了回答您的问题,我尝试将第一个 observeEvent 替换为 eventReactive 但它不起作用,因为它没有设置参数中的值。我相信 observeEvent 用于对响应值执行一系列操作,而 eventReactive 应该进行计算并返回一个值。
  • 另外我认为在第二个 observeEvent 的开头添加 req(input$run) 可以解决问题,因为如果你没有初始化任何东西, (inpu$run) 我不想要任何结果图或运行迭代的输出。
  • 你能接受它,也许也赞成它吗?正在制作一些徽章...
  • 只有一件事。我意识到我认为嵌套的 observeEvents 是必要的,因为在第一个中我需要创建其他对象(非反应性),当我迭代时应该可以在第二个循环中访问这些对象。如果它们没有嵌套显然无法访问。
  • 您可以将它们放入与列表元素相同的反应值中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2013-06-25
  • 2020-12-22
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
相关资源
最近更新 更多