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))
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)
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!!sumvar
numerische 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)
}