2017-03-03 24 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)