具有相同名称的命名参数

时间:2012-05-13 20:44:36

标签: r

我正在使用'插入'库对某些树进行交叉验证。

该库提供了一个名为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")

2 个答案:

答案 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") )

在您发表评论后,我再次审核了trainrpart帮助页面。你认为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帮助页面?)。