我想用R中的修改参数进行递归函数调用。
recursive_function_call <- function(call) {
fun_call <- as.list(call)
fun <- fun_call[[1]]
arguments <- fun_call[-1]
## Modify Arguments
arguments$drop_option <- NULL
## Call Function
result <- do.call(what = fun, args = arguments)
return(result)
}
recursive_function_call(match.call())
Run Code Online (Sandbox Code Playgroud)
我想从类似函数的数组中调用此函数。如果从顶层函数调用此变量,则该变量fun将为类型symbol,而在底层函数调用该变量,则fun为a function。
我的问题是,do.call()当函数是符号时失败,而对于参数来说可以是符号就失败了。
我的解决方案是将符号转换为字符串。
if (is.symbol(fun_call[[1]])) fun <- as.character(fun_call[[1]]) else fun <- fun_call[[1]]
Run Code Online (Sandbox Code Playgroud)
正如您所注意到的,do.call从函数名称(或函数)和参数列表构造和调用调用表达式(并调用它)。但是你已经有了一个调用表达式,不需要do.call- 所以你可以直接使用evalor调用它eval.parent:
recursive_function_call = function(call) {
call$drop_options = NULL
eval.parent(call)
}
recursive_function_call(match.call())
Run Code Online (Sandbox Code Playgroud)
也就是说,我不确定你的函数的目的是什么。你在找Recall吗?
或者,您可以使用as.call将列表强制转换为函数调用表达式。并且,再一次,eval然后评估它:
eval.parent(as.call(fun_cal))
Run Code Online (Sandbox Code Playgroud)
— 事实上,as.call本质as.list上是调用表达式的反函数:identical(as.call(as.list(call)), call)is TRUE。