1

我正在寻找一种list基于包中定义Rtidyevalrlang框架轻松构建的方法。

以下是我想要实现的目标:

a <- "item_name"
b <- "item_value"
identical(
    list(!!a := !!b),    # list(!!a := b) is of course also fine
    list(item_name = "item_value")
)

我目前可以获得的是:

list(!!a := !!b)
# output
[[1]]
`:=`(!(!a), !(!b)

或者,添加quosure时它可能会变得更好一点:

quo(list(!!a := !!b))
# output
<quosure: global>
~list(`:=`("item_name", "item_value"))

不幸的是,我不知道如何从这里进一步前进。

换句话说,我想有一个类似的效果,就像我们可以在dplyr包中得到的一样:

transmute(iris, !!a := b)
# first few rows
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species  item_name
1            5.1         3.5          1.4         0.2     setosa item_value
2            4.9         3.0          1.4         0.2     setosa item_value
3            4.7         3.2          1.3         0.2     setosa item_value
4            4.6         3.1          1.5         0.2     setosa item_value
5            5.0         3.6          1.4         0.2     setosa item_value
6            5.4         3.9          1.7         0.4     setosa item_value
4

1 回答 1

3

您可以使用rlang::list2()which 支持 name-unquoting with:=和 splicing with !!!

请注意,您不应该取消引用参数本身,因为list2()它不是引用函数,它就像list()具有更多语法功能一样:

a <- "item_name"
b <- "item_value"

list2(!!a := b)
于 2017-09-22T13:34:46.253 回答