【问题标题】:Print the name of a parent function, inside the child function在子函数内部打印父函数的名称
【发布时间】:2016-03-15 10:33:33
【问题描述】:

我已经弄清楚了如何在子函数中打印父函数的代码:

a <- function(x, ...){
  print(sys.function(which=1))
  x
}
b <- function(x) a(x)
c <- function(x) a(x, param=1)

b(1)
c(1)

产量:

> b(1)
function(x) a(x)
[1] 1
> c(1)
function(x) a(x, param=1)
[1] 1

如何从子函数打印父函数的 name(或更好的调用),例如:

a <- function(x, ...){
  print(magic())
  x
}

> b(1)
b(1)
[1] 1
> c(1)
c(1)
[1] 1

?

【问题讨论】:

  • 应该多花 30 秒阅读.... sys.calls()[[1]]
  • 如果我自己想出了答案,我应该删除这个问题吗?
  • 你可以在下面发表你自己的答案

标签: r function callstack


【解决方案1】:

根据你的cmets对你自己的回答

a <- function(x, ...){
    cat("I was called by", deparse(match.call()))
    return(invisible())
}
R> a(1)
I was called by a(x = 1)

【讨论】:

  • 我如何将sys.callsmatch.call 结合起来以匹配整个调用堆栈中的每个函数?
  • 我不确定我是否理解这个问题。你为什么不问一个新的 SO 问题?
【解决方案2】:

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)"

【讨论】:

  • 好的,现在如果我想打印类似“调用我的函数是 b(1)”的内容怎么办?我似乎无法将 sys.calls()[[1]] 对象强制转换为字符。
猜你喜欢
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多