2011-11-17 63 views
2

我想查找使用函數的包中的所有函數。通過函數B「使用」函數我的意思是說,存在一組參數,以便functionB在給函數B給出這些參數時被調用。查找使用函數的包中的所有函數

此外,能夠控制報告結果的級別會很好。舉例來說,如果我有以下幾點:

outer_fn <- function(a,b,c) { 
    inner_fn <- function(a,b) { 
     my_arg <- function(a) { 
      a^2 
     } 
     my_arg(a) 
    } 
    inner_fn(a,b) 
} 

我可能會或可能不會在乎曾經擁有inner_fn報道。在大多數情況下可能不會,但我認爲這可能很難做到。

有人能給我這個方向嗎?

謝謝

+3

http://www.sigmafield.org/2010/09/21/r-function-of-the-day-foodweb –

+0

不錯,謝謝!我應該刪除/關閉這篇文章? –

+0

如果本張貼這個答案,你可以接受這個答案(和他得到的點:))。而且你絕對不應該關閉這個帖子。 SO也作爲信息搜尋者的儲存庫。 –

回答

3

找到函數的使用的一小步是找到函數名稱的使用位置。下面是如何做一個小例子:

findRefs <- function(pkg, fn) { 
    ns <- getNamespace(pkg) 
    found <- vapply(ls(ns, all.names=TRUE), function(n) { 
    f <- get(n, ns) 
    is.function(f) && fn %in% all.names(body(f)) 
    }, logical(1)) 

    names(found[found]) 
} 

findRefs('stats', 'lm.fit') 
#[1] "add1.lm" "aov"  "drop1.lm" "lm"  "promax" 

...再往前走你需要分析的身體,以確保它是一個函數調用或FUN參數的apply般的功能或f參數到Map等... - 所以在一般情況下,幾乎不可能找到所有合法參考...

然後,你應該確實也檢查,從該函數的環境獲取名稱返回相同的功能,你正在尋找(它可能會使用一個不同的函數具有相同的名稱)......這實際上會處理你的「內部函數」的情況。

+0

謝謝,如果我想要微調事物,這對於自定義函數似乎很有用。 –

3

(從評論升級)Mark Bravington的mvbutils軟件包中有一個非常好的功能,其中包含許多此功能,其中包括生成的調用圖的圖形表示。 This blog post給出了一個簡要說明。

+0

感謝您的參考! –