R shiny:如何更改 reactiveValues 对象中的值
R shiny: how to change values in a reactiveValues object
我正在开发一些具有各种输入的闪亮应用程序。一般来说,我有一个设置,我希望用户按下一个按钮来接受输入值,然后这将创建需要设置的对象。当用户按下动画 sliderInput 对象上的播放按钮时,模拟应该 运行。已创建的对象将在每次迭代时更新。
一个问题是其中一个对象是 reactiveValues 列表。每当用户更改设置并单击 "Accept" 和 运行 时,我希望重新创建整个对象集(擦除早期值)。相反,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))
})
})
}
)
)
我认为这可以满足您的需求:
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
的情况,但我不确定你要用这个做什么,所以我让它成为了。
我正在开发一些具有各种输入的闪亮应用程序。一般来说,我有一个设置,我希望用户按下一个按钮来接受输入值,然后这将创建需要设置的对象。当用户按下动画 sliderInput 对象上的播放按钮时,模拟应该 运行。已创建的对象将在每次迭代时更新。
一个问题是其中一个对象是 reactiveValues 列表。每当用户更改设置并单击 "Accept" 和 运行 时,我希望重新创建整个对象集(擦除早期值)。相反,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))
})
})
}
)
)
我认为这可以满足您的需求:
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
的情况,但我不确定你要用这个做什么,所以我让它成为了。