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

问题描述 投票:0回答:1

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

r recursion
1个回答
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)
    }
  }
  ...
© www.soinside.com 2019 - 2024. All rights reserved.