使用 map2() 生成具有不同列名的小标题

Generate tibbles with different column names with map2()

我有一个名称字符向量和一个数值向量列表。我想用一列创建 tibbles,其中列名来自字符向量,应该用数字向量中的值填充。

这是我尝试过的一个最小示例:

names <- c("col1", "col2")

cols <- list(1:10, 11:20)

map2(.x = !!!rlang::syms(names), .y = cols, ~tibble::tibble(.x = .y))

当我 运行 执行此操作时,出现 invalid argument type 错误。根据我的理解(以及我的尝试),我不能简单地将 names 用作 .x。那么列名将是 .x 而不是 col1col2。通过使用 syms 并取消引用表达式,我试图将字符元素从 names 转换为我认为需要的名称。

编辑:建议解决方案的基准:

两种建议的解决方案都很好用并且易于阅读。因此,我进行了一个小型基准测试来帮助我选择接受哪种解决方案。使用 !! 的(已接受的)解决方案更快,更短。

Unit: microseconds
      expr      min        lq      mean    median       uq      max neval
 set_names 1148.635 1163.1985 1210.2218 1168.8840 1201.048 3950.820   100
        !!  701.961  713.5295  729.4239  721.2395  734.779 1102.086   100

也许我们需要set_names

map2(names, cols, ~ tibble(.y) %>% 
                        set_names(.x))

map2() 是常规函数,因此不支持 !!。因为这里引用的是 tibble(),所以你应该取消引用:

map2(names, cols, function(n, x) tibble::tibble(!!n := x))

请注意,您不需要 sym() 在 LHS 上取消引用名称,因为符号和字符串都受支持(这是 R 中的标准,您始终可以提供字符串或符号形式的名称,例如 list("str" = 1, sym = 2)).