r语言 - 如果没有在包装器函数中指定,如何使父函数默认运行



我正在编写一个包装器函数,其中我链接管道的多个步骤。我想让它,所以用户可以输入多个选项,如果值将被输入,否则父函数的默认值。

例如

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空白,因为我想要默认值,这将抛出一个错误,因为步骤[[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

}

}

最新更新