2013-03-20 3 views
6

私は約How to take in text/character argument without quotesの前に質問しました。私がその質問で提供したシナリオでは、引数の数は固定されているので、関数定義で使用するeval(substitute())の数は、引数の数に相当します。複数の式にeval(substitute())を使用

今私は(下記参照)の例factorsため私は1つの引数を持つシナリオを持って、ユーザーが自分の周りの引用符を使用せずに、複数のカラム名を指定することができます - つまり、彼らは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

まず、一例では、あなたが提供してきました、私は間違いなく引用符で囲まれた列名の使用を好むでしょう。あなたが引用符で囲まれていないシンボルのベクトルに渡したいん場合には、これはあなたの質問2に対処し、言っ

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

:彼らの好意で一つのことは、彼らは次のような便利な間接を許すだろうということです。

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 
関連する問題