在调用堆栈中显示特殊的基本函数

Ben*_*nes 8 callstack r

这个问题提示了以下问题:有没有办法查看调用堆栈中的特殊基本函数?

例如,创建一个在退出时返回调用堆栈的函数:

myFun <- function(obj){
  on.exit(print(sys.calls()))
  return(obj)
}
Run Code Online (Sandbox Code Playgroud)

调用此函数并将其结果分配给对象使用assign避免使用特殊的原始函数:

> assign("myObj",myFun(4))
[[1]]
assign("myObj", myFun(4))

[[2]]
myFun(4)
Run Code Online (Sandbox Code Playgroud)

但是使用赋值运算符,它会被排除在堆栈之外

> `<-`(myObj, myFun(6))
[[1]]
myFun(6)
Run Code Online (Sandbox Code Playgroud)

当然,它可能不是所有的共同希望看到在调用栈中的赋值运算符,而其他功能,如replog也得到隐蔽

Jos*_*ien 9

我认为没有办法通过调用堆栈访问对原始函数的调用.这就是原因.

当评估"典型"R函数时:

  1. 提供的参数与正式参数匹配.
  2. 创建一个新环境(带有指向其封闭环境的指针),并将正式参数分配给它.
  3. 在新创建的环境中评估函数体.

当函数调用彼此嵌套时构建的封闭环境链是"调用堆栈"或"帧堆栈" sys.calls(),sys.frames()等等提供了一些访问.

我强烈怀疑对原始函数的调用没有出现在调用堆栈中,因为在评估过程中没有创建R端环境.没有创建环境,因此调用堆栈上不会出现任何环境.

有关更多信息,请参阅John Chambers如何描述数据分析软件第464页的原始函数的评估:

对这些函数之一的调用的评估以通常的方式开始,但是当评估器发现函数对象是原语而不是R中定义的函数时,它分支到完全不同的计算.该对象似乎只是一个带有形式参数的函数对象,并且使用字符串参数调用函数.Primitive().实际上,它实际上只包含一个表的索引,该表是实现R核心的C代码的一部分.该表的条目标识核心中的C例程,该例程负责评估对该特定原语的调用.求值程序将控制转移到该例程,并期望例程返回一个C语言指针,指向表示调用值的R对象.

  • 另请参阅`src/main/eval.c`顶部的注释 (2认同)