match.call()返回函数或符号,但do.call()不能使用符号

nde*_*vln 5 r

我想用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)
  1. 有没有更好的方法来获取调用对象的功能?
  2. 将符号转换为字符串后,有没有办法检查符号是否可用?还是可以避免转换?

Kon*_*lph 5

正如您所注意到的,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