1

我有一个名称字符向量和一个数字向量列表。我想创建一个包含一列的小标题,其中列名来自字符向量,并且应该用数字向量中的值填充。

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

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

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

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

当我运行它时,我得到一个invalid argument type错误。据我了解(以及我尝试过的),我不能简单地使用namesas .x。然后列名将.x代替col1or col2。通过使用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
4

2 回答 2

1

也许我们需要set_names

map2(names, cols, ~ tibble(.y) %>% 
                        set_names(.x))
于 2018-04-15T16:15:37.453 回答
1

map2()是常规功能,所以不支持!!。因为它是tibble()在此处引用,所以您应该取消引用:

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

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

于 2018-04-15T16:19:14.483 回答