【发布时间】:2020-09-15 15:15:34
【问题描述】:
我想在环境中评估一些代码
访问库(.GlobalEnv 以上的所有环境)但没有
访问在.GlobalEnv 中创建的对象。
我尝试了几种解决方案,但似乎都没有按预期工作
1。 .GlobalEnv 中的新环境
在.GlobalEnv创建的这里环境可以访问其他
.GlobalEnv 中的对象。
.GlobalEnv$ee <- environment()
eval(
parse(text = "library(dplyr);mutate(iris, x = 1)"),
envir = .GlobalEnv$ee
)
var_in_global <- "x"
eval(
expr = parse(text = "ls()"),
envir = .GlobalEnv$ee
) # expect empty
eval(
expr = parse(text = "print(var_in_global)"),
envir = ee
) # expect error
2。作为 .GlobalEnv 子的新环境
这个编码方式不同,但结果与第一个相同
ee <- new.env(parent = globalenv())
eval(
parse(text = "library(dplyr);mutate(iris, x = 1)"),
envir = ee
)
var_in_global <- "x"
eval(
expr = parse(text = "ls()"),
envir = ee
)
eval(
expr = parse(text = "print(var_in_global)"),
envir = ee
)
3。作为全局父级的新环境
在这种情况下,环境无权访问 .GlobalEnv 对象
但是之后加载的库会附在下面,所以环境不会
也可以访问这些库。
ee <- new.env(parent = parent.env(globalenv()))
eval(
parse(text = "library(dplyr);mutate(iris, x = 1)"),
envir = ee
)
var_in_global <- "x"
eval(
expr = parse(text = "ls()"),
envir = ee
)
eval(
expr = parse(text = "print(var_in_global)"),
envir = ee
)
4。使用库(..., pos = 3)
使用@Allan Cameron 的回答,我试图让这段代码正常工作。并且library(dplyr);mutate(...) 在新环境中被正确评估。
ee <- new.env(parent = parent.env(globalenv()))
eval(
parse(text = "library <- function(...) base::library(..., pos = 3)"),
envir = ee
)
eval(
parse(text = "library(dplyr);mutate(iris, x = 1)"),
envir = ee
)
var_in_global <- "x"
eval(
expr = parse(text = "ls()"),
envir = ee
)
eval(
expr = parse(text = "print(var_in_global)"),
envir = ee
)
但是,问题要深得多。一些包有更多的依赖项,这些依赖项是一起加载的。考虑这个例子,我用library(Hmisc);impute(...) 替换了library(dplyr);mutate()。此示例失败 - 找不到 impute 函数(这是错误的)
ee <- new.env(parent = parent.env(globalenv()))
eval(
parse(text = "library <- function(...) base::library(..., pos = 3)"),
envir = ee
)
eval(
parse(text = "library(Hmisc);impute(iris[,1], 1)"),
envir = ee
) # expect to work
你有什么想法如何制作一个环境 与全局“并行”节点,并且之前还附加了库?
【问题讨论】:
标签: r