使用许多参数简单递归调用函数,只更改一个参数

时间:2017-03-29 14:16:09

标签: r recursion

我有一个带有许多参数的R函数fun。我需要多次运行fun,更改参数yz,但保持其他参数相同。我没有将fun的每次调用都包含在一个循环中,而是默认为yz NA。该函数检查is.na(y)is.na(z),如果是,则依次递归调用每个所需的yz值,如下所示:

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会生成一个图表,其中包含参数中指定的数据集和选项,yz是布尔值,用于确定是否绘制特定的异常值图表。这使我可以生成图形的带有和不带异常值的版本,而无需复制函数调用或将它们包装在for循环中for (y in c(TRUE, FALSE)) {for (z in c(TRUE, FALSE)) {fun(...)}}

1 个答案:

答案 0 :(得分:2)

match.callsys.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)
    }
  }
  ...