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

如何从文件读取readr::read_delim的col_types列规范?

问题说明

希望从CSV文件读取readr::read_csv的col_types列规范,替代直接在代码中定义。原可正常运行的代码如下:

read_csv(file = I('varInt,varChar,varFac
                   1,a,A1
                   2,b,A2
                   3,c,A3'),
         col_types = cols(varInt = 'i',
                          varChar = 'c',
                          varFac = col_factor(levels = c('A1', 'A2', 'A3'))))

但尝试从CSV读取规范转为列表传入时,带参数的col_factor类型报错:Error: Unknown shortcut: col_factor(levels = c('A1'; 'A2'; 'A3')),错误代码如下:

mySpecFile <- read_csv(file = I("Variable,Spec
                                  varInt,i
                                  varChar,c
                                  varFac,col_factor(levels = c('A1'; 'A2'; 'A3'))"))

mySpec <- mySpecFile |> pull(Spec, Variable) |> as.list()

read_csv(file = I('varInt,varChar,varFac
                    1,a,A1
                    2,b,A2
                    3,c,A3'),
          col_types = mySpec)
解决方案

直接读取的字符串无法被readr识别为函数调用,需要将字符串解析为实际的R表达式并执行,同时修正R语法错误:

方法一:逐行解析规范字符串

# 读取规范文件,注意将原代码中的分号改为R向量标准分隔符逗号
mySpecFile <- read_csv(file = I("Variable,Spec
                                  varInt,i
                                  varChar,c
                                  varFac,col_factor(levels = c('A1', 'A2', 'A3'))"))

# 解析每个Spec字符串为可执行的R表达式
mySpec <- mySpecFile |>
  dplyr::mutate(Spec = purrr::map(Spec, ~ eval(parse(text = .x)))) |>
  dplyr::pull(Spec, Variable) |>
  as.list()

# 读取目标数据
read_csv(file = I('varInt,varChar,varFac
                    1,a,A1
                    2,b,A2
                    3,c,A3'),
          col_types = mySpec)

方法二:整体存储cols()结构规范

如果规范文件直接存储cols()格式的完整代码,可一次性解析:

  1. 规范文件(如spec_config.txt)内容:
cols(varInt = 'i', varChar = 'c', varFac = col_factor(levels = c('A1', 'A2', 'A3')))
  1. 读取并解析规范:
mySpec <- eval(parse(text = readr::read_lines("spec_config.txt")))

read_csv(file = "target_data.csv", col_types = mySpec)

注意事项

  • 确保规范文件中的R语法正确,比如向量必须用逗号分隔,而非分号
  • 使用eval(parse())时,需保证规范文件来源可信,避免代码注入风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:52:40