-1

我有一个自定义的 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)去上班?

4

1 回答 1

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())通常是一个警告标志。

于 2016-12-08T22:21:06.847 回答