我有一个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(...)}}
。
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)
}
}
...