2017-09-07 46 views
-1

在R中,我需要一個作爲參數傳遞給嵌套函數的函數的名稱。獲取作爲參數傳遞給R中嵌套函數的函數的名稱

> fun1 <- function(f) deparse(substitute(f)) 
> fun2 <- function(f) fun1(f) 
> fun1(mean) 
[1] "mean" 
> fun2(mean) 
[1] "f" 
> 

如何獲取獨立於作爲嵌套函數參數傳遞次數的函數名稱?

+2

並非所有函數都有名稱。 'fun1(function(x)x)'會返回什麼?說出你希望以更大規模而不是這個特定的技術細節來完成,可能會更好。在R中可能有更好的方法安全可靠地完成工作。 – MrFlick

回答

4

這確實是堆棧上的第一幀替代:

fun3 <- function() fun2(mean) 
fun3() 
#[1] "f" 

fun1 <- function(f) deparse(substitute(f, sys.frame(1))) 

fun2 <- function(f) fun1(f) 

fun1(mean) 
#[1] "mean" 
fun2(mean) 
#[1] "mean" 

顯然,如果你不通過從最外層函數的參數,這將失敗如果也將失敗,如果更改參數名:

fun2 <- function(g) fun1(g) 
fun2(mean) 
#[1] "f" 

但是,它可能作爲s對你的用例來說很有效(你沒有描述過)。

如果這些限制是一個問題,我們需要一些更復雜和低效:

fun1 <- function(f) { 

    fr <- rev(sys.frames()) 

    f <- substitute(f, fr[[1]]) 

    #loop over the frame stack 
    for (i in seq_along(fr)[-1]) { 
    f <- eval(bquote(substitute(.(f), fr[[i]]))) 
    } 

    deparse(f) 
} 

fun2 <- function(g) fun1(g) 

fun3 <- function() fun2(mean) 

fun1(mean) 
#[1] "mean" 
fun2(mean) 
#[1] "mean" 
fun3() 
#[1] "mean" 

當然,這仍然會在邊緣的情況下突破:

fun4 <- function(mean) fun3() 
fun4(2) 
#[1] "2" 

你可以嘗試處理它們,但我會在這裏停下來。

+0

所有這些約束條件對我來說都是不可接受的。 – frank

+0

@frank看我的編輯 – Roland

相關問題