我不明白为什么这段代码在最后打印的一行上失败了:
f <- function(x) get('v', envir = parent.frame(), inherits = TRUE)
run <- function() {
v <- 'test variable'
print(f())
print((function() f())())
print(apply(X = data.frame(1:2), MARGIN = 1, f))
}
run()
与:
Error in get("v", envir = parent.frame(), inherits = TRUE) :
object 'v' not found
第一个打印语句显示 v
在 parent.frame(1)
中找到。第二个打印语句显示 v
由于 inherits = TRUE
而在 parent.frame(2)
中找到。最后一个是谜。
似乎 apply
忽略了 get(envir = parent.frame())
。我将其追溯到 apply()
中的函数 forceAndCall()
。我是否遗漏了什么或者这是一个错误?
在实际应用中,v
只定义在函数f
的调用环境中(即在parent.frame()
或以上) ),但永远不会在 parent.env()
中。
最佳答案
不传递解决方案,但它避免了错误。
parent.frame
的手册说:sys.frame(sys.parent(n))
的方便简写。使用 sys.frame(sys.parent(n))
会导致相同的错误。但是,当我请求 sys.parents()
并在最后一个错误消失之前取一个时,或者简单地使用 dynGet
,正如@DavorJosipovic 所发现的。
#f <- function(x) get('v', envir = sys.frame(max(0, sys.parents()[length(sys.parents())-1])), inherits = TRUE)
f <- function(x) dynGet('v', inherits = TRUE)
run <- function() {
v <- 'test variable'
print(f())
print((function() f())())
print(apply(X = data.frame(1:2), MARGIN = 1, f))
}
run()
#[1] "test variable"
#[1] "test variable"
#[1] "test variable" "test variable"
关于r - apply() 和 forceAndCall() 忽略 parent.frame() 中的 get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57672803/