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