mni*_*ist 3 r shiny shiny-reactivity
重置单个无功值只需通过 即可完成reactiveVal(NULL)。然而,怎样才能彻底重置呢reactiveValues()?
虚拟应用程序包含我的一些方法来保留新鲜和干净的反应值,但它们都没有真正做到我希望它们做的事情。另外,观察时似乎有一种奇怪的行为reactiveValues。Trigger除非单击按钮,否则它们在清洁后不会触发反应。当我检查他们的状态时,他们对我来说看起来很好。
library(shiny)
library(magrittr)
# UI ---------------------------------------------------------------------------
ui <- fluidPage(
actionButton("create", "Create"),
actionButton("reset", "Reset"),
actionButton("trigger", "Trigger"),
textOutput("out")
)
# Server -----------------------------------------------------------------------
server <- function(input, output, session) {
vals <- reactiveValues()
ids <- reactiveVal()
display <- reactiveVal()
# insert letter when clicked
observeEvent(input$create, {
id <- as.character(length(ids()))
vals[[id]] <- sample(LETTERS, 1)
ids(c(ids(), id))
})
observeEvent(input$reset, {
# Options to reset reactive Values -------------------------------------
vals <<- reactiveValues()
# vals <- NULL
for(i in names(vals)) vals[[i]] <- NULL # deletes content but not the names
# resetting reactiveVal() is easily done via NULL
ids(NULL)
display(NULL)
})
observe({
if(input$trigger) browser()
text <- reactiveValuesToList(vals) %>% paste(collapse = ", ")
display(text)
})
output$out <- renderText(display())
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
PS:该示例并未完全精简,因为我希望它能够反映我实际的反应链。
显然你不能完全取消reactiveValues
看一眼 :
Shiny:如何使用actionButton初始化空的reactiveValues?
根据这两个问题的答案,作为一种解决方法,可以将列表中的值保存在reactiveValues对象中,使用您的代码,它会是这样的:
library(shiny)
library(magrittr)
# UI ---------------------------------------------------------------------------
ui <- fluidPage(
actionButton("create", "Create"),
actionButton("reset", "Reset"),
actionButton("trigger", "Trigger"),
textOutput("out")
)
# Server -----------------------------------------------------------------------
server <- function(input, output, session) {
# initialize vals with a list
vals <- reactiveValues('foo' = list())
ids <- reactiveVal()
display <- reactiveVal()
observeEvent(input$create, {
id <- as.character(length(ids()))
# add values to the list
vals$foo[[id]] <- sample(LETTERS, 1)
ids(c(ids(), id))
})
observeEvent(input$reset, {
# reset the list
vals$foo <- NULL
ids(NULL)
})
observe({
# if(input$trigger) browser()
text <- reactiveValuesToList(vals) %>% paste(collapse = ", ")
display(text)
})
output$out <- renderText({
text <- vals$foo %>% paste(collapse = ", ")
display(text)
display()
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)