带输入的 R shinydashboard 可折叠菜单项

R shinydashboard collapsible menuItem with inputs

我正在尝试使用 library(shinydashboard) 实现 fileInput 来为用户提供上传文件的选项(因为它是 here 使用基本闪亮 UI - 请在下面找到示例代码)。

我想将 fileInput 放在 dashboardSidebar 的可扩展 menuItem 中,但不知道它应该放在 shinydashboard 结构中的什么位置。

library(shiny)

ui <- fluidPage(
  titlePanel("Uploading Files"),
  sidebarLayout(
    sidebarPanel(
      fileInput("file1", "Choose CSV File",
                multiple = TRUE,
                accept = c("text/csv",
                           "text/comma-separated-values,text/plain",
                           ".csv")),
      tags$hr(),
      checkboxInput("header", "Header", TRUE),
      radioButtons("sep", "Separator",
                   choices = c(Comma = ",",
                               Semicolon = ";",
                               Tab = "\t"),
                   selected = ","),
      radioButtons("quote", "Quote",
                   choices = c(None = "",
                               "Double Quote" = '"',
                               "Single Quote" = "'"),
                   selected = '"'),
      tags$hr(),
      radioButtons("disp", "Display",
                   choices = c(Head = "head",
                               All = "all"),
                   selected = "head")
    ),
    mainPanel(
      tableOutput("contents")
    )
  )
)

server <- function(input, output) {
  output$contents <- renderTable({
    req(input$file1)
    df <- read.csv(input$file1$datapath,
                   header = input$header,
                   sep = input$sep,
                   quote = input$quote)
    if(input$disp == "head") {
      return(head(df))
    }
    else {
      return(df)
    }
  })
}

shinyApp(ui, server)

编辑: 我稍微清理了代码,使 the difference 有孩子和没有孩子的 menuItem 更清楚 - 参数 expandedNamestartExpanded 只能与有孩子的 menuItem 一起使用,而 tabNameselected 只能与没有孩子的 menuItem 一起使用。

library(shiny)
library(shinydashboard)

ui <- function(req) {
  dashboardPage(
    dashboardHeader(title = "Simple tabs"),
    dashboardSidebar(sidebarMenu(
      id = "sidebarItemSelected",
      menuItem(
        "Childfull menuItem",
        menuItem(
          "Childless menuItem 1",
          tabName = "childlessTab1",
          icon = icon("dashboard"),
          selected = TRUE
        ),
        fileInput("upload", "Upload"),
        bookmarkButton(),
        expandedName = "childfullMenuItem",
        startExpanded = TRUE
      ),
      menuItem(
        "Childless menuItem 2",
        icon = icon("th"),
        tabName = "childlessTab2",
        badgeLabel = "new",
        badgeColor = "green"
      )
    )),
    dashboardBody(tabItems(
      tabItem(tabName = "childlessTab1",
              h2("Dashboard tab content")),
      
      tabItem(tabName = "childlessTab2",
              h2("Widgets tab content"))
    ))
  )
}

server <- function(input, output, session) {
  observe({
    cat(
      paste(
        "\nsidebarItemSelected:",
        input$sidebarItemSelected,
        "\nsidebarItemExpanded:",
        input$sidebarItemExpanded,
        "\nsidebarCollapsed:",
        input$sidebarCollapsed,
        "\n"
      )
    )
  })
}

shinyApp(ui, server, enableBookmarking = "url")

初步回答:

当然 - 这是可能的(this example 的修改版本):

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(title = "Simple tabs"),
  dashboardSidebar(
    sidebarMenu(
      menuItem("Dashboard", fileInput("upload", "Upload"), tabName = "dashboard", icon = icon("dashboard")),
      menuItem("Widgets", icon = icon("th"), tabName = "widgets",
               badgeLabel = "new", badgeColor = "green")
    )
  ),
  dashboardBody(
    tabItems(
      tabItem(tabName = "dashboard",
              h2("Dashboard tab content")
      ),
      
      tabItem(tabName = "widgets",
              h2("Widgets tab content")
      )
    )
  )
)

server <- function(input, output, session) {}

shinyApp(ui, server)