我已经围绕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
。