You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的空值处理逻辑一致,有两种方案:

  1. 给read.csv添加na.strings = ""参数,明确指定将空字符串识别为NA:
p1 <- read.csv(inFile$datapath, header = TRUE, sep = ",", na.strings = "")
  1. 直接在上传逻辑中使用read_csv替代read.csv,保持读取逻辑统一:
p1 <- read_csv(inFile$datapath)

内容的提问来源于stack exchange,提问作者firmo23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:20:21