【问题标题】:selectInput box in R/shiny - choices list with same label for multiple valuesR/shiny 中的 selectInput 框 - 多个值具有相同标签的选项列表
【发布时间】:2021-06-06 18:18:50
【问题描述】:

我正在使用 rShiny (shiny_0.9.1) R 版本 3.1.0 (2014-04-10) 和平台:x86_64-w64-mingw32/x64(64 位)开发 Web 应用程序。我在我的 ui 文件中使用 selectInput 方法从数据框中选择两列(“IND1_WATER”、“IND2_WATER”)。 这是工作示例代码:

  selectInput(inputId = "indicators",
                       multiple = TRUE,
                       label = "Select the list of indicators",
                       choices = list("Water stress" = "IND1_WATER",
                                      "Water scarcity" = "IND2_WATER")

但是我想用相同的名称标记两列并使用它们来呈现图表。我尝试了不同的选项,例如 "Water stress" = c("IND1_WATER","IND2_WATER") 或 "Water stress" = colnames(mydf)[6:7] 但它们不起作用。它只取第一个值。关于如何解决这个问题的任何想法?

胡安

【问题讨论】:

  • 您可能在谈论尚未实现的功能:github.com/rstudio/shiny/issues/326
  • 这正是我所需要的。闪亮社区对此有何更新?谢谢
  • 很高兴知道这一点。您可以通过解决该问题来帮助提高其优先级:)

标签: r shiny


【解决方案1】:

每个“选择”只能有一个与之关联的值。如果要为单个选择返回多个值,则必须通过连接所需的值来伪造它。例如

selectInput(inputId = "indicators",
    multiple = TRUE,
    label = "Select the list of indicators",
    choices = list("Water stress" = "IND1_WATER,IND2_WATER")

然后在服务器端

indicators <- strsplit(input$indicators, ",")[[1]]

不管有没有逗号都行。

【讨论】:

  • 感谢 MrFlick 的及时回答,但我不知道如何实现这一点。 strsplit 函数仅适用于字符,但我的指标都是数字类型。如果您有任何其他建议,我将不胜感激。非常感谢。
  • HTML 选择元素中的值始终是字符。所以input$indicators 无论如何都应该是一个角色。在strsplit 之后,如有必要,您可以使用as.numeric。否则,我不明白你的问题。
  • 我的第一个问题是亿辉解决的。第二个问题确实是为单个选择返回多个值。我已将应用程序放在 github 上,因此更容易与您分享。您可以使用 runGitHub('shiny-app', 'Arevaju') 运行应用程序。我的问题在第二个选项卡中,我希望用户能够选择一个 Ind X 并显示 2010、2020 和 2050 的 3 个值。暂时指标过滤器并不能真正起作用,因为它只显示第一个的数据指标 (Ind1)。我真的坚持这一点。非常感谢您的大力支持。
  • 我注意到分享应用时出现问题。这些文件可以在github.com/Arevaju/shiny-app查看。
【解决方案2】:

在 CRAN (&gt;= 0.10.1) 上使用最新版本的 shiny,您可以使用新的 optgroup 功能(请参阅 an example here)。在你的情况下,

selectInput(inputId = "indicators",
            multiple = TRUE,
            label = "Select the list of indicators",
            choices = list("Water stress" = c("IND1_WATER", "IND2_WATER")))

如果你还没有更新你的 R 包,请update.packages(ask = FALSE)

【讨论】:

  • 我试过了,但没有用。事实上,问题出在服务器端。 github.com/Arevaju/shiny-app/blob/master/server.r。在本例中,雷达图应同时显示两个指标 IND1_WATER 和 IND2_WATER。
  • 主要问题是通过接口同时选择两列Ind1和Ind2,然后使用“Passdata2”函数将这两列合并并传递给rCharts显示雷达图这两个指标。谢谢!
  • 我无法运行您的应用程序:我收到错误 Error in normalizePath(directoryPath, mustWork = TRUE) : path[1]="": No such file or directory。我对 rCharts 包不熟悉,建议你问 Ramnath:github.com/ramnathv/rCharts 我只能在可以运行应用程序后调查问题。目前,我完全不清楚你的问题到底是什么。对不起。
  • 它现在应该可以工作了!我注意到 highcharts 库应该全部用小写字母命名,以便在 Linux 中工作!谢谢。
  • @jarevalo 我认为这与您最初提出的问题完全不同。最初input$indicatorsNULLstrsplit() 不能拆分NULL 值。如果您使用我发布的内容作为答案,并适当地处理NULL 情况(当它为 NULL 时您应该怎么做?),我认为我没有回答您最初的问题。如有新问题,请创建新帖子。
【解决方案3】:

这是我最后一个问题的答案。为了让单个选择返回多个值,ui 文件应该是这样的:

  selectInput(inputId = "indicator",
                label = (HTML("<b>Select a list of indicators:</b>")),
                multiple = TRUE,
                selected = 'Water stress',
               choices = list("Water stress" = "Water stress", "Water scarcity" = "Water scarcity" ))

虽然服务器文件应包含一些条件语句,以便能够选择多于一列,但选择了特定值:

passData <- reactive({
    data <- data[data$Country %in% input$country_filter1 & 
                   data$Year %in% input$year,]
    rownames(data) = unique(data$NUTS_CODE)
    if (input$indicator== 'Water stress') {col= 7:9}
    if (input$indicator== 'Water scarcity') {col= 8:9}
    data[,col]
  }) 

我希望它可以帮助其他有类似问题的人。感谢我的同事 Javier Martinez 的宝贵贡献!

【讨论】:

    【解决方案4】:

    将此问题添加为

    indicators <- strsplit(input$indicators, ",")[[1]]
    

    将发出警告:“更长的对象长度不是更短的对象长度的倍数”当与:

    结合使用时
    filter_at(., vars(col1, col2), any_vars(. == indicators))
    

    你必须使用:

    filter_at(., vars(col1, col2), any_vars(. %in% indicators))
    

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 2018-06-14
      • 2015-09-05
      • 1970-01-01
      • 2019-07-13
      • 2017-12-02
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      相关资源
      最近更新 更多