2013-03-20 7 views
6

Ich fragte eine Frage vor über How to take in text/character argument without quotes. In dem Szenario, das ich in dieser Frage angegeben habe, ist die Anzahl der Argumente festgelegt, so dass die Anzahl von eval (substitute()), die ich in der Funktionsdefinition verwende, der Anzahl der Argumente entspricht, die ich habe.Verwenden Sie eval (substitute()) für mehrere Ausdrücke

Jetzt habe ich ein Szenario, in dem ich ein Argument haben, zum Beispiel factors (siehe unten), und der Benutzer kann ohne die Verwendung von Anführungszeichen um sie mehrere Spaltennamen angeben - das heißt, sie werden factor1 statt "factor1" verwenden. Und ich möchte jeden der vom Benutzer angegebenen Spaltennamen auswerten.

foo<-function(data.frame, factors){ 

} 

Frage 1: Ich frage mich, ob es einen Weg gibt eval (Ersatz()), um mehrere Ausdrücke anzuwenden, wenn die Anzahl von Ausdrücken variieren kann.

Wie bereits erwähnt, kann eval (substitute()) möglicherweise gefährlich sein und kann unter bestimmten Umständen fehlschlagen.

Frage 2: so ist es eine elegantere Art und Weise mit dem Thema zu befassen andere als Spaltennamen zitiert wie unten gezeigt:

foo<-function(data.frame, factors){ 
    output<-data.frame[, factors] 
    output 
} 
foo(data.frame=dataset, factors=c("factor1", "factor2")) 

Antwort

7

Vor allem im Beispiel Sie zur Verfügung gestellt haben, Ich würde definitiv zitierte Spaltennamen bevorzugen. Eine Sache zu ihren Gunsten ist, dass sie nützlich indirection wie folgt erlauben werden:

XX <- c("cyl", "mpg") 
foo(mtcars, XX) 

Das heißt, falls Sie in einem Vektor von nicht notierten Symbole passieren wollen, dies richtet sich Ihre Frage 2.

foo <- function(data, factors) { 
    jj <- as.character(substitute(factors)[-1]) 
    data[,jj] 
} 

head(foo(data = mtcars, factors = c(cyl, mpg))) 
#     cyl mpg 
# Mazda RX4   6 21.0 
# Mazda RX4 Wag  6 21.0 
# Datsun 710   4 22.8 
# Hornet 4 Drive  6 21.4 
# Hornet Sportabout 8 18.7 
# Valiant    6 18.1 
Verwandte Themen