簡體   English   中英

R Shiny [.data.frame 中的錯誤:選擇了未定義的列

[英]R Shiny Error in [.data.frame: undefined columns selected

我正在嘗試在 Shiny 中構建簡單的 csv 上傳示例。 上傳 csv 文件,將 header 存儲在 Select 輸入控制並顯示表 Z78E6221F6393D1356DZ681 中的每一列。 一旦我上傳任何 csv 文件,它就會顯示以下錯誤

[.data.frame 中的錯誤:選擇了未定義的列

但是,如果再次上傳相同的 csv 文件,則不會顯示錯誤。

    library(shiny)
    library(shinyjs)

    ui <- pageWithSidebar(
           headerPanel("CSV Upload test"),
             sidebarPanel(
               fileInput("datafile", h5("Choose CSV file:"),
                            accept=c('text/csv', 'text/comma-separated-values,text/plain')),
                            htmlOutput("varselect", inline=TRUE),
               selectInput("vars", label = h5("Select a variable:"), choice=NULL, selected = NULL, 
                                                multiple=FALSE, selectize=TRUE),
               actionButton("unselect", label="Clear All"),
            br()  
            ),
          mainPanel(dataTableOutput("table")))

    server <- function(session,input, output) {  
         
         Dataset <- reactive({    
         infile <- input$datafile
         if (is.null(infile)) {
         return(NULL)
         }
         read.csv(infile$datapath)
         })

       observe({
       if (identical(Dataset(), '') || identical(Dataset(),data.frame())) 
       return(NULL)
       updateSelectInput(session, inputId="vars",
                  choices=names(Dataset()), selected=NULL)
       })

      observe({
      if (input$unselect > 0) {
      if (identical(Dataset(), '') || identical(Dataset(),data.frame())) 
      return(NULL)
  
      updateSelectInput(session, inputId="vars",
                    choices=names(Dataset()), selected=NULL)
     }
    })

   output$table <- renderDataTable({
   if (is.null(input$vars) || length(input$vars)==0) return(NULL)
       validate(need(Dataset(), "Awaiting data"))
   return(Dataset()[,input$vars,drop=FALSE])
   })
   }

 shinyApp(ui, server)

同樣在 selectInput function if I change option for multiple = TRUE 中,csv 上傳開頭的此錯誤不會顯示。

 selectInput("vars", label = h5("Select a variable:"), choice=NULL, selected = NULL, 
            multiple=FALSE, selectize=TRUE)    

感謝有人可以幫助我了解這里發生了什么。 有什么解決辦法嗎?

以下消除了您的錯誤:

  output$table <- renderDataTable({
    validate(need(Dataset(), "Awaiting data"))
    if (is.null(Dataset()) || is.null(input$vars) || length(input$vars)==0) {
      return(NULL)
    } else{
      selected_vars <- names(Dataset()) %in% input$vars
      Dataset()[,selected_vars,drop=FALSE]
    }
  })

除了@YBS的anwser,用req更干凈一點

library(shiny)
library(shinyjs)

ui <- pageWithSidebar(
  headerPanel("CSV Upload test"),
  sidebarPanel(
    fileInput("datafile", h5("Choose CSV file:"),
              accept=c('text/csv', 'text/comma-separated-values,text/plain')),
    htmlOutput("varselect", inline=TRUE),
    selectInput("vars", label = h5("Select a variable:"), choice=NULL, selected = NULL, 
                multiple=FALSE, selectize=TRUE),
    actionButton("unselect", label="Clear All"),
    br()  
  ),
  mainPanel(dataTableOutput("table")))

server <- function(session,input, output) {  
  
  Dataset <- reactive({
    req(input$datafile)
    infile <- input$datafile
    try( {
      read.csv(infile$datapath)
    })
  })
  
  observeEvent(Dataset(), {
    updateSelectInput(session, inputId="vars",
                      choices=names(Dataset()), selected=NULL)
    
  })
  
  observeEvent(input$unselect, {
    req(Dataset())
    updateSelectInput(session, inputId="vars",
                     choices=names(Dataset()), selected=NULL)
  })
  
  output$table <- renderDataTable({
    validate( need(Dataset(), "Awaiting data")
            , need(input$vars, "Select variable")
            )
    return(Dataset()[,input$vars,drop=FALSE])
  })
}

shinyApp(ui, server)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM