2017-03-03 85 views
1

我想使用dplyr函数编写一个函数来输出z中每个元素的唯一元组(z,y)。该功能是这样的使用dplyr编写函数时的懒惰评估

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()) 
} 

任何想法如何解决这个问题?

+0

你到底想要什么,所需函数的参数是什么以及期望的输出是什么?例如,是否有'unique(data)%>%count(z)'为你工作?另外,将'library'调用放入函数定义是一件坏事。 –

回答

0

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)