我有一个名字的字符向量和一个数字向量列表。我想创建一个包含每列的字符,其中列名称来自字符向量,并且应该使用数字向量中的值填充。
这是我尝试过的最小例子:
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
,而不是col1
或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
答案 0 :(得分:1)
也许我们需要set_names
map2(names, cols, ~ tibble(.y) %>%
set_names(.x))
答案 1 :(得分:1)
map2()
是常规功能,因此不支持!!
。由于这里引用的是tibble()
,因此您应该取消引用:
map2(names, cols, function(n, x) tibble::tibble(!!n := x))
请注意,您不需要sym()
在LHS上取消引用名称,因为支持符号和字符串(这是R中的标准,您可以始终提供名称作为字符串或符号,例如{{ 1}})。