7

引用符なしでテキスト/文字引数を取り込む方法について以前に質問しました。その質問で提供したシナリオでは、引数の数は固定されているため、関数定義で使用する eval(substitute()) の数は、私が持っている引数の数に対応します。

たとえば、引数が 1 つの場合factors(以下を参照)、ユーザーは引用符を使用せずに複数の列名を指定できます。つまり、 .factor1の代わりに使用し"factor1"ます。そして、ユーザーが提供した各列名を評価したいと思います。

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

}

質問 1: 式の数が異なる場合に、eval(substitute()) を複数の式に適用する方法があるかどうか疑問に思います。

指摘したように、 eval(substitute()) は潜在的に危険であり、特定の状況下で失敗する可能性があります。

質問 2: 以下に示すように、引用符で囲まれた列名を使用する以外に、問題に対処するより洗練された方法はありますか。

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

1 に答える 1

9

まず第一に、あなたが提供した例では、引用された列名を使用することをお勧めします。彼らに有利な点の 1 つは、次のような便利な間接化を許可することです。

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

とはいえ、引用符で囲まれていないシンボルのベクトルを渡したい場合は、これでQuestion 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
于 2013-03-20T16:00:49.743 に答える