更新reactiveValues
这个答案是在/observeEvent
模型出现之前发布的shiny
。我认为@MikeWise 的答案是更好的方法。
在玩了一些之后,这就是我想出的。ui.r 没什么特别的
用户界面
library(shiny)
ui <- shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
selectizeInput(inputId="XX", label="Choose a letter",choices=letters[1:5])
),
mainPanel(
textOutput("Current"),
textOutput("old")
)
)
))
"Current"
将显示当前选择并"old"
显示先前选择。
在server.r
我使用了三个关键功能reactiveValues
:isolate
和session$onFlush
。
服务器.r
library(shiny)
server <- function(input, output,session) {
Values<-reactiveValues(old="Start")
session$onFlush(once=FALSE, function(){
isolate({ Values$old<-input$XX })
})
output$Current <- renderText({paste("Current:",input$XX)})
output$old <- renderText({ paste("Old:",Values$old) })
}
像这样的server.r
作品。
首先,Values$old
是使用reactiveValues
函数创建的。我给了它“开始”的值,以明确加载时发生了什么。
然后我添加了一个session$onFlush
功能。请注意,我session
的函数中有一个参数server
。这将在每次闪亮刷新反应系统时运行 - 例如当selectizeInput
用户更改时。重要的是它会在input$XX
获得新值之前运行 - 因此该值已更改为 atselectizeInput
而不是 at XX
。
然后在I 内部分配tosession$onFlush
的传出值。这是在内部完成的,因为这将防止使用新值更新时出现任何问题。然后我可以在函数中使用和。XX
Values$old
isolate()
input$XX
input$XX
Values$old
renderText()