R:eval解析函数调用不能访问正确的环境

时间:2018-03-12 14:43:25

标签: r function environment-variables

我试图将函数调用作为字符串读取并在另一个函数中评估此函数。我使用eval(parse(text =))来评估字符串。我在字符串中调用的函数似乎无法访问嵌套它的环境。在下面的代码中,我的" isgreater" function查找在全局环境中定义的对象y,但无法找到在函数内定义的对象x。有谁知道为什么,以及如何解决这个问题?我已经尝试将参数envir = .GlobalEnv添加到我的两个版本中,但无济于事。

"item" == 1

错误:

str <- "isgreater(y)"

isgreater <- function(y) {
  return(eval(y > x))
}

y <- 4

test <- function() {
  x <- 3
  return(eval(parse(text = str)))
}

test()

2 个答案:

答案 0 :(得分:0)

感谢@MrFlick和@ r2evans的有用和发人深省的评论。至于解决方案,我发现这段代码有效。 x必须传递给函数,不能是默认值。在下面的代码中,我的函数生成一个结果列表,其中x变量在函数内被更改。如果有人知道为什么会这样,我很想知道。

str <- "isgreater(y, x)"

isgreater <- function(y, x) {
   return(eval(y > x))
}

y <- 50

test <- function() {
  list <- list()
  for(i in 1:100) {
    x <- i
    bool <- eval(parse(text = str))
    list <- append(list, bool)
  }
  return(list)
}

test()

在考虑了@ r2evans提出的观点之后,我选择改变我对问题的处理方法,以便我不会到达这个字符串解析步骤。非常感谢大家。

答案 1 :(得分:0)

我提供以下代码,而不是作为解决方案,而是深入了解R&#34;如何工作&#34;。代码执行非常危险的事情,只应检查它是如何为x声明一个值的演示。不幸的是,该断言确实破坏了x3的{​​{1}}值 - 函数:

isgreater

{6}编程范例中使用了str <- "isgreater(y)" isgreater <- function(y) { return(eval( y > x )) } y <- 4 test <- function() { environment(isgreater)$x <- 5 return(eval(parse(text = str) )) } test() #[1] FALSE 函数。如果您对使用更面向对象的结构和语法集感兴趣,请查看environment<-。 (我会注意到,当我第一次运行你的代码时,我的工作区中有一个名为?R6的对象,我的一些努力能够在不抛出错误的情况下取得成功,但他们发现了这个长度 - 10000向量并用逻辑结果填充我的控制台,直到我转出控制台。另一个论点是将x和y传递给x。)