我正在使用'插入'库对某些树进行交叉验证。
该库提供了一个名为train
的函数,它接受一个命名参数“method”。通过它的省略号,它应该让其他参数落入它调用的另一个函数。另一个函数(rpart
)采用同名的参数“method”。
因此我希望传递两个具有相同名称的参数......而且它显然是失败的。我试图解决如下所示的问题,但我收到错误:
“train.default中的错误(x = myx,y = myy,method =”rpart2“,preProcess = NULL ,: 形式参数“方法”由多个实际参数匹配“
非常感谢任何帮助!谢谢!
train.wrapper = function(myx, myy, mytrControl, mytuneLenght, ...){
result = train(
x=myx,
y=myy,
method="rpart2",
preProcess=NULL,
...,
weights=NULL,
metric="Accuracy",
trControl=mytrControl,
tuneLength=mytuneLenght
)
return (result)
}
dtree.train.cv = train.wrapper(training.matrix[,2:1777],
training.matrix[,1],
2, method="class")
答案 0 :(得分:7)
以下是使用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首先匹配与正式参数完全相同的 的所有参数。这就是第一个“方法”参数传递给train
的原因。两个相同的参数名称会导致错误。
然后,R匹配任何与(尚未匹配的)形式参数部分匹配的参数名称。但是如果两个参数名称部分匹配相同的形式参数,那么也会导致错误。此外,它仅匹配 ...
之前的形式参数。因此必须使用全名指定 ...
之后的正式参数。
然后,未命名的参数按位置顺序与剩余的正式参数匹配。
最后,如果正式参数包含...
,则其余参数将放入...
。
PHEW!因此,在这种情况下,对tr
的调用与method
完全匹配,然后将其余内容传递到...
。当tr
然后调用rp
时,metho
参数部分匹配其形式参数method
,一切都很好!
...仍然,我会尝试联系train
的作者并指出这个问题,以便他能够正确修复它!由于“rpart”和“rpart2”应该得到支持,他一定错过了这个用例!
我认为他应该将method
参数重命名为method.
或类似(比“方法”更长)。这仍然是向后兼容的,但允许将另一个method
参数正确传递给rpart
。
答案 1 :(得分:1)
通常包装器会在命名列表中传递它们的参数。在train
的情况下,控制的提供在trControl参数中传递。也许你应该尝试:
dtree.train.cv = train.wrapper(training.matrix[,2:1777],
training.matrix[,1],
2, # will be positionally matched, probably to 'myTuneLenght'
myTrControl=list(method="class") )
在您发表评论后,我再次审核了train
和rpart
帮助页面。你认为trControl有不同的目的,你可能是正确的。我怀疑您可能需要使用公式构建您的调用,因为rpart
只有公式方法。如果y参数是一个因子而不是method =“class将由rpart
假设。并且......运行modelLookup:
modelLookup("rpart2")
model parameter label seq forReg forClass probModel
154 rpart2 maxdepth Max Tree Depth TRUE TRUE TRUE TRUE
...告诉我,默认情况下也会采用“类”方法。如果您需要进一步的建议,您可能还需要编辑您的问题以包含数据示例(可能来自rpart
帮助页面?)。