R не распознает обновления моих функций в другой функции - PullRequest
2 голосов
/ 05 февраля 2020

Я работаю над пакетом, и в настоящее время у него много функций. Чтобы загружать их каждый раз, когда я открываю RStudio, я использую следующую строку кода из devtools:

library(devtools)
suppressMessages(load_all("~/Codes/package1/"))

Это работает нормально, но проблема заключается в том, что всякий раз, когда я меняю функцию, которая использовалась в другой функции, R не распознает изменения.

Например, если у меня есть:

func1 <- function() {
   print("version1")
}
func2 <- function() {
   func1()
}

А затем измените func1 на print("Vesion2"), перезапустите его и затем запустите func2, оно все равно будет Для меня версия печати 1.

Кто-нибудь знает, в чем проблема и как ее решить?

1 Ответ

3 голосов
/ 05 февраля 2020

Функция devtools load_all имитирует загрузку пакета. Все функции из пакета хранятся в пространстве имен пакета. Функции запоминают, из какого пространства имен они приходят через environment().

Любой код, который вы запускаете в консоли, запускается в глобальной среде. Поэтому, когда вы запускаете

func1 <- function() {print("version2")}

, вы создаете новую функцию с именем func1 в вашей глобальной среде, но func1 из пространства имен пакета все еще там. Вы создали «теневую» функцию, которая маскирует исходную функцию.

Когда вы запускаете func2, который все еще находится в пространстве имен пакета, он видит вызов функции с именем func1. Когда он ищет эту функцию, он сначала смотрит в собственном пространстве имен из-за лексических правил области видимости R. Он находит исходный funct1, а не тот, который вы создали в глобальной среде, поэтому он запускает его.

Пакеты обычно не предназначены для замены или изменения их функций после загрузки. Вы должны сохранить, чтобы сохранить источник, и вызвать load_all, чтобы перезагрузить эту папку как пакет с новыми изменениями. Если вы на самом деле не пытаетесь смоделировать пакет, импорт функций с source() не создаст новое пространство имен и, следовательно, будет проще редактировать после импорта.

...