我有一个带有许多参数的R函数fun
。我需要多次运行fun
,更改参数y
和z
,但保持其他参数相同。我没有将fun
的每次调用都包含在一个循环中,而是默认为y
和z
NA
。该函数检查is.na(y)
或is.na(z)
,如果是,则依次递归调用每个所需的y
和z
值,如下所示:
fun <- function(a=defaultA, b=defaultB, ..., y = NA, z=NA) {
if (is.na(y)) {
for (yValue in 1:maxY) {
fun(a, b, ..., y = yvalue, z = z)
}
return()
}
if (is.na(z)) {
for (zValue in 1:maxZ) {
fun(a, b, ..., y, z=zValue)
}
return()
}
stopifnot(!is.na(y) && !is.na(z))
# Part of fun that does actual work follows.
...
}
递归fun
调用实际上不方便很长,每个都有几百个字符,因为它们需要重复给予fun
的每个参数。是否有任何捷径可以通过递归方式调用fun
所有参数但保留一个,或者是否有另一种更好的方法来完成我想要做的事情?
对于好奇:我的实际fun
会生成一个图表,其中包含参数中指定的数据集和选项,y
和z
是布尔值,用于确定是否绘制特定的异常值图表。这使我可以生成图形的带有和不带异常值的版本,而无需复制函数调用或将它们包装在for循环中for (y in c(TRUE, FALSE)) {for (z in c(TRUE, FALSE)) {fun(...)}}
。
答案 0 :(得分:2)
match.call
和sys.call
是您的朋友。见Why is match call useful?
在您的情况下,这是第一个循环的重写版本:
fun <- function(a = defaultA, b = defaultB, ..., y = NA, z = NA) {
if (is.na(y)) {
mc <- match.call(expand.dots = FALSE)
for (yvalue in 1:maxY) {
mc[['y']] <- yvalue
eval(mc)
}
}
...