按函数名称查找调用堆栈中的父环境

时间:2015-08-17 08:54:09

标签: r callstack

我正在使用一个看起来像

的可变深度的调用堆栈
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))

我或多或少对此很好,但我不确定将调用对象转换为字符向量是否是个好主意。这种方法容易出错吗?更一般地说,如何只知道函数的名称,您将如何搜索特定的父环境?

2 个答案:

答案 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()

我认为可能还有其他可能性是使用<<-来分配全球环境。但也许这不是你想要的。