R shiny:selectInput() 在 multiple=TRUE 时不反映变量选择



我写了一个小的闪亮应用程序来测试用户上传数据的变量选择功能。这是我的代码:

ui.R

shinyUI(pageWithSidebar(
  headerPanel("CSV Data explorer"),
  sidebarPanel(
    fileInput('datafile', 'Choose CSV file',
          accept=c('text/csv', 'text/comma-separated-values,text/plain')),
    htmlOutput("varselect", inline=TRUE),
    selectInput("vars", "Select a variable:",choices=htmlOutput("varselect")),
    br()  
  ),
  mainPanel(
    dataTableOutput("table")
  )
))

服务器.R

shinyServer(function(session,input, output) {
  Dataset <- reactive({
  infile <- input$datafile
  if (is.null(infile)) {
    return(NULL)
  }
  read.csv(infile$datapath)
  })
  observe({
  output$varselect <- renderUI({
    if (identical(Dataset(), '') || identical(Dataset(),data.frame())) return(NULL)
      updateSelectInput(session, inputId="vars", label="Variables to use:",
                    choices=names(Dataset()), selected=names(Dataset()))
    })
  })
  output$table <- renderDataTable({
  if (is.null(input$vars) || length(input$vars)==0) return(NULL)
  return(Dataset()[,input$vars,drop=FALSE])
  })
})

如果你继续在你的任何csv文件上测试它,你会看到2个问题:1.selectInput()框上方显示的所有变量名称都很混乱,这是由以下代码引起的:

htmlOutput("varselect",inline=TRUE)

但如果我删除这行代码,我的selectInput将消失。

  1. 如果我更改为

selectInput("vars","Select a variable:",choices=htmlOutput("varselect"),multiple=TRUE),

并尝试点击多个选项,这不会反映在主面板的表格中。

我已经为这个问题挣扎了一段时间。有人能帮忙吗!提前数百万感谢!

谨致问候,mindy

我认为您的工作过于复杂。简而言之,您只需要一个uiOutput来代替ui中的htmlOutputselectInput语句。R。似乎也不需要updateSelectInputobserve函数。您可以将代码简化为以下内容,多选似乎可以正常工作:

ui.R

shinyUI(pageWithSidebar(
  headerPanel("CSV Data explorer"),
  sidebarPanel(
    fileInput('datafile', 'Choose CSV file',
              accept=c('text/csv', 'text/comma-separated-values,text/plain')),
    uiOutput("varselect"),
    br()  
  ),
  mainPanel(
    dataTableOutput("table")
  )
))

服务器.R

shinyServer(function(session,input, output) {
  Dataset <- reactive({
    infile <- input$datafile
    if (is.null(infile)) {
      return(NULL)
    }
    read.csv(infile$datapath)
  })
  output$varselect <- renderUI({
    if (identical(Dataset(), '') || identical(Dataset(),data.frame())) return(NULL)
    cols <- names(Dataset())
    selectInput("vars", "Select a variable:",choices=cols, selected=cols, multiple=T)  
  })
  output$table <- renderDataTable({
    if (is.null(input$vars) || length(input$vars)==0) return(NULL)
    return(head(Dataset()[,input$vars,drop=FALSE]))
  })
})

最新更新