tl; dr: Правильный способ преобразования строк в кавычках в имена объектов - использовать assign()
и get()
.См. этот пост .
Длинный ответ: Ответ @dww о возможности source()
напрямую в определенную среду привел меня к изменению второго экземпляраиз eval(parse(...))
следующим образом:
# old version
source(paste0("C:/Users/JT/R/Functions/", func, ".R"))
eval(parse(text = paste0(environment, "$", func," <- ", func)))
# new version
source(
paste0("C:/Users/JT/R/Functions/", func, ".R"),
local = get(environment)
)
Ответ от @dww также заставил меня исследовать attach()
.attach()
имеет аргумент, который позволяет указать среду, в которую следует направлять вывод.Это привело меня к изменению третьего экземпляра eval(parse(...))
(ниже).Обратите внимание на использование get()
для преобразования "env"
, полученного из environment
, в env
без кавычек, которого требует attach()
.
# old version
eval(parse(text = paste0("attach(", environment, ")")))
# new version
attach(get(environment), name = environment)
Наконец, в какой-то момент этого процесса я былнапомнил, что rm()
имеет аргумент character.only
.detach()
принимает тот же аргумент, поэтому я изменил второй экземпляр eval(parse())
, как показано ниже:
# old version
eval(parse(text = paste0("detach(", environment, ")")))
# new version
detach(environment, character.only = T)
Итак, мой новый код:
# 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
detach(environment, character.only = T)
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"),
local = get(environment)
)
cat(func, "created in", environment, "\n")
})
attach(get(environment), name = environment)
cat("attached", environment, "\n\n")
}