sys.calls 有调用栈:
a <- function(x, ...){
print(sys.calls()[[1]])
return(invisible())
}
b <- function(x) a(x)
c <- function(x) a(x, param=1)
b(1)
c(1)
产量:
> b(1)
b(1)
> c(1)
c(1)
稍微扩展一下我的回答,并使用 Alex 的回答,以下是打印给定函数的当前调用、父调用和根调用的方式:
a <- function(x, named, ...){
call_stack <- sys.calls()
call_stack_dots_expanded <- lapply(1:length(call_stack), function(i){
match.call(definition=sys.function(i), call=call_stack[[i]], envir=sys.frames()[[i]])
})
call_stack_as_text <- lapply(call_stack_dots_expanded, deparse)
me <- call_stack_as_text[length(call_stack_as_text)]
parent <- call_stack_as_text[length(call_stack_as_text) - 1]
root <- call_stack_as_text[1]
print(paste('My call is', me))
print(paste('My parent call is', parent))
print(paste('My root call is', root))
return(invisible())
}
b <- function(x, named, ...) a(x, named, ...)
c <- function(x, named, ...) b(x, named, ...)
d <- function(x, named, ...) c(x, named, ...)
e <- function(x, named, ...) d(x, named, ...)
f <- function(x, named, ...) e(x, named, ...)
f(1, named=1, unnamed=2)
产量:
> f(1, named=1, unnamed=2)
[1] "My call is a(x = x, named = named, unnamed = 2)"
[1] "My parent call is b(x = x, named = named, unnamed = 2)"
[1] "My root call is f(x = 1, named = 1, unnamed = 2)"
现在要弄清楚的最后一件事是如何将参数值一直打印到堆栈中:
> f(1, named=1, unnamed=2)
[1] "My call is a(x = 1, named = 1, unnamed = 2)"
[1] "My parent call is b(x = 1, named = 1, unnamed = 2)"
[1] "My root call is f(x = 1, named = 1, unnamed = 2)"