簡體   English   中英

match.call() 返回一個 function 或者一個符號,但是 do.call() 不能使用符號

[英]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]]
  1. 有沒有更好的方法來獲取調用 object 的 function?
  2. 將符號轉換為字符串后,有沒有辦法檢查符號是否可用? 或者我可以避免轉換嗎?

如您所見, do.call從 function 名稱(或函數)和 arguments 列表構造並調用調用表達式(並調用它)。 但是你已經有了一個調用表達式,不需要do.call ——所以你可以使用evaleval.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM