2012-04-22 20 views
13

Rには、モジュールの実行時に未使用の引数が存在するという事実を無視することはできますか?未使用の引数R

例えば、私はabという製品を返すモジュールmultiply(a,b)を持っています。この上でエラーを返す

multiply(a=20,b=30,c=10) 

だけで必要な入力abが指定されているため、少し不必要なようだ:私はそうのようなモジュールが呼び出す場合、私は、エラーを受け取ることになります。この悪い行動を避けることは可能ですか?

cの指定をやめるのは簡単な解決策ですが、なぜRがこのように動作するのかはわかりません。これを解決する別の方法がありますか?

+1

"これはちょっと不必要なようだ"と返答して、私はこれが不必要だとは思わない追加の引数を割り当てるために、関数の "予期しない動作"を防ぐために引数が存在しないことを伝える必要があることは明らかです。 –

+0

まず、モジュールではない関数です。第二に、あなたの関数は追加の引数で何をすべきかを知っていますか?答えは正しいと思いますが、実際にどのようにドット(別名「...」)を使用するかをより具体的に説明する必要があります。 – geneorama

答えて

23

の変更、追加、未知の引数を取る乗算の定義:

multiply <- function(a, b, ...) { 
    # Original code 
} 
7

一つのアプローチ(私は想像することはできません良いプログラミングの練習では)伝統的に指定された引数を渡すために使用され...を追加することですある機能を別の機能に移す。あなたの関数定義で...

> multiply <- function(a,b) a*b 
> multiply(a = 2,b = 4,c = 8) 
Error in multiply(a = 2, b = 4, c = 8) : unused argument(s) (c = 8) 
> multiply2 <- function(a,b,...) a*b 
> multiply2(a = 2,b = 4,c = 8) 
[1] 8 

あなたは...についての詳細を読むことができますがあなたは、ドットを使用することができhere

+0

なぜこれが悪い習慣になると思いますか? (不一致ではなく、好奇心をそそらない)私はRドキュメントの多くを読んだようですが、 '...'引数は単に無視されます。これは人々が時々これを行うことを示唆しています。 – joran

+0

...は、関数が記述された時点で必要な(または受け入れられた)引数のリストが分からないサブ関数、特にメソッドに渡すことを意図しています。あなたが下を通過すると、より深いレベルで "未使用の引数"エラーが発生します。一般的に、あなたが議論をしているかどうかを知らないと、混乱が起こります。 –

+0

そして、ちょうど私がこれをC++の仮想メソッドで十分にやっていると私は打ちました。引数リストは固定されていますが、一部のオブジェクトメソッドではすべての引数を必要としません。 –

5

を使用することを意図しています。

myfun <- function(a, b, ...){ 
    cat(a,b) 
} 

myfun(a=4,b=7,hello=3) 

# 4 7 
0

私はあなたと同じ問題がありました。私は議論の長いリストを持っていたが、そのほとんどは無関係だった。私はそれらをハードコードしたくなかった。これは私が思いついたものだ。

library(magrittr) 
do_func_ignore_things <- function(data, what){ 
    acceptable_args <- data[names(data) %in% (formals(what) %>% names)] 
    do.call(what, acceptable_args %>% as.list) 
} 

do_func_ignore_things(c(n = 3, hello = 12, mean = -10), "rnorm") 
# -9.230675 -10.503509 -10.927077 
関連する問題