使用 dplyr 编写函数时的延迟评估
Lazy evaluation when writing functions with dplyr
我想使用 dplyr 函数编写一个函数来输出 z 中的每个元素有多少个唯一元组 (z, y)。该函数看起来像这样
library(tidyverse)
data <- data_frame(z = rep(c('a', 'b'), 50),
y = sample(letters[13:18], size = 100, T))
foo1 <- function(data, x, n){
library(lazyeval)
data %>%
group_by_(lazy(n, x)) %>%
filter(row_number() == 1) %>%
ungroup() %>%
group_by_(lazy(x)) %>%
summarise(nr_x = n()) %>%
arrange(desc(nr_x))
}
foo1(data, x = z, n = y)
但我收到以下错误:
Error in as.lazy_dots(list(...)) : object 'z' not found
这个更简单的函数,看起来与前面的非常相似,但工作正常。
foo <- function(data, x, n){
library(lazyeval)
data %>%
group_by_(lazy(n, x)) %>%
summarise(n = n())
}
有什么解决办法吗?
8 个月后回到这个问题,我没有得到我以前在 运行 foo1
时得到的错误。不知道为什么。
但我决定使用更新的 tidyeval 方法来解决这个问题。以下对我来说很好用:
library(tidyverse)
data <- data_frame(z = rep(c('a', 'b'), 50),
y = sample(letters[13:18], size = 100, T))
foo_tidyeval <- function(data, x, n){
x <- enquo(x)
n <- enquo(n)
data %>%
group_by(!!n, !!x) %>%
filter(row_number() == 1) %>%
ungroup() %>%
group_by_(x) %>%
summarise(nr_x = n()) %>%
arrange(desc(nr_x))
}
foo_tidyeval(data, x = z, n = y)
我想使用 dplyr 函数编写一个函数来输出 z 中的每个元素有多少个唯一元组 (z, y)。该函数看起来像这样
library(tidyverse)
data <- data_frame(z = rep(c('a', 'b'), 50),
y = sample(letters[13:18], size = 100, T))
foo1 <- function(data, x, n){
library(lazyeval)
data %>%
group_by_(lazy(n, x)) %>%
filter(row_number() == 1) %>%
ungroup() %>%
group_by_(lazy(x)) %>%
summarise(nr_x = n()) %>%
arrange(desc(nr_x))
}
foo1(data, x = z, n = y)
但我收到以下错误:
Error in as.lazy_dots(list(...)) : object 'z' not found
这个更简单的函数,看起来与前面的非常相似,但工作正常。
foo <- function(data, x, n){
library(lazyeval)
data %>%
group_by_(lazy(n, x)) %>%
summarise(n = n())
}
有什么解决办法吗?
8 个月后回到这个问题,我没有得到我以前在 运行 foo1
时得到的错误。不知道为什么。
但我决定使用更新的 tidyeval 方法来解决这个问题。以下对我来说很好用:
library(tidyverse)
data <- data_frame(z = rep(c('a', 'b'), 50),
y = sample(letters[13:18], size = 100, T))
foo_tidyeval <- function(data, x, n){
x <- enquo(x)
n <- enquo(n)
data %>%
group_by(!!n, !!x) %>%
filter(row_number() == 1) %>%
ungroup() %>%
group_by_(x) %>%
summarise(nr_x = n()) %>%
arrange(desc(nr_x))
}
foo_tidyeval(data, x = z, n = y)