如何仅使用列表名称创建 selectInput? (不显示列表内容)闪亮

Posted

技术标签:

【中文标题】如何仅使用列表名称创建 selectInput? (不显示列表内容)闪亮【英文标题】:How can I create a selectInput only with the names of a list? (without showing the content of the list) Shiny 【发布时间】:2021-07-29 12:12:59 【问题描述】:

我有 3 个向量:

colors = c("blue", "red", "green", "yellow", "white", "black")
numbers = c("1", "2", "3", "4")
things = c("phone", "fridge", "computer", "chair", "table", "notebook", "bag", "jacket")

为了将它们全部放在一个列表中,我将它们加入到一个列表中。

list_options = list("colors" = colors, "numbers" = numbers, "things" = things)

我的主要目标是创建一个闪亮的应用程序,它的 SelectInput 仅包含列表名称(“颜色”、“数字”、“事物”)。但是,如果您单击其中一个选项,您将能够获得列表的值以便以后使用它们。

例如,如果您选择“事物”,我想查看向量内的所有变量(电话、冰箱、计算机...)。

有办法吗?现在,使用我的代码,该应用程序会显示每个向量的名称及其选项,并为您提供您选择的选项。

这就是我希望在应用中看到我的 selectInput 的方式。

但是,正如我所说,我想稍后使用每个向量的内容(在我的示例中,我编写了一个“renderText”)。如果选择“颜色”,您将看到“蓝色、红色、绿色、黄色...”。

这是我的代码:

colors = c("blue", "red", "green", "yellow", "white", "black")
numbers = c("1", "2", "3", "4")
things = c("phone", "fridge", "computer", "chair", "table", "notebook", "bag", "jacket")
    
list_options = list("colors" = colors, "numbers" = numbers, "things" = things)


if (interactive()) 
        
  shinyApp(
    ui = fluidPage(
      selectInput("option", "Options:", list_options),
      textOutput("text")
    ),
    server = function(input, output) 
      output$text <- renderPrint(
        input$option
      )
    
  )

非常感谢,

【问题讨论】:

【参考方案1】:

我不确定是否理解。是你想要的吗:

  shinyApp(
    ui = fluidPage(
      selectInput("option", "Options:", names(list_options)),
      textOutput("text")
    ),
    server = function(input, output) 
      output$text <- renderPrint(
        list_options[[input$option]]
      )
    
  )

【讨论】:

【参考方案2】:

比 Stephane 的回答更复杂:使用 Observe() 和 updateSelectInput()

library(shiny)

values1 <- paste(c(1, 2, 3))
values_list <- list('1' = c(4, 5, 6), '2' = 7:9, '3' = 10:12)

ui <- fluidPage(

    # Application title
    titlePanel("Testing a dynamic dropdown"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            selectInput("value",
                        "Choose value",
                        values1,
                        selected = '1', multiple = F),
            
            selectInput("listed_values",
                        "Choose subvalue",
                        values_list['1'],   # your default starting values
                         multiple = F)
        ),
    
    mainPanel(
       textOutput("text_result")
    )
    
    )
    
)

server <- function(input, output, session) 
    
    
    observe(              # update 2nd dropdown based on first
        updateSelectInput(session, 
                          'listed_values',
                          choices = values_list[input$value],
                          selected = values_list[input$value][1])
    )
    
  
    output$text_result <- renderPrint(       # print selection
        print(paste('You chose', input$listed_values))
    )


shinyApp(ui = ui, server = server)

【讨论】:

我需要像斯蒂芬妮的答案这样更简单的东西,但你的答案绝对是非常完整的!很高兴知道我能够做到这一点!非常感谢。

以上是关于如何仅使用列表名称创建 selectInput? (不显示列表内容)闪亮的主要内容,如果未能解决你的问题,请参考以下文章

如何从 R 中的 selectInput 函数中一次选择所有输入

依赖于另一个 selectInput 的 selectInput

在 Rmarkdown 中使用 Shiny 创建响应式 selectInput - flexdashboard

从 SelectInput (R Shiny) 中的分组选项列表中获取组标签

如何在 selectInput R Shiny 中为一长串选项设置值

Shiny:根据 selectInput 选择动态分配 var 名称