我正在使用一个看起来像
的可变深度的调用堆栈TopLevelFunction
-> <SomeOtherFunction(s), 1 or more>
-> AssignmentFunction
现在,我的目标是将AssignmentFunction
中创建的变量分配给TopLevelFunction
的环境。我知道我可以用sys.calls
提取堆栈,所以我目前的方法是
# get the call stack and search for TopLevelFunction
depth <- which(stringr::str_detect(as.character(sys.calls()), "TopLevelFunction"))
# assign in TopLevelFunction's environment
assign(varName, varValue, envir = sys.frame(depth))
我或多或少对此很好,但我不确定将调用对象转换为字符向量是否是个好主意。这种方法容易出错吗?更一般地说,如何只知道函数的名称,您将如何搜索特定的父环境?
答案 0 :(得分:1)
像这样的fn
get_toplevel_env <- function(env) {
if (identical(parent.env(env), globalenv())) {
env
} else {
get_toplevel_env(parent.env(env))
}
}
并在你的嵌套函数的任何级别中使用它吗?
get_toplevel_env(as.environment(-1))
答案 1 :(得分:0)
我不确定我是否理解你想做什么,但是,使用parent.env(as.environment(-1))
是否有用?
在这个例子中它似乎有效。
fn1 <- function() {
fn1.1 <- function(){
assign("parentvar", "PARENT",
envir = parent.env(as.environment(-1)))
}
fn1.1()
print(parentvar)
}
fn1()
我认为可能还有其他可能性是使用<<-
来分配全球环境。但也许这不是你想要的。