【问题标题】:R scoping question: Object exists but I can't do anything with itR 范围问题:对象存在,但我无能为力
【发布时间】:2022-03-02 19:31:16
【问题描述】:

我想将一个函数的值提供给我在第一个函数内部调用的另一个函数,但我似乎无法正确确定范围。至关重要的是,这两个函数是分开定义的。这是一个例子:

little_fun <- function(){
    print(paste("CheckNumber exists in parent frame =", exists("CheckNumber", where = parent.frame())))
    print(paste("CheckNumber exists in current frame =", exists("CheckNumber")))
    if(exists("CheckNumber", where = parent.frame())){
        print(CheckNumber + 2)
    }
}

单独运行little_fun() 会返回

[1] "CheckNumber exists in parent frame = FALSE"
[1] "CheckNumber exists in current frame = FALSE"

这是我所期望的。但是,我想做一个更复杂的函数,在内部调用 little_fun。

big_fun <- function(y){
    CheckNumber <- 5
        little_fun()
}

调用 big_fun 会返回:

[1] "CheckNumber exists in parent frame = TRUE"
[1] "CheckNumber exists in current frame = FALSE"
 Error in print(CheckNumber + 2) : object 'CheckNumber' not found

对我来说,CheckNumber 存在于父框架中但不存在于当前框架中是有意义的。但是CheckNumber如何存在于父框架中但不能用于添加到2?我认为 R 会继续爬升环境树,直到找到所需的变量。这是怎么回事?

【问题讨论】:

    标签: r scoping


    【解决方案1】:

    关键是 CheckNumber 存在于父 frame 中(从那里调用 little_fun)但不在 parent environment 中(其中定义了 little_fun)。

    在 little_fun 中使用附加代码进行测试:

    little_fun <- function(){
        print(paste("CheckNumber exists in parent frame =",
                    exists("CheckNumber", where = parent.frame())))
        ## present in parent environment?
        print(paste("CheckNumber exists in parent environment =",
                    exists("CheckNumber", where = parent.env(environment()))))
        print(paste("CheckNumber exists in current frame =", exists("CheckNumber")))
        if(exists("CheckNumber", where = parent.frame())){
            print(CheckNumber + 2)
        }
    }
    

    要使 CheckNumber 可用,请将其定义在与 little_fun 相同或更高级别的环境中,而不是在同级环境中(big_fun 是全局环境中 little fun 的同级,除非您例如定义 @987654330 @里面big_fun)。

    无论如何,将值作为函数参数提供——little_fun(CheckNumber = 5)——将防止函数在父环境中摸索同名变量。除了函数参数之外,依赖于变量的函数不容易被其他代码重用。

    (Hadley Wickhams Advanced RChapter 7 "Environments" 中的背景说明。)

    【讨论】:

    • 谢谢你,@I_O!我一直在为环境和框架之间的差异而苦苦挣扎。这解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2010-10-11
    • 2012-05-29
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多