2015-03-18 4 views
7

Ich habe eine Funktion in R auf der kind help von @ Jim M. basierend erstelltR: Verwenden von dplyr in einer Funktion. Ausnahme in eval (ausdr, envir, enclos): unbekannt Spalte

Wenn ich die Funktion laufen bekomme ich den Fehler: Fehler: unbekannt Spalte 'rawdata' wenn im Debugger sucht ich die Meldung: RCPP :: exception in eval (ausdr, envir, enclos): unbekannt Spalte 'rawdata'

jedoch, wenn ich an die Umwelt Fenster schauen kann i siehe 2 Variablen, die ich an die Funktion übergeben habe und sie enthalten Informationen rawdata mit 7 Level-Faktoren und refdata mit 28 Levels

function (refdata, rawdata) 
{ 
    wordlist <- expand.grid(rawdata = rawdata, refdata = refdata,  stringsAsFactors = FALSE) 
    wordlist %>% group_by(rawdata) %>% mutate(match_score =  jarowinkler(rawdata, refdata)) %>% 
summarise(match = match_score[which.max(match_score)], matched_to = ref[which.max(match_score)]) 
} 

Antwort

9

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

Verwandte Themen