在 R 中,我需要作为参数传递给嵌套函数的函数的名称。
> fun1 <- function(f) deparse(substitute(f))
> fun2 <- function(f) fun1(f)
> fun1(mean)
[1] "mean"
> fun2(mean)
[1] "f"
>
Run Code Online (Sandbox Code Playgroud)
如何获得一个函数的名称,而与它作为参数传递给嵌套函数的次数无关?
这在堆栈的第一帧中进行替换:
fun1 <- function(f) deparse(substitute(f, sys.frame(1)))
fun2 <- function(f) fun1(f)
fun1(mean)
#[1] "mean"
fun2(mean)
#[1] "mean"
Run Code Online (Sandbox Code Playgroud)
显然,如果您不从最外层函数传递参数,这将失败:
fun3 <- function() fun2(mean)
fun3()
#[1] "f"
Run Code Online (Sandbox Code Playgroud)
如果更改参数名称也会失败:
fun2 <- function(g) fun1(g)
fun2(mean)
#[1] "f"
Run Code Online (Sandbox Code Playgroud)
但是,对于您的用例(您尚未描述)可能就足够了。
如果这些限制是一个问题,我们需要更复杂和低效的东西:
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"
Run Code Online (Sandbox Code Playgroud)
当然,这在边缘情况下仍然会中断:
fun4 <- function(mean) fun3()
fun4(2)
#[1] "2"
Run Code Online (Sandbox Code Playgroud)
你可以尝试处理它们,但我会停在这里。