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

时间:2020-11-09 21:15:53

标签: r shiny reactive

我围绕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()在反应式上下文之外工作,但是我不确定这是否是实现这种逻辑的正确方法。

我最终试图基于不需要操作按钮的观察者提供多个输入。这可能吗?还是我在这里误用了这个概念?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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)