r - apply() 和 forceAndCall() 忽略 parent.frame() 中的 get()

标签 r apply

我不明白为什么这段代码在最后打印的一行上失败了:

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 

第一个打印语句显示 vparent.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/

相关文章:

python - 将包含 if 的函数应用于 pandas 中数据帧的每一行,无需 for 循环

python-3.x - Python使用apply函数跳过Nan

macos - 如何在不调用 system() 的情况下从 R 读取我的 mac 地址

r - 在应用族函数中使用反引号和运算符

python - 应用的 Pandas 替代方案 - 基于多列创建新列

python - 如何使用 pandas 数据框的 if 条件

r - 标记每第 n 个刻度线

r - 将 data.frame 转换为 ff

删除最后一个数字之后的所有字符

在 Shiny 启动时跨选项卡呈现传单标记