purrr::map_dfr中调用data.table函数提示'.x'未找到错误如何解决
报错原因
问题出在函数内的substitute(group)逻辑:
单独调用ffreq('mpg')时,substitute会直接捕获你传入的字符串字面量'mpg',可正常被data.table解析为分组列。但放到map_dfr中调用时,purrr的迭代值是通过内部变量.x传递的,此时substitute(group)捕获到的是符号.x,data.table在评估分组参数的环境中找不到.x对象,就触发了报错。
可行解决方案
方案1:直接使用字符串传参(推荐)
data.table的by参数原生支持传入字符串形式的列名,不需要额外走substitute解析,修改函数即可:
ffreq = function(group, data = df){ return(data[, .(N = .N), by = group]) } # 此时map_dfr调用可正常运行 d_all = map_dfr(names(df), ffreq)
方案2:将捕获的表达式转为字符串
如果需要保留substitute的写法,可以在函数内把捕获的表达式转成字符串再传入分组参数:
ffreq = function(group, data = df){ group = as.character(substitute(group)) return(data[,.(N = .N), by = group]) } d_all = map_dfr(names(df), ffreq)
内容的提问来源于stack exchange,提问作者Miao Cai
相关产品推荐
相关产品推荐

