代码之家  ›  专栏  ›  技术社区  ›  sztal

使用tidyeval工具(如“!!”和“:=”)构建列表

  •  1
  • sztal  · 技术社区  · 7 年前

    我正在寻找一种简单的方法 list R 潮水期 rlang 包裹

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

    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)
    

    或者,当添加 :

    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
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Lionel Henry    6 年前

    您可以使用 rlang::list2() := 和拼接 !!! .

    注意,您不应该取消引用参数本身,因为 list2() list()

    a <- "item_name"
    b <- "item_value"
    
    list2(!!a := b)