R 如何重置反应值?

R 如何重置反应值?,r,shiny,shiny-reactivity,R,Shiny,Shiny Reactivity,只需通过reactiveVal(NULL)重置单个无功值即可。但是,如何完全重置reactiveValues() 虚拟应用程序包含我的一些方法来保持新鲜和干净的反应值,但没有一个真正做到我希望他们做到的。此外,在观察反应值时,似乎有一种奇怪的行为。除非单击触发器按钮,否则清洁后不会触发反应性。当我检查他们的状态时,他们看起来很好 library(shiny) library(magrittr) # UI ---------------------------------------------

只需通过
reactiveVal(NULL)
重置单个无功值即可。但是,如何完全重置
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) {

    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)
库(闪亮)
图书馆(magrittr)
#用户界面---------------------------------------------------------------------------

ui显然,您不能完全取消反应值

看看:

根据这两个问题中的答案,作为一种解决方法,您可以将值保存在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)
库(闪亮)
图书馆(magrittr)
#用户界面---------------------------------------------------------------------------

ui我猜这里的“问题”是重置
反应值
对象不会触发任何反应,因为:
注意,从反应值对象获取的值是反应值,但反应值对象本身不是。
(请参见
?反应值
)。相应地,
VAL
发生了变化,但是观察者输入的
display()
“不在乎”,因为变化不是反应性的,
NULL
。啊,好吧,这是有意义的!谢谢你给我指点这家酒店