Dies ist das Problem bei Funktionen, die NSE verwenden (nicht standardmäßige Auswertung). Funktionen, die NSE verwenden, sind bei der interaktiven Programmierung sehr nützlich, verursachen jedoch viele Probleme bei der Entwicklung, d. H. Wenn Sie versuchen, diese in anderen Funktionen zu verwenden. Da Ausdrücke nicht direkt ausgewertet werden, ist R nicht in der Lage, die Objekte in den Umgebungen zu finden, in denen es sich befindet. Ich kann Ihnen empfehlen, here zu lesen.
Zunächst müssen Sie wissen, dass alle Standard-dplyr
Funktionen NSE verwenden. Lassen Sie sich ein ungefähres Beispiel, um Ihr Problem sehen:
Daten:
df <- data.frame(col1 = rep(c('a','b'), each=5), col2 = runif(10))
> df
col1 col2
1 a 0.03366446
2 a 0.46698763
3 a 0.34114682
4 a 0.92125387
5 a 0.94511394
6 b 0.67241460
7 b 0.38168131
8 b 0.91107090
9 b 0.15342089
10 b 0.60751868
Mal sehen, wie NSE unser einfaches Problem Crush machen:
Vor allem des einfachen interaktiven Fall funktionieren:
df %>% group_by(col1) %>% summarise(count = n())
Source: local data frame [2 x 2]
col1 count
1 a 5
2 b 5
Mal sehen, was passiert, wenn ich es in eine Funktion setzen:
lets_group <- function(column) {
df %>% group_by(column) %>% summarise(count = n())
}
>lets_group(col1)
Error: index out of bounds
Nicht der gleiche Fehler wie bei Ihnen, aber er wird von NSE verursacht. Genau die gleiche Codezeile funktionierte außerhalb der Funktion.
Glücklicherweise gibt es eine Lösung für Ihr Problem und das ist Standard-Bewertung. Hadley hat auch Versionen aller Funktionen in dplyr
erstellt, die Standardauswertung verwenden. Sie sind nur die normalen Funktionen plus der _
Unterstrich am Ende.
Überprüfen Sie nun, wie dies funktionieren wird:
#notice the formula operator (~) at the function at summarise_
lets_group2 <- function(column) {
df %>% group_by_(column) %>% summarise_(count = ~n())
}
Daraus ergibt sich folgendes Ergebnis:
#also notice the quotes around col1
> lets_group2('col1')
Source: local data frame [2 x 2]
col1 count
1 a 5
2 b 5
Ich kann nicht Ihr Problem testen, sondern von NSE mit SE wird Ihnen die Ergebnisse, die Sie wollen . Für weitere Informationen können Sie auch lesen here