如何从文件读取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()格式的完整代码,可一次性解析:
- 规范文件(如
spec_config.txt)内容:
cols(varInt = 'i', varChar = 'c', varFac = col_factor(levels = c('A1', 'A2', 'A3')))
- 读取并解析规范:
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
相关产品推荐
相关产品推荐

