Методы поиска в среде, отличной от .GlobalEnv - PullRequest
2 голосов
/ 11 ноября 2011

Можно ли использовать методы в среде, отличной от .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 Ответ

3 голосов
/ 11 ноября 2011

OMG! Простите, ребята, это несколько смущает:

Я последовательно перешел на использование new.env(parent=emptyenv()), чтобы избежать некоторого всплеска памяти при кэшировании, и настолько привык к этому, что я забыл, что имеет смысл иметь разные родительские envir одновременно; -)

В этом случае NS <- new.env() сделает свое дело.

...