r语言 - Shiny: Observe() on reactiveValues()



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

我最终尝试了一些基于观察者的输入,这些观察者不需要操作按钮。这可能吗?还是我滥用了这里的概念?

从观察语句中删除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)

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

最新更新