我想创建一个替换一些默认参数的包装函数。
这是我正在努力解决的问题的核心:
Error in localWindow(xlim, ylim, log, asp, ...) :
formal argument "cex" matched by multiple actual arguments
现在有点上下文。假设我为这样的情节定义了一个包装函数:
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)不满足我的好奇心。
答案 0 :(得分:12)
实际答案:
你可以通过一些技巧来做到这一点。首先,像以前一样定义您的函数,但在函数内包含一个包含默认参数的列表。然后你可以通过...
作为列表解析任何参数,用...
中的任何内容替换默认值,然后通过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
因此,您最好避免在plot()
中设置任何默认值,这样您就可以通过...
中的myplot
传递任何内容。