12

我想创建一个包装函数来替换一些默认参数。

这是我正在努力解决的问题的核心:

Error in localWindow(xlim, ylim, log, asp, ...) : 
  formal argument "cex" matched by multiple actual arguments

现在有点上下文。假设我为 plot 定义了一个包装函数,如下所示:

myplot <- function(x, ... ) {
    plot(x, cex= 1.5, ... )
}

如果我打电话myplot( 1:10, cex= 2 ),我会收到上述错误。我知道我可以翻到...一张清单

l <- list(...)

然后我可以做

if( is.null( l[["cex"]] ) ) l[["cex"]] <- 2

但是,我怎样才能将此列表“插入”回省略号参数?类似的东西(我知道这行不通):

... <- l

编辑:我可以在myplot定义中使用默认值(如@Thomas 的回答中所建议的那样),但我不想:函数界面会变得混乱。我想我可以定义一个这样的辅助函数:

 .myfunchelper <- function( x, cex= 2.0, ... ) {
   plot( x, cex= cex, ... )
 }

 myfunc <- function( x, ... ) {
    .myfunchelper( x, ... )
 }

但是(i)它不那么优雅并且(ii)不能满足我的好奇心。

4

1 回答 1

17

实际答案:

你可以通过一些技巧来做到这一点。首先,像以前一样定义您的函数,但在函数中包含一个带有默认参数的列表。然后,您可以将传入的任何参数解析...为列表,将默认值替换为其中的任何内容,...然后将更新的参数列表传递给do.call.

myplot <- function(x, ...) {
    args1 <- list(cex=4, main="Default Title") # specify defaults here
    inargs <- list(...)
    args1[names(inargs)] <- inargs
    do.call(plot, c(list(x=x), args1))
}

myplot(x=1:3) # call with default arguments
myplot(x=1:3, cex=2, main="Replacement", xlab="Test xlab") # call with optional arguments

早期评论:

通过几个示例函数可以看出这里的问题:

myplot1 <- function(x, ... ) {
    plot(x, cex= 1.5, ... )
}

myplot2 <- function(x, cex=3, ... ) {
    plot(x, cex=cex, ... )
}

myplot3 <- function(x, ... ) {
    plot(x, ... )
}

myplot1(1:3, cex=3) # spits your error
myplot2(1:3, cex=3) # works fine
myplot3(1:3, cex=3) # works fine

myplot2中,您指定默认值,cex但可以更改它。在myplot3,cex中简单地通过。如果您myplot2使用两个cex参数运行,您将看到您的函数 ( myplot1) 发生了什么:

myplot2(1:3, cex=3, cex=1.5) # same error as above

因此,您最好避免在 in 中设置任何默认值plot(),这样您就可以通过...in传递任何内容myplot

于 2013-06-30T12:15:15.420 回答