这个问题提示了以下问题:有没有办法查看调用堆栈中的特殊基本函数?
例如,创建一个在退出时返回调用堆栈的函数:
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)
当然,它可能不是所有的共同希望看到在调用栈中的赋值运算符,而其他功能,如rep和log也得到隐蔽
我认为没有办法通过调用堆栈访问对原始函数的调用.这就是原因.
当评估"典型"R函数时:
当函数调用彼此嵌套时构建的封闭环境链是"调用堆栈"或"帧堆栈" sys.calls(),sys.frames()等等提供了一些访问.
我强烈怀疑对原始函数的调用没有出现在调用堆栈中,因为在评估过程中没有创建R端环境.没有创建环境,因此调用堆栈上不会出现任何环境.
有关更多信息,请参阅John Chambers如何描述数据分析软件第464页的原始函数的评估:
对这些函数之一的调用的评估以通常的方式开始,但是当评估器发现函数对象是原语而不是R中定义的函数时,它分支到完全不同的计算.该对象似乎只是一个带有形式参数的函数对象,并且使用字符串参数调用函数.Primitive().实际上,它实际上只包含一个表的索引,该表是实现R核心的C代码的一部分.该表的条目标识核心中的C例程,该例程负责评估对该特定原语的调用.求值程序将控制转移到该例程,并期望例程返回一个C语言指针,指向表示调用值的R对象.