gpt4 book ai didi

r - 使用 purrr 和 dplyr: 是 rlang::sym 最好的方法

转载 作者:行者123 更新时间:2023-12-01 03:17:11 32 4
gpt4 key购买 nike

我想编写使用 dplyr 动词的函数,这意味着我必须涉足 rlang 的浑水。 .

为了提供一个具体的例子,假设我想使用 purrr::map_df()迭代 dplyr::group_by() 中的变量. programming with dplyr小插图通过写 my_summarise()功能;方法是使用 rlang::enquo()在分组变量上,然后用 !! 取消引用.
这种方法可以创建一个新的类似 dplyr 的函数,该函数采用不带引号的变量名(小插图中的 my_summarise(df, g1))。

相比之下,我想 purrr 以字符串形式提供变量名称。是 rlang::sym()这样做的正确方法是什么?好像不是,因为 sym()在 dplyr 编程小插图中没有提到,在 rlang tidy evaluation article 中也几乎没有提到.有没有更好的办法?

library(tidyverse)
my_summarise <- function(df, group_var) {
group_var <- rlang::sym(group_var)

df %>%
group_by(!!group_var) %>%
summarise(mpg = mean(mpg))
}

# This works. Is that a good thing?
purrr::map_df(c("cyl", "am"), my_summarise, df = mtcars)

# A tibble: 5 x 3
cyl mpg am
<dbl> <dbl> <dbl>
1 4.00 26.7 NA
2 6.00 19.7 NA
3 8.00 15.1 NA
4 NA 17.1 0
5 NA 24.4 1.00

作为后续,为什么简单地取消引用(不首先应用 enquosym )有时会起作用?在下面的例子中,为什么 select()按预期工作,但 group_by()不是吗?
x <- "cyl"
select(mtcars, !!x)
group_by(mtcars, !!x)

更新:答案与取消引用无关。就是这样 select更灵活,可以处理字符串,而 group_by不能。

其他引用:此 blog post通过埃德温·托恩。

最佳答案

简短的回答:是的。

如果您想 map在列上,sym是一个很好的方法。莱昂内尔·亨利演示 symdraft vignette .

如果您想传递列名,但不想迭代,Kirill Müller prefers quo .在下面的示例中,它们具有相同的效果。

library(dplyr)

x <- rlang::quo(cyl)
y <- rlang::sym("cyl")
identical(group_by(mtcars, !!x), group_by(mtcars, !!y)) # TRUE

关于r - 使用 purrr 和 dplyr: 是 rlang::sym 最好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48131597/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com