如何在调用堆栈中进一步提取有关分配的信息?

Posted

技术标签:

【中文标题】如何在调用堆栈中进一步提取有关分配的信息?【英文标题】:How can I extract information on an assignment further up the call stack? 【发布时间】:2020-08-20 01:01:01 【问题描述】:

对于大型 R Shiny 应用程序中的幕后流程,我想恢复用户分配的名称。

例如,如果用户将值 1 绑定到名称 x (x <- 1),那么我想从调用堆栈中提取名称“x”。在对 R 中的函数评估和调用堆栈环境(here、here、here 和 ?sys.parent)进行一些研究之后,我已经能够整理出部分解决方案。它返回一个可以使用 rlang 包进行操作的调用类对象。

f <- function() sys.call(which = 1)
(assign("x", f()))

尽管如此,赋值运算符 x &lt;- 1(返回 f())及其前缀形式 `&lt;-`("x", 1)(返回 1)都破坏了我的解决方案。我觉得这很令人费解,因为所有三个函数(&lt;-`&lt;-`()assign())都有相似的抽象语法树。无论如何,我的代码的用户应该遵循常规的分配模式,并且根本不会注意到任何事情。

非常感谢您提供更多资源的提示或指针。

谢谢!

【问题讨论】:

【参考方案1】:

经过更多的实验,我相信我已经找到了答案。赋值运算符&lt;- 是一个原始函数。它在 C 中预编译。相比之下,函数assign() 不是原始的。显然,原始函数不通过相同的调用堆栈。再举一个例子:

is.primitive(`+`) # TRUE
add <- function() 
  print(sys.calls())
  1

is.primitive(add) # FALSE
(1 + add()) # `+` doesn't show

输出让我相信 sys.*** 系列函数读取了 R 解释器的调用堆栈。不需要翻译的电话不会通过那里。谁能确认一下?

【讨论】:

以上是关于如何在调用堆栈中进一步提取有关分配的信息?的主要内容,如果未能解决你的问题,请参考以下文章

linux应用中,在一个进程内如何获取本进程内其它线程的堆栈信息、

如何在这个 8 皇后算法中进一步推进?

如何重载 new 运算符以在堆栈上分配? [关闭]

如何跳过重复索引上的错误并继续在 MongoDB 中进一步添加文档(pymongo)

如何在 JSP 页面中从 Java 类中设置 hashmap 的值以便在控制器中进一步使用

C++:编译器如何知道为每个堆栈帧分配多少内存?