这是您的问题的模型tr
(训练)函数调用rp
(rpart) 函数,传递它...
:
rp <- function(method, ...) method
tr <- function(method, ...) rp(...)
# we want to pass 2 to rp:
tr(method=1, method=2) # Error
tr(1, method=2) # 1, (wrong value!)
tr(method=1, metho=2) # 2 (Yay!)
这是什么魔法?为什么最后一个案例确实有效?!好吧,我们需要了解 R 中参数匹配的工作原理。函数f <- function(foo, bar)
据说有形式参数“foo”和“bar”,以及调用f(foo=3, ba=13)
据说有(实际)论点“foo”和“ba”。
R 首先匹配所有具有以下参数的参数exactly与形式参数同名。这就是为什么第一个“方法”参数被传递给train
。两个相同的参数名称会导致错误。
然后,R 匹配任何部分匹配(但不匹配)形式参数的参数名称。但是,如果两个参数名称部分匹配相同的形式参数,也会导致错误。而且,它只匹配形式参数before ...
。所以形式参数after ...
必须使用他们的全名来指定。
然后,未命名的参数按位置顺序与其余的正式参数进行匹配。
最后,如果正式参数包括...
,剩余的参数被放入...
.
PHEW!所以在这种情况下,调用tr
完全匹配method
,然后将其余的传递给...
. When tr
然后打电话rp
, the metho
参数部分匹配其形式参数method
,一切都很好!
...Still,我会尝试联系作者train
并指出这个问题,以便他能够正确解决!由于应该支持“rpart”和“rpart2”,所以他一定错过了这个用例!
我认为他应该重新命名method
参数为method.
或类似的东西(任何比“方法”长的东西)。这仍然是向后兼容的,但允许另一个method
参数要正确传递给rpart
.