Ошибка с insertSource (): «объект '.cacheOnAssign' не найден» - PullRequest
3 голосов
/ 12 мая 2011

Я пытаюсь использовать функцию insertSource (новая в R 2.12), чтобы обновить функцию, в которую я внес изменения.

Однако, когда я использую функцию таким образом:

insertSource('filename.R', package = 'mypackage')

Я получаю ошибку:

Error in get(this, envir = envp) : object '.cacheOnAssign' not found

К сожалению, я не могу придумать простой воспроизводимый пример - если это будет полезно, пожалуйста, предложите, как я могу это сделать - но я обнаружил, что следующий код работает:

system("echo 'nls <- function(nls) return(nls)' > foo.R")
insertSource('foo.R', package = stats)

Одно из различий между пакетом stats и mypackage заключается в расположении библиотеки (mypackage находится в '~ / lib / R /'. ( update ): ошибка по-прежнему возникает, когда .libPaths('~/lib/R') находится в .Rprofile и Google .CacheOnAssign возвращает только 6 совпадений, два из которых на этот вопрос.

Вопросы:

  1. что означает ошибка?
  2. Как я могу использовать insertSource?

Debugging

с использованием options(error = recover)

options(error = recover) 
Error in get(this, envir = envp) : object '.cacheOnAssign' not found
Called from: get(this, envir = envp)
Browse[1]> where
where 1: get(this, envir = envp)
where 2: insertSource("filename.R", "mypackage")
Browse[1]> ls()
[1] "q"
Browse[1]> n
>

не уверен, что делать с этими результатами и куда идти дальше

с использованием options(error = browser) дает больше информации, которую я поместил в текстовый файл

Ответы [ 2 ]

5 голосов
/ 16 января 2012

Возможно, это ошибка в insertSource().Когда вы предоставляете файл вместо среды, он вызывает evalSource() для файла, который синтезирует переменную .cacheOnAssign (это будет просто FALSE) в исходной среде.Это препятствует замене, поскольку переменная не обязательно существует в пространстве имен пакета.

Есть несколько способов обойти это, вероятно, самый простой - создать среду самостоятельно и удалить .cacheOnAssign, как в этом исправлении:

insertSource <- function(source, package="", ...) {
    if (!is(source, "environment")) {
        source <- evalSource(source, package = package, lock = FALSE)
        rm(.cacheOnAssign, envir = source)
    }
    methods::insertSource(source, package = package, ...)
}
1 голос
/ 13 января 2012

Я хотел решить это без уступки bugger, и я думаю, что у меня есть. :)

Я не уверен, что означает сообщение об ошибке, но оно неинформативно и, возможно, недокументировано, что означает, что оно бесполезно для меня. В любом случае моей целью было решить проблему использования insertSource, а не выяснить значение этой ошибки.

Оказывается, нужно указать аргумент functions в insertSource(). Вот общая версия того, как я заставил это работать:

# Specify the new source file and the package to be updated
tmpFname <- "mySource.R"
myPkgName <- "myPkg"

# Load the package - it might not already be loaded
do.call(library, list(myPkgName))

# We need to know which functions are going to be produced, so we run `evalSource()`
tmpEval <- evalSource(tmpFname, package = myPkgName)

# Not everything from `evalSource()` is a function, so omit that stuff
newFuncs <- ls(tmpEval)[-match(c("packageName", "sourceFile"), ls(tmpEval))]

# Now, we can submit a proper incantation to `insertSource()`
insertSource(tmpFname, package = myPkgName, functions = newFuncs)

Тогда вывод будет:

Modified functions inserted through trace():  (... my functions here ...)

Я надеюсь, что это работает для других. Документация для insertSource() и evalSource() может использовать некоторую работу.


Примечание 1. Несмотря на то, что я думаю, что достиг цели использования insertSource(), щедрость остается на месте. Ответов на два первоначальных вопроса Дэвида (то есть, что означает ошибка и что эти функции действительно делают и как их следует использовать) было бы достаточно. Я не могу ответить на вопрос об ошибке, а также не очень хорошо знаком с аргументами / параметрами для evalSource и insertSource.

...