如何在调用堆栈中进一步提取有关分配的信息?
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 <- 1
(返回 f())及其前缀形式 `<-`("x", 1)
(返回 1)都破坏了我的解决方案。我觉得这很令人费解,因为所有三个函数(<-
、`<-`()
和 assign()
)都有相似的抽象语法树。无论如何,我的代码的用户应该遵循常规的分配模式,并且根本不会注意到任何事情。
非常感谢您提供更多资源的提示或指针。
谢谢!
【问题讨论】:
【参考方案1】:经过更多的实验,我相信我已经找到了答案。赋值运算符<-
是一个原始函数。它在 C 中预编译。相比之下,函数assign()
不是原始的。显然,原始函数不通过相同的调用堆栈。再举一个例子:
is.primitive(`+`) # TRUE
add <- function()
print(sys.calls())
1
is.primitive(add) # FALSE
(1 + add()) # `+` doesn't show
输出让我相信 sys.*** 系列函数读取了 R 解释器的调用堆栈。不需要翻译的电话不会通过那里。谁能确认一下?
【讨论】:
以上是关于如何在调用堆栈中进一步提取有关分配的信息?的主要内容,如果未能解决你的问题,请参考以下文章
linux应用中,在一个进程内如何获取本进程内其它线程的堆栈信息、
如何跳过重复索引上的错误并继续在 MongoDB 中进一步添加文档(pymongo)