我围绕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()
在反应式上下文之外工作,但是我不确定这是否是实现这种逻辑的正确方法。
我最终试图基于不需要操作按钮的观察者提供多个输入。这可能吗?还是我在这里误用了这个概念?
答案 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)