2013-03-20 3 views
6

Я задал вопрос до How to take in text/character argument without quotes. В сценарии, который я предоставил в этом вопросе, количество аргументов фиксировано, поэтому число eval (substitute()), которое я использую в определении функции, соответствует количеству аргументов, которые у меня есть.Использовать eval (substitute()) для нескольких выражений

Теперь у меня есть сценарий, где у меня есть один аргумент, например factors (смотри ниже), и пользователь может указать несколько имен столбцов, не используя кавычки вокруг них - то есть, они будут использовать factor1 вместо "factor1". И я хотел бы оценить каждое из имен столбцов, предоставленных пользователем.

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

} 

Вопрос 1: Интересно, если есть способ применить Eval (заменитель()) на несколько выражений, когда количество выражений может варьироваться.

Как указано, eval (substitute()) может быть потенциально опасным и может быть сбой при определенных обстоятельствах.

Вопрос 2: так есть более элегантный способ справиться с проблемой, кроме используя кавычки имена столбцов, как показано ниже:

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

ответ

7

Прежде всего, в этом примере вы предоставили, Я бы предпочел использовать имена столбцов. Одна вещь, в их пользу является то, что они позволяют полезным косвенность как следующее:

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

Тем не менее, в случае, если вы хотите передать в векторе некотируемым символов, это решает ваш Вопрос 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 
Смежные вопросы