2017-03-03 1 views
1

Je souhaite écrire une fonction en utilisant les fonctions dplyr pour afficher le nombre de tuples uniques (z, y) de chaque élément de z. La fonction ressemblerait à ceciÉvaluation paresseuse lors de l'écriture de fonctions avec 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) 

Mais je reçois l'erreur suivante:

Error in as.lazy_dots(list(...)) : object 'z' not found 

Cette fonction simple, qui semble très similaire à la précédente, fonctionne très bien.

foo <- function(data, x, n){ 

    library(lazyeval) 
    data %>% 
    group_by_(lazy(n, x)) %>% 
    summarise(n = n()) 
} 

Des idées pour résoudre ce problème?

+0

Qu'est-ce que vous voulez exactement, quels sont les paramètres de la fonction nécessaire et quelle est la sortie désirée? Est-ce que, par exemple, 'unique (data)%>% count (z)' fonctionne pour vous? Aussi, c'est une mauvaise chose de mettre l'appel 'library' dans la définition de la fonction. –

Répondre

0

Revenons à cette question 8 mois plus tard, je ne reçois pas l'erreur que j'avais l'habitude d'obtenir en cours d'exécution foo1. Aucune idée pourquoi.

Mais j'ai décidé de résoudre ce problème en utilisant l'approche tidyeval plus récente. Ce qui suit pour moi juste bien:

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)