#r #initialization #masking #robustness
#r #инициализация #маскирование #надежность
Вопрос:
Возможно ли использовать исходные методы для среды, отличной от .GlobalEnv
?
Я постепенно начинаю немного расстраиваться из-за механизма маскировки R (я, вероятно, вернусь с собственным вопросом в этом отношении, но если вам интересно, на данный момент просто попробуйте использовать пакеты RMySQL
и RSQLite
в одном процессе и загружать их в этом порядке; это приводит к сбою моего материала RMySQL) и очень, очень хотелось бы переключиться на последовательное использование <namespace>::foo()
, а не только foo()
во всех моих скриптах.
Тем не менее, использование <namespace>::foo()
менее эффективно, чем использование «локальной копии» (например, namespace..foo <- <namespace>::foo()
; Я могу предоставить примеры для заинтересованных, но это очень легко проверить самостоятельно).
Создание локальных копий работает аналогично для других загружаемых мной пакетов, поскольку (у большинства из них) есть пространство имен, но до того, как мой собственный код превратится в «пакет», это не работает.
Итак, я подумал: «давайте просто отправим мои материалы в NS <- newenv(parent=emptyenv())
, а затем применим ту же процедуру, что и для других пакетов». Но R не позволяет мне:
setGeneric(
name="fooBar",
signature=c("src"),
def=function(src, ...){
standardGeneric("fooBar")
}
)
setMethod(
f="fooBar",
signature=signature(src="character"),
definition=function(src, ...){
cat(src, sep="n")
}
)
# These would go into:
"Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R"
"Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R"
# This works:
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R")
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R")
# This does not:
NS <- new.env(parent=emptyenv())
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R", local=NS)
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R", local=NS)
eval(parse(file="Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R"), envir=NS)
eval(parse(file="Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R"), envir=NS)
Ошибки:
> source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R", local=NS)
Error in eval.with.vis(expr, envir, enclos) :
could not find function "setGeneric"
> source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R", local=NS)
Error in eval.with.vis(expr, envir, enclos) :
could not find function "setMethod"
Есть идеи, что я могу делать неправильно?
Ответ №1:
БОЖЕ! Извините, ребята, это несколько смущает:
Я перешел на использование new.env(parent=emptyenv())
последовательно, чтобы предотвратить некоторое увеличение объема памяти при кэшировании сред, и настолько привык к этому, что забыл, что имеет смысл иметь разные родительские среды одновременно 😉
В этом случае NS <- new.env()
сработает.
Комментарии:
1. Спасибо, Хэдли, я проверю это