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

Nested functions in parse(eval(...), envir = custom)

我有自定义 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) 工作?

您的问题是 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())通常是警告标志。