2017-11-22 3 views
0

KURZE ZUSAMMENFASSUNG

dplyr unquoting als Argument der Funktion versagt summarise wo das zitierte Objekt das ist Argument einer Funktion die Verwendung von summarise, und dieses Argument wird in einer for-Schleife zugewiesen.Nichtstandardauswertung in R für Loop: Unquoted Eingangsgröße in Abhängigkeit dplyr zusammenzufassen enthält liefert immer NA, aber Filterfunktion arbeitet

For-Schleife

for(j in 1:1){ 
    sumvar <- paste0("randnum",j) 
    chkfunc(sumvar) 
} 

Funktion (hier abgekürzt, unten vollständig dargestellt)

chkfunc <- function(sumvar) { 
sumvar <- enquo(sumvar) 
[...] 
    summarise(mn = mean(!!sumvar)) 

enter image description here

LONG ZUSAMMENFASSUNG

Ich habe zwei Spalten, die manchmal NAs enthalten und ich möchte dplyr non-standard evaluation und sein berühmtes Nichtquotieren (AKA bang bang !!) verwenden, um jede Spalte in einer for loop zusammenzufassen.

library(dplyr) 
set.seed(3) 
randnum1 <- rnorm(10) 
randnum1[randnum1<0] <- NA 
randnum2 <- rnorm(10) 
randnum2[randnum2<0] <- NA 
randfrm <- data.frame(cbind(randnum1, randnum2)) 
print(randfrm) 

enter image description here

Wir sehen unten, dass die Filterfunktion der unquoting (!!) nur gut verarbeitet, aber die summarise Funktion fehlschlägt, „ist Argument nicht numerisch oder logisch“ eine Rückkehr Fehler. Das gleiche passiert, wenn ich := in der Zusammenfassung Funktion aufrufen (hier nicht gezeigt), die in der Vignette "Programming with dplyr" erschien. Schließlich habe ich bestätigt, dass die Klasse!!sumvarnumerische innerhalb der Funktion chkfunc ist.

chkfunc <- function(sumvar) { 
    sumvar <- enquo(sumvar) 

    message("filter function worked with !!sumvar") 
    outfrm <- randfrm %>% 
    filter(!is.na(!!sumvar)) 
    print(outfrm) 
    message("summarise function failed with !!sumvar") 
    outfrm <- randfrm %>% 
      filter(!is.na(!!sumvar)) %>% 
      summarise(mn = mean(!!sumvar)) 
} 
# Just one iteration to avoid confusion 
for(j in 1:1){ 
    sumvar <- paste0("randnum",j) 
    chkfunc(sumvar) 
} 

enter image description here

Antwort

0

Während ich eine Antwort mit dplyr, folgende Arbeiten mit substitute und eval anstatt dplyr Funktionen (Antwort von Akrun's answer to StackOverflow question "Unquote string in R's substitute command" angepasst) möchte:

chkfunc <- function(sumvar) { 
    outfrm <- eval(substitute(randfrm %>% 
          filter(!is.na(y)) %>% 
          summarise(mn = mean(y)), 
          list(y=as.name(sumvar)))) 
    print(outfrm) 
} 

for(j in 1:2){ 
    sumvar <- paste0("randnum",j) 
    chkfunc(sumvar) 
} 

print(outfrm) 

enter image description here

Schließlich

, werde ich beachten Sie, dass während der pull Funktion auf !!sumvar zeigte die resultierende Klasse numerische (dh die gleiche Klasse und Werte von randfrm$randnum1) sein, ich herausgefunden, dass !!sumvar als Zeichenkette behandelt wird (dh , 10) in beiden meiner Verwendung von filter und summarise, daher die argument is not numeric Warnung.

Verwandte Themen