[R] formal argument “xxx” matched by multiple actual argumentsというエラーの原因と対策

Rで関数を実行すると以下のようなエラーメッセージが表示され実行に失敗することがある。

formal argument “xxx” matched by multiple actual arguments

xxxのところに入るのはその時々に呼び出す関数によって異なる。

このエラーが出現する原因は2つある。

原因1:関数呼び出しにおいてRが識別できない類似した不完全な引数名が渡された場合

このエラーの原因はRの引数名の処理(解釈)の独自性に由来する。Rでは関数を呼び出す際、引数名を完全に指定せず、その一部だけで指定することが可能なのである!

例えば引数aaと引数abを取る関数があったとする。

myfun<-function(aa,ab){
  aa*ab
}

通常、この関数を使用する際には以下のように引数名を完全に指定する。

> myfun(aa=5, ab=4)
[1] 20

しかし次のようい関数名を一部だけ指定して呼び出すことも可能である!

> myfun(aa=5, a=4)
[1] 20

上記の使用法がまかりとおるのは、Rが部分的にしか与えられていない引数名(ここではa)を、正式な引数名(ここではab)であると勝手に解釈してくれるからである。

しかし次のような呼び出しはエラーとなる。

> myfun(a=5,a=4)
Error in myfun(a = 5, a = 4) : 
formal argument "aa" matched by multiple actual arguments

ここでは2つの引数aが指定されており、どちらがaaでどちらがabなのか識別不可能だからである。

このように引数名の指定が不完全である場合、

formal argument “xxx” matched by multiple actual arguments

というエラーを生じるということである。

原因2:可変個引数(ellipsis引数)として指定した引数と同じ名前の引数が可変個でない通常の引数として既に定義されていた場合

ellipsis引数(例えばxxx)を指定して関数1をコールしたとする。このコールした関数1が中で更に別の関数2をコールし、関数2が更に関数3をコールするというような複雑な入れ子になっているケースを考える。ここで関数2が関数3に対して同名の引数xxxを「非」可変個引数として既に指定したらどうなるであろうか。「非」可変個引数と可変個引数という違いがあるため、これら2つの引数xxxは同名の引数が2つあると解釈されてしまい!このエラーが発生する。この場合、関数2の修正(オーバーライト)が必要となる。

参考

Attention Required! | Cloudflare
Attention Required! | Cloudflare

コメント