如果未在包装函数中指定,如何默认父函数 运行

How to make default of parent function run if not specified in a wrapper function

我正在编写一个包装函数,用于链接管道的多个步骤。我想这样做,以便用户可以输入多个选项,如果存在则输入值,否则输入 paernt 函数的默认值。

例如

orig_func1 <- function(num = 1, x=3, y=2){
   num <- (x + y)/num
   return(num)

orig_func2 <- function(num = 1, z=5, w=23){
   num <- (z - w)/num
   return(num)

现在我想创建一个包装器来执行每一个指定的次数。我希望 num 随着每次迭代而变化,作为下一个函数的输入

wrapper <- function(
   num = 1,
   steps = list(c(step = NULL, x = NULL, y = NULL),
                c(...),...){
    for (i in 1:length(steps)){
        if (steps[[i]]['step'] == "orig_func1"){
           num <- orig_func1(num = num, x = steps[[i]][['x']], y = steps[[i]][['y']]
           }
        if (steps[[i]]['step'] == "orig_func2"){
           num <- orig_func2(num = num, z = steps[[i]][['z']], y = steps[[i]][['z']]
           }
      }
  

例如,如果我尝试 运行 这个

test <- (
   num = 1,
   steps = list(c(step = orig_func1, x = 2, y = 5),
                c(step = orig_func2, z = 4, w = 6), 
                c(step = orig_func1, x = 2) # I want default for y in this case

假设我尝试 运行 这个,同时在第三步将 y 留空,因为我想要默认值,这会引发错误,因为 steps[[i]][['y']]不会被发现。如果步骤列表中不存在父函数的默认值而不在包装器中重新指定默认值,我该如何做到这一点?

您的代码不是特别清楚并且有很多错误,因此很难准确地看出您要做什么 - 例如您没有返回您在任何地方计算的数字,所以您的包装函数的输出将始终为 NULL。

我认为您尝试做的事情可以通过使用 base::do.call 以列表形式提供参数而不是像您所做的那样单独提取它们来解决。

像这样:

wrapper <- function(num = 1,
                    steps = list()){
  for (i in 1:length(steps)){
    
    step_func <- steps[[i]][["step"]] # get function from 'step' element
    
    step_args <- steps[[i]][-1] # remove 'step' element
    
    num <- base::do.call(step_func, step_args) # call function with arguments
   
  }
  
}