Shiny应用中read_csv与read.csv的NA值显示差异问题
为何read_csv与read.csv读取同一CSV文件时空值表现不同?
在Shiny应用场景中,直接使用read_csv导入CSV文件时,空值会显示为NA;但通过fileInput上传同一文件后用read.csv读取,对应位置却显示为空单元格。相关代码示例如下:
## app.R ## library(shiny) library(shinydashboard) library(readr) #eventex <- read_csv("eventlog_new_format3011.csv") eventex<-structure(list(case_id = "0003397585", action = "0003397585-B52-R", resource = "B52-R", activity = NA_character_, registration_type = "Stopp", timestamp = structure(NA_real_, tzone = "", class = c("POSIXct", "POSIXt")), `Prod antall` = 3743, product_type_text = "Skyr Luftig tropisk 130gx8", Ordrenummer = "0003397585", lifecycle = NA, `Sum of TotalQty` = 3743, Produkt = "K101322", PurchaseItem = NA_character_, Innsatsfaktor = "K101171", Artikkeltype = "FP", `Alt. Work Center` = NA_character_), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame")) ui <- dashboardPage( dashboardHeader(), dashboardSidebar( fileInput("file1", "", accept = c( "text/csv", "text/comma-separated-values,text/plain", ".csv")), radioButtons("separator","Separator: ",choices = c(";",","), selected=",",inline=TRUE) ), dashboardBody( verbatimTextOutput("pr"), verbatimTextOutput("pr2")), ) server <- function(input, output,session) { View(eventex[74,4]) dataset<-reactive({ inFile <- input$file1 if (is.null(inFile)) return(NULL) p1<-read.csv(inFile$datapath, header = T,sep = ",") }) output$pr<-renderPrint( eventex[74,4] ) output$pr2<-renderPrint( dataset()[74,4] ) } shinyApp(ui, server)
效果截图:
差异原因
两个函数来自不同的R包,默认处理空值的逻辑存在本质区别:
read_csv是readr包的函数,默认会将CSV中的空单元格自动识别为NA,同时它会智能推断列类型,对应生成字符型NA_character_、数值型NA等类型一致的空值标记。read.csv是基础R的函数,默认不会将字符型列的空单元格转为NA,而是保留为空字符串"";仅当列是数值类型时,才会将空值转为NA。这就导致字符型列的空值在输出时显示为空单元格。
解决方法
要让read.csv和read_csv的空值处理逻辑一致,有两种方案:
- 给
read.csv添加na.strings = ""参数,明确指定将空字符串识别为NA:
p1 <- read.csv(inFile$datapath, header = TRUE, sep = ",", na.strings = "")
- 直接在上传逻辑中使用
read_csv替代read.csv,保持读取逻辑统一:
p1 <- read_csv(inFile$datapath)
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

