如何将列表放入下拉菜单?

How to put list into dropdownMenu?

我想制作一个通知列表并以编程方式将其放入下拉列表中。 dropdownMenu 有一个 .list 参数,它应该服务于这种机制。我创建了一个列表并尝试将其放入此下拉列表中,但出现了错误。以下是正确的做法吗? 示例取自 r bs4Dash documentary for dropdownMenu,我只是添加了一个列表:

if (interactive()) {
   library(shiny)
   library(bs4Dash)
   library(dplyr)
   
   shinyApp(
      ui = dashboardPage(
         header = dashboardHeader(
            
            rightUi =  tagList(
               dropdownMenu(
                  type = "messages",
                  badgeStatus = "danger",
                  icon = icon("comments"),
                  .list = list(verbatimTextOutput(outputId = "listIris"))
                  ),         
               
               dropdownMenu(
                  type = "messages",
                  badgeStatus = "danger",
                  icon = icon("comments"),
                  messageItem("Message from driver Adrian Baker",
                                       "Customer closed",
                                        time = "5 mins ago"),
                  messageItem("Message from driver Louis Plitz",
                                       "Huge traffic, I'll be late",
                                        time = "8 mins ago")))
            
         ),
         
         sidebar = dashboardSidebar(disable = TRUE),
         controlbar = dashboardControlbar(),
         footer = dashboardFooter(),
         title = "dropdownMenu",
         body = dashboardBody()
      ),
      
          
  server = function(input, output) {
     
         observeEvent(input$triggerAction1, {
            showModal(modalDialog(
               title = "Important message",
               "This is an important message!"
            ))
         })
         
         # df with unique text values
         df <- iris %>% 
            select(Species) %>% 
            group_by(Species) %>% 
            unique()
         
         # create a list
         uniqueList <- as.list(df)
         
         output$listIris <- renderPrint({
            uniqueList
         })          
      }
   )
}

有两种类型的错误:

Error in writeImpl: Text to be written must be a length-one character vector

Error in cat: argument 1 (type 'list')..

编辑: 我根据@Stephane 的解决方案更改了上面的代码。我现在可以生成列表,但不是以正确的形式。当您 运行 上面的代码时,您将看到两个下拉列表(在 header 的右侧):第一个 - 从 .list 生成,第二个 - 手动生成(使用 messageItem ).您可以比较这两个下拉列表——我的目标是以编程方式生成列表,但采用第二个下拉列表的漂亮形式。如何以编程方式将列表元素放入 messageItem 中?以及如何向每个 messageItem 添加唯一的 inputId 以使其表现得像 actionButton (根据说明可能的文档)?

  • verbatimTextOutput 的“id”参数是 outputId:试试 verbatimTextOutput(outputId = "listIris")

  • 根据文档,dropdownMenu.list 参数必须是一个列表:尝试 .list = list(verbatimTextOutput(outputId = "listIris"))

  • renderText用于渲染字符串,这里有一个列表;使用 renderPrint 代替:renderPrint({uniqueList})(没有 print()