get(…,inherits=TRUE)不';在封闭范围内找不到变量

get(…,inherits=TRUE)不';在封闭范围内找不到变量,r,R,如果在全局REPL作用域中定义了y,但未找到y,则以下操作有效: f = function() { print(get('y', inherits=TRUE)) } g = function() { y = 3 f() } 我认为inherits=TRUE(这是默认值)应该检查调用堆栈,包括封闭范围 我怎样才能让它工作?上下文是,我正在使用的库在解析公式时使用get(),而当我尝试在我编写的函数中以编程方式执行该操作时,交互工作失败。添加envir=parent.fra

如果在全局REPL作用域中定义了
y
,但未找到
y
,则以下操作有效:

f = function() {
    print(get('y', inherits=TRUE))
}
g = function() {
    y = 3
    f()
}
我认为
inherits=TRUE
(这是默认值)应该检查调用堆栈,包括封闭范围


我怎样才能让它工作?上下文是,我正在使用的库在解析公式时使用get(),而当我尝试在我编写的函数中以编程方式执行该操作时,交互工作失败。

添加
envir=parent.frame()
get

f=函数(){
打印(get('y',inherits=TRUE,envir=parent.frame())
}
g=函数(){
y=3
f()
}
g()
#> [1] 3

由(v0.3.0)于2020-06-29创建的

看起来您想使用
dynGet
而不是
get
。另请参见:添加
envir=parent.frame()
仅对一个级别返回有效,对更多级别无效:
f=function(){print(get('y',inherits=TRUE,envir parent.frame())};g=函数(){f()};h=函数(){y=3;g()};h()
dynGet
仍将工作:
f=function(){print(dynGet('y'))};g=函数(){f()};h=函数(){y=3;g()};h()
。但是
dynGet
有些实验性,使用时要谨慎。@GKi正是如此
parent.frame()
实际上可以回溯指定数量的代-您可以执行
parent.frame(2)
等操作。通常,这对于包内的作用域是足够的控制-但是当然,可能会出现不同方法更合适的情况。