提问人:dag 提问时间:5/5/2020 更新时间:5/8/2020 访问量:60
如何提取有关呼叫堆栈上游的分配信息?
How can I extract information on an assignment further up the call stack?
问:
对于更大的 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()
非常感谢对更多资源的提示或指针。
谢谢!
答:
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 解释器的调用堆栈。不需要口译的电话不会通过那里。谁能证实?
评论