2013-06-30 18 views
7

デフォルトの引数の一部を置き換えるラッパー関数を作成したいと思います。ここでR:省略記号を使用する(...)

私は苦労してる問題の核心:今

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 

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

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

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

しかし、(ⅰ)それはあまりエレガントであると、(ii)私の好奇心を満たしていません。

答えて

11

ACTUAL ANSWER:

あなたは詐欺のビットを介してこれを行うことができます。まず、以前のように関数を定義しますが、関数内にデフォルトの引数を含むリストを含めます。 ...を引数として何でも入力して解析し、デフォルト値を...に置き換えて、更新された引数リストを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 

EARLIER解説:

ここでの問題は、いくつかの例機能を通して見ることができます。

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のデフォルト値を指定するが、それを変更することができます。 myplot3では、cexが単純に通過します。あなたは2つのcexの引数でmyplot2を実行した場合、あなたはあなたの関数(myplot1)で何が起こっているのかわかります

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

だから、あなたはそう、あなたが何かを渡すことができ、plot()内の任意のデフォルト値を設定しないように、おそらく最高です...myplotに入力します。

+0

ええ、これは私が避けたいものです。実際の問題は複雑で、関数呼び出し定義にデフォルトを置くことは望ましくありません。すでに引数が多すぎます。 – January

+0

以下の回答に基づいて更新しました:http://stackoverflow.com/questions/7028385/can-i-remove-an-element-in-dot-dot-dot-and-pass-it-on/7028786# 7028786 – Thomas

関連する問題