[.data.frame 中的 R 闪亮错误:选择了未定义的列
R Shiny Error in [.data.frame: undefined columns selected
我正在尝试在 Shiny 中构建简单的 csv 上传示例。上传 csv 文件,将 header 存储在 Select 输入控件中,并在 table 输出中显示每一列。一旦我上传任何 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 函数中,如果我为 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的回答,用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)
我正在尝试在 Shiny 中构建简单的 csv 上传示例。上传 csv 文件,将 header 存储在 Select 输入控件中,并在 table 输出中显示每一列。一旦我上传任何 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 函数中,如果我为 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的回答,用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)