我有自定义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)
工作?
答案 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())
通常是警告标志。