将 R Shiny 反应性 SelectInput 值传递给 selectizeInput

Passing R Shiny reactive SelectInput value to selectizeInput

我的 Shiny 应用程序使用来自鸟类地图集的开放数据,包括 lat/lon 物种坐标。鸟类名称有不同的语言,加上首字母缩写词。

想法是用户首先选择语言(或缩写词)。根据选择,Shiny 呈现一个包含独特鸟类名称的 selectizeInput 列表。 Then, when one species is selected, a leaflet map is generated.

我已经完成了几个闪亮的应用程序,但这次我错过了一些明显的东西。当应用程序启动时,一切都很好。但是,选择新语言时不会重新呈现 selectizeInput 列表。

所有当前代码和一些示例数据都在这里作为 GitHub 要点 https://gist.github.com/tts/924b764e7607db5d0a57

如果有人能指出我的问题,我将不胜感激。

问题是 renderUIbirds 反应块都依赖于 input$lan 输入。

如果你在 birds 块中添加 print(input$birds),你会看到它在 renderUI 有机会更新它们以适应新语言之前使用鸟的名字. data 你然后传递 leaflet 图是空的。

尝试在 birds 表达式中的 input$lan 周围添加 isolate,使其仅依赖于 input$birds:

birds <- reactive({
    if( is.null(input$birds) )
      return()
    data[data[[isolate(input$lan)]] == input$birds, c("lon", "lat", "color")]
  })

当您更改语言时,renderUI 将更改 selectize,这将触发 input$birds 并更新数据。

除了使用 renderUI,您还可以使用(替换 uiOutput)在 ui.R 中创建 selectizeInput

selectizeInput(
        inputId = "birds", 
        label = "Select species",
        multiple  = F,
        choices = unique(data[["englanti"]])
      )

并在您的 server.R 中使用以下方式更新它:

observe({
    updateSelectizeInput(session, 'birds', choices = unique(data[[input$lan]]))
  })