闪亮:在 reactiveValues() 上观察 ()

Shiny: Observe() on reactiveValues()

我围绕 reactiveValues() 变量转储创建了一个 Shiny App。使用 observeEvent() 观察一个简单的操作按钮,我使用自定义函数填充这些值。此外,我正在尝试观察其中一个 (Query$A) 以更新另一个输入元素。

shinyServer(function(input, output, session) {

    Query <- reactiveValues(A=NULL, B=NULL)

    observeEvent(input$SomeActionButton,{
        Query$A <- SomeCustomFunction(url)
        Query$B <- SomeOtherFunction(sqlScheme)
        updateSelectizeInput(session, "QueryScheme", choices =  Query$B)
    })

    observe(Query$A, {
        QueryNames <- sort(names(Query$B))
        updateSelectizeInput(session, "SortedSchemes", choices = QueryNames)
    })

})

这可能不会让一些更高级的 Shiny 开发人员感到惊讶,

Error in .getReactiveEnvironment()$currentContext() : 
  Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)

我想我明白为什么这行不通了,问题是接下来该怎么办?我发现 isolate() 在反应上下文之外工作,但我不确定这是否是实现这种逻辑的正确方法。

我最终尝试根据不需要操作按钮的观察者进行多个输入。这是可能的还是我在这里滥用了这个概念?

我认为你的意思是使用 observeEvent 而不是 observe

从您的观察语句中删除 Query$A。 observe 语句将根据其中包含的依赖项来确定何时 运行。

使用您的应用的最小工作示例:

library(shiny)

ui <- fluidPage(
    
    selectInput("QueryScheme",            "QueryScheme",           choices = sample(1:10, 3)),
    selectInput("SortedSchemes",          "SortedSchemes",         choices = sample(1:10, 3)),
    actionButton("SomeActionButton",      "SomeActionButton"),
    actionButton("UnrelatedActionButton", "UnrelatedActionButton")
    
)

server <- function(input, output, session) {
    
    #Reactive Values
    Query <- reactiveValues(A = NULL, B = NULL)
    
    #Observe Some Action Button (runs once when button pressed)
    observeEvent(input$SomeActionButton,{
        Query$A <- sample(1:10, 3)
        Query$B <- sample(1:10, 3)
        updateSelectizeInput(session, "QueryScheme", choices =  Query$B)
    })

    #Observe reactive value Query$B (runs once when Query$B changes)
    observe({
        showNotification("Query$B has changed, running Observe Function")
        QueryNames <- sort(Query$B)
        updateSelectizeInput(session, "SortedSchemes", choices = QueryNames)
    })
    
    #Observe Unrelated Action Button (runs once when button pressed) note that it won't trigger the above observe function
    observeEvent(input$UnrelatedActionButton,{
        showNotification("UnrelatedActionButton Pressed")
    })
    
}

shinyApp(ui, server)