2017-09-07 117 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

相关问题