11

関数を呼び出したいのですが、状況によっては、追加の引数を指定して呼び出す場合としない場合があります。簡単な例を次に示します。

FUN <- function(arg1 = "default1", arg2 = "default2", arg3 = "default3")
          print(list(arg1, arg2, arg3))


x1 <- "hi"
x2 <- TRUE
x3 <- 1:3

use.arg3 <- FALSE   # This will decide if `x3` is used or not.

if (use.arg3) {
   FUN(arg1 = x1, arg2 = x2, arg3 = x3)
} else {
   FUN(arg1 = x1, arg2 = x2)
}

コードは明確ですが、少し冗長に感じます。use.arg1また、もし私が似たような変数を持っていたら、可能性の醜い組み合わせがあるだろうと想像してくださいuse.arg2(8)...

以下に解決策を投稿しましたが、正確な構文を覚えるのにいつも苦労しているという点で、少し複雑だと思います。

より良いアイデアがあれば、共有していただきありがとうございます。

4

2 に答える 2

16

1つの解決策はdo.call、適切な引数を使用してリストを作成した後に使用することです。

do.call(FUN, c(list(arg1 = x1, arg2 = x2),   # unconditional args
               list(arg3 = x3)[use.arg3]))   # conditional arg

そしてそれは複数の条件によく一般化されます:

do.call(FUN, c(list(arg1 = x1)[use.arg1]     # conditional arg
               list(arg2 = x2)[use.arg2]     # conditional arg
               list(arg3 = x3)[use.arg3]))   # conditional arg
于 2012-12-21T15:00:12.957 に答える
7

flodelの答えに対するコメントからの議論を続けて、好奇心からの私の考えの拡張がここにあります。それが本当に実行可能なオプションであるかどうかわからない:

FUN(arg1 = x1, arg2 = x2, arg3 = if(use.arg3) x3 else formals(FUN)$arg3)
于 2012-12-21T15:22:11.227 に答える