12

デフォルト引数の一部を置き換えるラッパー関数を作成したいと考えています。

ここに私が苦労している問題の核心があります:

Error in localWindow(xlim, ylim, log, asp, ...) : 
  formal argument "cex" matched by multiple actual arguments

ここで少しコンテキストを説明します。次のようにプロットのラッパー関数を定義するとします。

myplot <- function(x, ... ) {
    plot(x, cex= 1.5, ... )
}

私が電話myplot( 1:10, cex= 2 )すると、上記のエラーが発生します。私...はリストに目を向けることができることを知っています

l <- list(...)

そして、私はできる

if( is.null( l[["cex"]] ) ) l[["cex"]] <- 2

ただし、このリストを省略記号引数に「挿入」するにはどうすればよいですか? 次のようなもの(これが機能しないことはわかっています):

... <- l

編集:myplot定義でデフォルトを使用できます(@Thomasからの回答で提案されているように)が、したくありません:関数インターフェイスが雑然とします。次のようなヘルパー関数を定義できると思います。

 .myfunchelper <- function( x, cex= 2.0, ... ) {
   plot( x, cex= cex, ... )
 }

 myfunc <- function( x, ... ) {
    .myfunchelper( x, ... )
 }

しかし、(i) あまりエレガントではなく、(ii) 私の好奇心を満足させません。

4

1 に答える 1

17

実際の答え:

ちょっとしたトリックでこれを行うことができます。最初に、前と同じように関数を定義しますが、関数内にデフォルト引数のリストを含めます。次に、リストとして渡される引数を解析し...、デフォルトを にあるものに置き換えてから...、更新された引数のリストをdo.call.

myplot <- function(x, ...) {
    args1 <- list(cex=4, main="Default Title") # specify defaults here
    inargs <- list(...)
    args1[names(inargs)] <- inargs
    do.call(plot, c(list(x=x), args1))
}

myplot(x=1:3) # call with default arguments
myplot(x=1:3, cex=2, main="Replacement", xlab="Test xlab") # call with optional arguments

以前のコメント:

ここでの問題は、いくつかの関数の例で確認できます。

myplot1 <- function(x, ... ) {
    plot(x, cex= 1.5, ... )
}

myplot2 <- function(x, cex=3, ... ) {
    plot(x, cex=cex, ... )
}

myplot3 <- function(x, ... ) {
    plot(x, ... )
}

myplot1(1:3, cex=3) # spits your error
myplot2(1:3, cex=3) # works fine
myplot3(1:3, cex=3) # works fine

ではmyplot2、デフォルト値の を指定しますが、cexこれは変更できます。ではmyplot3cex単純に通過します。myplot22 つの引数を指定して実行すると、関数 ( )cexで何が起こっているかがわかります。myplot1

myplot2(1:3, cex=3, cex=1.5) # same error as above

そのため、 にデフォルトを設定しないようにするのがおそらく最善です。そうすれば、 inplot()を介して何でも渡すことができます。...myplot

于 2013-06-30T12:15:15.420 に答える