在 shiny 中传递 URL 参数时,如何避免将所有内容包装在 observeEvent() 中?

How to avoid wrapping everything in observeEvent() when passing URL parameters in shiny?

我知道使用类似这样的代码:

library(shiny)

ui <- fluidPage(
    mainPanel(
        textOutput("Query_String")
    )
)

server <- function(input, output, session) {
    observeEvent(session$clientData$url_search,{
        Query <- session$clientData$url_search
        output$Query_String <- renderText(Query)
        # Long list of operations dependant on the parameters passed in the URL
    })
}

shinyApp(ui = ui, server = server)

可以让我通过 URL 查询将参数读入我闪亮的应用程序。然而,似乎我基本上必须将我的整个服务器内容包装到一个大的 observe() 或 observeEvent() 中以创建所需的反应上下文。 有什么办法可以避免这种情况吗?

为了避免在仅更改一个项目时重新计算所有内容,人们希望创建多个单独的观察而不是一个大观察。应该在函数中重构长代码,例如process_query 保持服务器功能小,允许读取整体结构。重要的中间结果可以重构为它们自己的反应值(此处 query)。 output$Query_String 不需要嵌套在另一个反应上下文中。

process_query <- function(url) {
  # many steps to process the url
  return(url)
}

server <- function(input, output, session) {
  query <- reactive(process_query(session$clientData$url_search))
  output$Query_String <- renderText(query())
}