【发布时间】:2019-03-29 22:03:43
【问题描述】:
我编写了一个函数,它可以获取包含其他函数脚本的文件,并将这些函数存储在另一个环境中,这样它们就不会弄乱全局环境。该代码有效,但包含eval(parse(...)) 的三个实例:
# sourceFunctionHidden ---------------------------
# source a function and hide the function from the global environment
sourceFunctionHidden <- function(functions, environment = "env", ...) {
if (environment %in% search()) {
while (environment %in% search()) {
if (!exists("counter", inherits = F)) counter <- 0
eval(parse(text = paste0("detach(", environment, ")")))
counter <- counter + 1
}
cat("detached", counter, environment, "s\n")
} else {cat("no", environment, "attached\n")}
if (!environment %in% ls(.GlobalEnv, all.names = T)) {
assign(environment, new.env(), pos = .GlobalEnv)
cat("created", environment, "\n")
} else {cat(environment, "already exists\n")}
sapply(functions, function(func) {
source(paste0("C:/Users/JT/R/Functions/", func, ".R"))
eval(parse(text = paste0(environment, "$", func," <- ", func)))
cat(func, "created in", environment, "\n")
})
eval(parse(text = paste0("attach(", environment, ")")))
cat("attached", environment, "\n\n")
}
关于eval(parse(...)) 构造的次优性已经写了很多(参见here 和here)。但是,我发现的讨论主要涉及子集的替代策略。我的代码中eval(parse(...)) 的第一个和第三个实例不涉及子集(第二个实例可能与子集有关)。
有没有办法在不求助于eval(parse(...)) 的情况下调用new.env(...)、[environment name]$[function name] <- [function name] 和attach(...)?谢谢。
注意:我不想将我的函数名称更改为 .name 以将它们隐藏在全局环境中
【问题讨论】:
-
刚刚发现
eval(parse(text = paste0("detach(", environment, ")")))可以换成detach(environment, character.only = T)。关于改进eval(parse(text = paste0("attach(", environment, ")")))的问题仍然存在。