tidyverse环境下调用problems()无返回如何定位数据解析问题
问题原因
problems()无返回是因为readr的problems()函数默认无参数调用时,只会返回当前R会话中最近一次执行读表操作的解析问题,你通过source()运行脚本时,stop_for_problems()触发错误直接终止了流程,全局的最近解析缓存没有被正确保留,或是你单独调用problems()时已经执行过其他操作覆盖了缓存记录。
可查阅的资料与排查步骤
1 readr内置帮助文档
- 查阅
?problems的参数说明:problems()支持传入读取生成的tibble作为参数,直接返回该对象对应的解析错误,不需要依赖全局缓存,你可以调整代码直接打印对应数据对象的解析问题:
cor_disc <- read_csv("../data/cor-disc.csv", col_names = TRUE, col_types = list ( site_nbr = col_character(), year = col_integer(), mon = col_integer(), day = col_integer(), hr = col_double(), min = col_double(), cfs = col_integer()) ) # 直接打印当前数据的解析问题 print(problems(cor_disc)) stop_for_problems(cor_disc)
- 查阅
?stop_for_problems的返回值说明:该函数抛出的错误对象本身就携带了所有解析失败的明细,你也可以通过tryCatch捕获错误后直接提取明细。
2 readr官方使用指南
在R控制台运行vignette("readr")打开readr的官方 vignette,重点查看「列类型解析」「解析失败处理」相关章节,常见的解析失败原因包括:
- 手动指定的列类型和文件实际内容不匹配:比如指定为整数的列存在字符串、空值、特殊符号
- CSV文件格式不规范:存在行列数不一致的行、内嵌换行符、未转义的引号
- 文件编码不匹配:readr默认读取UTF-8编码,如果文件是GBK等其他编码会出现内容识别异常
3 调试验证方法
你可以先移除手动指定的col_types参数,让readr自动推断列类型,快速定位是不是列类型指定错误:
# 测试读取,不强制指定列类型 cor_disc_test <- read_csv("../data/cor-disc.csv", col_names = TRUE) # 查看前20条解析错误明细 head(problems(cor_disc_test), 20)
返回结果中会明确标注出错的行号、列号、期望的内容类型、实际读取到的内容,可直接定位问题。
内容的提问来源于stack exchange,提问作者Rich Shepard
相关产品推荐
相关产品推荐

