我编写了一个函数,用于获取包含其他函数脚本的文件,并将这些函数存储在另一个环境中,以避免混杂在全局环境中。代码可以运行,但是包含三个 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(...))
结构的亚优化问题已经被写出(请参见这里和这里)。然而,我发现的大部分讨论都是关于替代子集策略的。我的代码中第一个和第三个eval(parse(...))
实例不涉及子集(第二个实例可能与子集有关)。是否有一种方法可以调用
new.env(...)
、[environment name]$[function name] <- [function name]
和attach(...)
而不必使用eval(parse(...))
?谢谢。注:我不想改变我的函数名称为
.name
以在全局环境中隐藏它们。
eval(parse(text = paste0("detach(", environment, ")")))
可以被替换为detach(environment, character.only = T)
。关于改进eval(parse(text = paste0("attach(", environment, ")")))
的问题仍然存在。 - Josh