curly curly Tidy 评估和修改输入或其名称
curly curly Tidy evaluation and modifying inputs or their names
整洁评估的新卷曲卷曲方法is explained in this article。给出了几个示例来演示这种非标准评估 (NSE) 风格的使用。
library(tidyverse)
# Example 1 --------------------------
max_by <- function(data, var, by) {
data %>%
group_by({{ by }}) %>%
summarise(maximum = max({{ var }}, na.rm = TRUE))
}
starwars %>% max_by(height)
starwars %>% max_by(height, by = gender)
# Example 2 --------------------------
summarise_by <- function(data, ..., by) {
data %>%
group_by({{ by }}) %>%
summarise(...)
}
starwars %>%
summarise_by(average = mean(height, na.rm = TRUE),
maximum = max(height, na.rm = TRUE),
by = gender)
我创建了一些自己的函数,这确实是一个更容易开发的框架,而不用担心所有的问题和爆炸等等。
但是,this same article explains that我们还没有完全走出困境:
You only need quote-and-unquote (with the plural variants enquos() and
!!!) when you need to modify the inputs or their names in some way.
...并且没有提供示例。不是抱怨,只是询问是否有人可以填补空白并提供示例。不流利的 Tidy 评估,我真的不明白作者引用那句话的意思 (请原谅双关语).
假设您想要以下函数的一个版本,它接受多个输入而不是只有一个 var
:
mean_by <- function(data, var, by) {
data %>%
group_by({{ by }}) %>%
summarise(average = mean({{ var }}, na.rm = TRUE))
}
你不能只传...
来总结,因为那样用户需要自己调用mean()
。
mean_by <- function(data, var, ..., by) {
data %>%
group_by({{ by }}) %>%
summarise(...)
}
mtcars %>% mean_by(foo = disp)
#> Error: Column `foo` must be length 1 (a summary value), not 32
mtcars %>% mean_by(foo = mean(disp))
#> # A tibble: 1 x 1
#> foo
#> <dbl>
#> 1 231.
解决方案是引用点,修改每个输入,以便将它们包装在对 mean()
的新调用中,然后将它们拼接回去:
mean_by <- function(data, ..., by) {
# `.named` makes sure the dots have default names, if not supplied
dots <- enquos(..., .named = TRUE)
# Go over all inputs, and wrap them in a call
dots <- lapply(dots, function(dot) call("mean", dot, na.rm = TRUE))
# Finally, splice the expressions back into `summarise()`:
data %>%
group_by({{ by }}) %>%
summarise(!!!dots)
}
我们正在考虑如何改进这种情况下的语法。 http://rpubs.com/lionel-/superstache
的早期想法
整洁评估的新卷曲卷曲方法is explained in this article。给出了几个示例来演示这种非标准评估 (NSE) 风格的使用。
library(tidyverse)
# Example 1 --------------------------
max_by <- function(data, var, by) {
data %>%
group_by({{ by }}) %>%
summarise(maximum = max({{ var }}, na.rm = TRUE))
}
starwars %>% max_by(height)
starwars %>% max_by(height, by = gender)
# Example 2 --------------------------
summarise_by <- function(data, ..., by) {
data %>%
group_by({{ by }}) %>%
summarise(...)
}
starwars %>%
summarise_by(average = mean(height, na.rm = TRUE),
maximum = max(height, na.rm = TRUE),
by = gender)
我创建了一些自己的函数,这确实是一个更容易开发的框架,而不用担心所有的问题和爆炸等等。
但是,this same article explains that我们还没有完全走出困境:
You only need quote-and-unquote (with the plural variants enquos() and !!!) when you need to modify the inputs or their names in some way.
...并且没有提供示例。不是抱怨,只是询问是否有人可以填补空白并提供示例。不流利的 Tidy 评估,我真的不明白作者引用那句话的意思 (请原谅双关语).
假设您想要以下函数的一个版本,它接受多个输入而不是只有一个 var
:
mean_by <- function(data, var, by) {
data %>%
group_by({{ by }}) %>%
summarise(average = mean({{ var }}, na.rm = TRUE))
}
你不能只传...
来总结,因为那样用户需要自己调用mean()
。
mean_by <- function(data, var, ..., by) {
data %>%
group_by({{ by }}) %>%
summarise(...)
}
mtcars %>% mean_by(foo = disp)
#> Error: Column `foo` must be length 1 (a summary value), not 32
mtcars %>% mean_by(foo = mean(disp))
#> # A tibble: 1 x 1
#> foo
#> <dbl>
#> 1 231.
解决方案是引用点,修改每个输入,以便将它们包装在对 mean()
的新调用中,然后将它们拼接回去:
mean_by <- function(data, ..., by) {
# `.named` makes sure the dots have default names, if not supplied
dots <- enquos(..., .named = TRUE)
# Go over all inputs, and wrap them in a call
dots <- lapply(dots, function(dot) call("mean", dot, na.rm = TRUE))
# Finally, splice the expressions back into `summarise()`:
data %>%
group_by({{ by }}) %>%
summarise(!!!dots)
}
我们正在考虑如何改进这种情况下的语法。 http://rpubs.com/lionel-/superstache
的早期想法