2013-03-20 16 views
6

Ho fatto una domanda prima di circa How to take in text/character argument without quotes. Nello scenario che ho fornito in quella domanda, il numero di argomenti è fisso, quindi il numero di eval (sostituto()) che uso nella definizione della funzione corrisponde al numero di argomenti che ho.Utilizzare eval (sostituto()) su più espressioni

ora ho uno scenario in cui ho un argomento, ad esempio factors (vedi sotto), e l'utente può specificare più nomi di colonna senza usare le virgolette intorno a loro - vale a dire, useranno factor1 invece di "factor1". E vorrei valutare ciascuno dei nomi di colonna forniti dall'utente.

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

} 

Domanda 1: Mi chiedo se c'è un modo per applicare eval (sostituto()) per molteplici espressioni quando il numero di espressioni può variare.

Come sottolineato, eval (sostituto()) può essere potenzialmente pericoloso e può fallire in determinate circostanze.

Domanda 2: è così c'è un modo più elegante per affrontare il problema sia quello di usare citato i nomi delle colonne come illustrato di seguito:

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

risposta

7

Prima di tutto, l'esempio che ci hai fornito, Sicuramente preferirei usare i nomi delle colonne citate. Una cosa a loro favore è che Essi vi permetteranno utile indiretto come la seguente:

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

Detto questo, nel caso in cui si vuole passare un vettore di simboli non quotati, questo si rivolge il vostro Domanda 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 
Problemi correlati