2017-01-23 3 views
2

Ich möchte filter und summarise von dplyr innerhalb meiner Funktion verwenden. Ohne eine Funktion wie folgt funktioniert:Wie verwendet man dplyr-Verben innerhalb einer Funktionsdefinition in r?

library(dplyr) 
> Orange %>% 
+  filter(Tree==1) %>% 
+  summarise(age_max = max(age)) 
    age_max 
1 1582 

Ich möchte das gleiche in einer Funktion zu tun, aber folgende fehlschlägt:

## Function definition: 

df.maker <- function(df, plant, Age){ 

    require(dplyr) 

    dfo <- df %>% 
    filter(plant==1) %>% 
    summarise(age_max = max(Age)) 

    return(dfo) 
} 

## Use: 
> df.maker(Orange, Tree, age) 

Rerun with Debug 
Error in as.lazy_dots(list(...)) : object 'Tree' not found 

Ich weiß, dass ähnliche Fragen, bevor gestellt wurden. Ich habe auch einige relevante Links wie page1 und page2 durchgegangen. Aber ich kann die Konzepte von NSE und SE nicht vollständig erfassen. Ich versuchte folgendes:

df.maker <- function(df, plant, Age){ 

    require(dplyr) 

    dfo <- df %>% 
    filter_(plant==1) %>% 
    summarise_(age_max = ~max(Age)) 

    return(dfo) 
} 

Aber erhalten Sie den gleichen Fehler. Bitte hilf mir zu verstehen, was vor sich geht. Und wie kann ich meine Funktion korrekt erstellen? Vielen Dank!

EDIT:
ich auch versucht, folgende:

df.maker <- function(df, plant, Age){ 

    require(dplyr) 

    dfo <- df %>% 
    #filter_(plant==1) %>% 
    summarise_(age_max = lazyeval::interp(~max(x), 
              x = as.name(Age))) 

    return(dfo) 
} 

> df.maker(Orange, Tree, age) 
Error in as.name(Age) : object 'age' not found 
+1

Does [diese] (http://stackoverflow.com/questions/40017629/using-dplyr-within-a-function-non-standard-evaluation/40018601#40018601) beantworte deine Frage? – Axeman

+0

@Axeman, ich habe das versucht, wie in meinem Schnitt gezeigt. Aber es funktioniert immer noch nicht. Ich denke, es hat etwas mit Umwelt zu tun. –

Antwort

2

Entweder Versorgungs Charakter Argumente und verwenden as.name:

df.maker1 <- function(d, plant, Age){ 
    require(dplyr) 
    dfo <- d %>% 
    filter_(lazyeval::interp(~x == 1, x = as.name(plant))) %>% 
    summarise_(age_max = lazyeval::interp(~max(x), x = as.name(Age))) 
    return(dfo) 
} 
df.maker1(Orange, 'Tree', 'age') 
age_max 
1 1582 

Oder fangen die Argumente mit substitute:

df.maker2 <- function(d, plant, Age){ 
    require(dplyr) 
    plant <- substitute(plant) 
    Age <- substitute(Age) 

    dfo <- d %>% 
    filter_(lazyeval::interp(~x == 1, x = plant)) %>% 
    summarise_(age_max = lazyeval::interp(~max(x), x = Age)) 
    return(dfo) 
} 
df.maker2(Orange, Tree, age) 
age_max 
1 1582 
+1

Vielen Dank! Ich wusste nichts über 'substitute()'. –

Verwandte Themen