解析中的嵌套函数(eval(...),envir = custom)

时间:2016-12-08 22:14:21

标签: r environment scoping non-standard-evaluation

我有自定义R环境

e = new.env()
e[["a"]] = function(x) b(x)
e[["b"]] = function(x) x + 1

函数b()按预期运行。

> eval(parse(text = "b(1)"), envir = e)
[1] 2

但是a(1)会抛出错误。

> eval(parse(text = "a(1)"), envir = e)
Error in a(1) : could not find function "b"

如何让eval(parse(text = "a(1)"), envir = e)工作?

1 个答案:

答案 0 :(得分:3)

您的问题是R中的函数跟踪创建它们的环境。当您在任何其他上下文之外调用function()语句时,该函数将在全局环境中创建,然后您将该函数分配给不同的环境,但它不会更改最初定义的位置。观察

e = new.env()
e[["a"]] = function(x) b(x)

environment(e[["a"]])
# <environment: R_GlobalEnv>

identical(e, environment(e[["a"]]))
# [1] FALSE

因此该函数仍将使用全局环境(而不是e环境)来解析符号。您可以使用

显式更改环境
environment(e[["a"]]) <- e

或者首先使用evalq

在环境中创建它
 evalq(a <- function(x) b(x), e)
 evalq(b <- function(x) x + 1, e)

 identical(e, environment(e[["a"]]))
 # [1] TRUE

但你确定这是你问题的最佳设计吗?似乎有点迟钝。看eval(parse())通常是警告标志。