[英]match.call() returns a function or a symbol, but symbols can't be used by do.call()
我想在 R 中使用修改后的 arguments 進行遞歸 function 調用。
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())
我想從一系列類似函數中調用這個 function。 如果這是從頂級 function 調用的,則變量fun
將是symbol
類型,而在較低級別 function 上調用 fun 將是function
。
我的問題是,當 function 是符號時do.call()
失敗,而對於 arguments 來說,它可以是符號。
我的解決方案是將符號轉換為字符串。
if (is.symbol(fun_call[[1]])) fun <- as.character(fun_call[[1]]) else fun <- fun_call[[1]]
如您所見, do.call
從 function 名稱(或函數)和 arguments 列表構造並調用調用表達式(並調用它)。 但是你已經有了一個調用表達式,不需要do.call
——所以你可以使用eval
或eval.parent
直接調用它:
recursive_function_call = function(call) {
call$drop_options = NULL
eval.parent(call)
}
recursive_function_call(match.call())
也就是說,我不確定您的功能的目的是什么。 您在尋找Recall
嗎?
或者,您可以使用as.call
將列表強制轉換為 function 調用表達式。 並且, eval
再一次對其進行評估:
eval.parent(as.call(fun_cal))
— 實際上, as.call
本質上是調用表達式上as.list
的逆: identical(as.call(as.list(call)), call)
為TRUE
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.