我想为两个带有可选参数的函数编写一个包装函数。
以下是包含fun
和funA
funB
的示例
funA <- function(x = 1, y = 1) return(x+y)
funB <- function(z = c(1, 1) return(sum(z))
fun <- function(x, y, z)
如果提供fun
和x+y
,我希望x
返回y
,如果提供了矢量sum(z)
,则z
。lm
我试图了解match.call
函数如何获取此类可选参数,但目前尚不清楚如何在此处使用fun <- function(...){
inputs <- list(...)
if (all(c("x", "y") %in% inputs){
ans <- funA(x, y)
} else if ("z" %in% inputs){
ans <- funB(z)
}
。
在找到相关问题(例如How to use R's ellipsis feature when writing your own function?和using substitute to get argument name with ))之后,我想出了一个可行的解决方案。
我的解决方案就是使用
ellipsis
有更好的方法吗?
注意:也许这个问题可以作为重复内容关闭,但希望它可以用来引导其他用户找到一个好的解决方案:将我的搜索扩展到各种各样的内容会很有帮助除substitute
之外,还包括match.call
,{{1}}。
答案 0 :(得分:4)
使用missing
。如果提供了funA(x, y)
和x
,则会返回y
,如果不是funB
,则返回z
,如果提供了NULL
,如果没有提供,则返回fun <- function(x, y, z) {
if (!missing(x) && !missing(y)) {
funA(x, y)
}
else if (!missing(z)) {
funB(z)
}
funA
:
funB
这似乎回答了你提出的问题,但请注意fun
和fun
中的默认参数从未使用过,所以也许你真的想要一些不同的东西?
请注意,问题中提供的{{1}}仅在参数被命名时有效,而{{1}}在此处有效,即使它们是按位置提供的。
答案 1 :(得分:2)
我喜欢使用match.call
这样的例子。这类似于您的解决方案,但更强大。
fun <- function(...){
arg <- as.list(match.call())[-1]
f <- ifelse(length(arg)>1,"funA","funB")
do.call(f,arg)
}
fun(x=1,y=2) ## or fun(1,2) no need to give named arguments
[1] 3
> fun(z=1:10) ## fun(1:10)
[1] 55