使用map2()生成指定列名的tibble时出现参数类型错误的问题
解决方法
首先,我们来修正你的代码,让它能生成你想要的单个列tibble列表:
library(purrr) library(tibble) names <- c("col1", "col2") cols <- list(1:10, 11:20) # 正确的map2调用 map2(names, cols, ~tibble(!!rlang::sym(.x) := .y))
运行这段代码后,你会得到一个包含两个tibble的列表:
- 第一个tibble只有一列
col1,值为1到10 - 第二个tibble只有一列
col2,值为11到20
为什么你的原始代码出错?
你的代码有两个核心问题:
- 不必要的符号展开:你用
!!!rlang::syms(names)把列名转成符号后展开,这其实不符合map2的使用逻辑——map2需要接收两个长度匹配的向量/列表,逐个配对处理,直接传入字符向量names就可以了,不需要展开符号。 - 动态列名赋值错误:在
tibble(.x = .y)中,.x会被当作列名的字面量(也就是列名会变成".x"),而不是把.x对应的字符(比如"col1")作为列名。要实现动态列名,我们需要用:=操作符配合符号解引用:rlang::sym(.x)把字符串转成符号!!解引用这个符号,让它作为列名:=用来完成动态列名的赋值
另一种简洁写法
如果你觉得rlang::sym有点繁琐,也可以用as.name替代,效果是一样的:
map2(names, cols, ~tibble(!!as.name(.x) := .y))
或者利用imap(带索引/名称的map),先给cols命名再处理:
names(cols) <- names imap(cols, ~tibble(!!sym(.y) := .x))
内容的提问来源于stack exchange,提问作者der_grund
相关产品推荐
相关产品推荐

