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

为什么使用read_fwf()读取文件的效果和《R Cookbook第二版》描述不一致?

报错原因

这个报错是readr包版本迭代导致的接口不兼容问题:

  • 《R Cookbook 第二版》编写时采用的是1.x版本的readr包,该版本下fwf_empty()函数支持直接传入文件路径作为参数,返回的列宽规则可直接传递给read_fwf()使用
  • 2.0及以上版本的readr包中,fwf_empty()会自动将传入的文件路径转换为临时连接对象用于列宽检测,该连接对象传递给read_fwf()时会触发「file must be a regular file, not a connection」的校验报错
解决方法

推荐两种稳定的解决方案,无需降级包:

方案1:手动指定列宽(兼容性最好)

你使用的示例文件列宽固定,直接手动指定每列宽度即可,完全规避自动检测的兼容问题:

library(readr)
# 依次指定last、first、birth、death四列的宽度
col_rule <- fwf_widths(c(10, 10, 4, 4), col_names = c("last", "first", "birth", "death"))

t1 <- read_fwf("fixed-width.fwf", col_rule)
t2 <- read_fwf("fixed-width.txt", col_rule)

方案2:先读取文件内容再检测列宽

如果需要保留自动检测列宽的功能,可以先把文件内容读为字符串向量,再传入fwf_empty():

library(readr)
# 读取f1文件的所有行内容
f1_lines <- readLines("fixed-width.fwf")
# 基于内容检测列宽
col_rule <- fwf_empty(f1_lines, col_names = c("last", "first", "birth", "death"))
# 读取数据
t1 <- read_fwf(f1_lines, col_rule)

# 同理处理txt文件
f2_lines <- readLines("fixed-width.txt")
col_rule2 <- fwf_empty(f2_lines, col_names = c("last", "first", "birth", "death"))
t2 <- read_fwf(f2_lines, col_rule2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:36:02