2013-03-20 9 views
6

Zadałem pytanie przed około How to take in text/character argument without quotes. W scenariuszu, który podałem w tym pytaniu, liczba argumentów jest stała, więc liczba eval (substitute()), której używam w definicji funkcji, odpowiada liczbie argumentów, które mam.Użyj eval (substitute()) na wielu wyrażeń

Teraz mam scenariusz, gdzie mam jeden argument, na przykład factors (patrz poniżej), a użytkownik może określić wiele nazw kolumn bez użycia cudzysłowów wokół nich - to znaczy, będą korzystać factor1 zamiast "factor1". Chciałbym ocenić każdą z nazw kolumn podaną przez użytkownika.

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

} 

Pytanie 1: Zastanawiam się, czy istnieje sposób, aby zastosować eval (Zastępca()) do wielu wyrażeń, gdy liczba wyrażeń może być różna.

Jak wskazano, eval (substitute()) może być potencjalnie niebezpieczny i może zawieść w pewnych okolicznościach.

Pytanie 2: tak to jest bardziej eleganckim sposobem radzenia sobie z problemem innym niż przy użyciu podane nazwy kolumn, jak pokazano poniżej:

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

Odpowiedz

7

Przede wszystkim, w przykładzie podasz, Zdecydowanie wolałbym używać cytowanych nazw kolumn. Jedną rzeczą, na ich korzyść jest taka, że ​​oni pozwalają użyteczne wskazanie pośrednie jak następuje:

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

Powiedział, że w przypadku, gdy chcemy przekazać w wektorze symboli notowanych ten rozwiązuje swoje Pytanie 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