我正在开发一些带有各种输入的闪亮应用程序。通常情况下,我需要用户按下按钮以接受输入值,这将创建需要设置的对象。当用户按下动画滑块输入对象上的播放按钮时,模拟应该运行。已创建的对象将在每次迭代时更新。
一个问题是其中一个对象是反应值列表。我希望整个对象集在用户更改设置并单击“接受”并运行它们时被重新创建(擦除先前的值)。相反,反应值列表中的对象没有被覆盖,而是每次都会增加下一个设置。因此,每个对象插槽实际上都保存着多个对象。
为了看到这一点,请尝试将最大迭代设置为一个值,然后点击接受,再更改值并再次点击接受,然后点击播放。你会看到它将打印出不同长度的反应值对象。
我尝试了一些方法,比如rm()尝试删除反应值。我还尝试了这里的解决方案 (shiny: How to update a reactiveValues object?),但它也没有起作用。
一个问题是其中一个对象是反应值列表。我希望整个对象集在用户更改设置并单击“接受”并运行它们时被重新创建(擦除先前的值)。相反,反应值列表中的对象没有被覆盖,而是每次都会增加下一个设置。因此,每个对象插槽实际上都保存着多个对象。
为了看到这一点,请尝试将最大迭代设置为一个值,然后点击接受,再更改值并再次点击接受,然后点击播放。你会看到它将打印出不同长度的反应值对象。
我尝试了一些方法,比如rm()尝试删除反应值。我还尝试了这里的解决方案 (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))
})
})
}
)
)