Функция devtools load_all
имитирует загрузку пакета. Все функции из пакета хранятся в пространстве имен пакета. Функции запоминают, из какого пространства имен они приходят через environment()
.
Любой код, который вы запускаете в консоли, запускается в глобальной среде. Поэтому, когда вы запускаете
func1 <- function() {print("version2")}
, вы создаете новую функцию с именем func1
в вашей глобальной среде, но func1
из пространства имен пакета все еще там. Вы создали «теневую» функцию, которая маскирует исходную функцию.
Когда вы запускаете func2
, который все еще находится в пространстве имен пакета, он видит вызов функции с именем func1
. Когда он ищет эту функцию, он сначала смотрит в собственном пространстве имен из-за лексических правил области видимости R. Он находит исходный funct1
, а не тот, который вы создали в глобальной среде, поэтому он запускает его.
Пакеты обычно не предназначены для замены или изменения их функций после загрузки. Вы должны сохранить, чтобы сохранить источник, и вызвать load_all
, чтобы перезагрузить эту папку как пакет с новыми изменениями. Если вы на самом деле не пытаетесь смоделировать пакет, импорт функций с source()
не создаст новое пространство имен и, следовательно, будет проще редактировать после импорта.