传递反应数据作为 updateSelectizeInput 的选择

Passing reactive data as choices for updateSelectizeInput

我正在尝试将反应数据传递给 updateSelectizeInput,但出现以下错误:

.getReactiveEnvironment()$currentContext() 错误: 没有活动的反应上下文不允许操作。 (你试图做一些只能从反应式表达式或观察者内部完成的事情。)

我的代码如下:

ui.R

 library(shiny)


  ui_panel <- 
  tabPanel("Text Input Test",
          sidebarLayout(
           sidebarPanel( 


           selectizeInput('Organisations', label = "Organisation Search", 
   choices = NULL, options = list(
             placeholder = 'Type the organisation name', maxOptions = 10, 
   maxItems = 1, searchConjunction = 'and')),
           tags$style(type="text/css",
                      ".selectize-input::after{visibility:hidden;};"
                      ),


           br(),
           selectInput(
             inputId="selectData",
             label=" ",
             choices=c("Universities", "Hospitals")
           ),

           br()
         ),
         mainPanel(
           tabsetPanel(

             tabPanel("output of Organisation search 
 details",htmlOutput("orgsearchdetails"))

           )
         )
       ))


ui <- shinyUI(navbarPage(" ",ui_panel))

server.R

   library(shiny)


  shinyServer(
   function(input, output, session) {



    orgdata <- reactive({if(input$selectData=='Universities'){
    orgdata <- read.csv("universities.csv")
   }else if (input$selectData=='Hospitals'){ 
    orgdata <- read.csv("hospitals.csv")
    }
    orgdata
   })




    updateSelectizeInput(session, 'Organisations', choices = 
   as.character(unique(
     orgdata()$name)), server = TRUE)




  output$orgsearchdetails <-renderUI({ 


    })


  session$onSessionEnded(function() { dbDisconnect(con) })
  })

有什么方法可以将 selectInput 的反应性传递给 updateSelectizeInput 吗?

我选择 updateSelectizeInput 而不是反应式 selectInput,以避免在应用程序启动时填充字段。

非常欢迎任何帮助或见解。提前谢谢你。

我算不上什么光鲜的专家,但从我一直在构建的仪表板来看,这就是我会做的。我会创建一个名为 selectedDatareactiveValues 变量。然后在我的 observeEvent 中,我将提取 csv 并更新 selectedData。我选择在我的应用程序中使用 reactiveValues 的原因是它们可以是有状态的,而不是总是对某些输入做出反应,而且我可以在应用程序的其他需要相同信息的区域调用它们。至于使用 observeEvent,这很简单,因为您可以将 updateSelectizeInput 包裹在观察者中。

shinyServer(
  function(input, output, session) {
    # init reactiveValues
    selectedData <- reactiveValues()

    observeEvent(input$selectData, {
      if (input$selectData == "Universities") {
        selectedData$orgdata <- read.csv("universities.csv")
      } else if (input$selectData == "Hospitals") {
        selectedData$orgdata <- read.csv("hospitals.csv")
      }

      updateSelectizeInput(session, "Organisations",
                           choices = as.character(unique(selectedData$orgdata$name)),
                           server = TRUE)
    })

    ... # rest of your code

  }
)