【问题标题】:Shiny: Observe() on reactiveValues()闪亮:在反应值()上观察()
【发布时间】:2020-11-09 21:15:53
【问题描述】:

我围绕reactiveValues() 变量转储创建了一个闪亮的应用程序。使用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() 在反应式上下文之外工作,但我不确定这是否是实现这种逻辑的正确方法。

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

【问题讨论】:

    标签: r shiny reactive


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-26
        • 2019-03-12
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 2015-10-01
        • 2021-01-04
        • 2021-11-07
        相关资源
        最近更新 更多