如何提取有关呼叫堆栈上游的分配信息?

How can I extract information on an assignment further up the call stack?

提问人:dag 提问时间:5/5/2020 更新时间:5/8/2020 访问量:60

问:

对于更大的 R Shiny 应用程序中的场景进程背后,我想恢复用户分配给的名称。

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

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

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

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

谢谢!

r 变量 值赋值运算符 调用堆栈

评论


答:

0赞 dag 5/8/2020 #1

经过更多的实验,我相信我已经找到了答案。赋值运算符是一个基元函数。它以 C 语言预编译。相反,该函数不是原始的。显然,基元函数不会通过相同的调用堆栈。再举一个例子:<-assign()

is.primitive(`+`) # TRUE
add <- function() {
  print(sys.calls())
  1
}
is.primitive(add) # FALSE
(1 + add()) # `+` doesn't show

输出使我相信 sys.*** 系列函数读取 R 解释器的调用堆栈。不需要口译的电话不会通过那里。谁能证实?