Каков надежный процесс отключения пакета R для его обновления?

Я написал пакет, который использует devtools для включения внутренних данных:

devtools::use_data(.data, internal = T, overwrite = T)

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

detach('package:myPackage', unload=T)
remove.packages('myPackage')
install.packages(repos=NULL, 'myPackage.zip')

Я проверяю, прошли ли изменения:

length(myPackage:::.data[[1]])
[1] 2169

Не то, что я ожидал... может перезагрузка поможет?

Restarting R session...
length(myPackage:::.data[[1]])
[1] 2179

Что является ожидаемым результатом.

Чтение справки для detach говорит о том, что при некоторых обстоятельствах он может работать нестабильно, например:

Если вы используете библиотеку для пакета, пространство имен которого загружено, она прикрепляет экспорт уже загруженного пространства имен. Таким образом, отсоединение и повторное присоединение пакета может не обновить некоторые или все компоненты пакета и не рекомендуется.

Моя ситуация здесь такова, что я хочу полностью очистить загруженный пакет, чтобы я мог его обновить. Есть ли способ сделать это без перезапуска R?


РЕДАКТИРОВАТЬ 2016/10/28 - обновлен воспроизводимым примером ниже

  • проверено на винде
  • требуются средства разработки

...

# setup package in temp dir
pkg_dir <- file.path(tempfile(), 'dummy.test.pkg')
dir.create(pkg_dir, recursive=T)
devtools::create(pkg_dir)
setwd(pkg_dir)

# read description
desc <- readChar('DESCRIPTION', file.size('DESCRIPTION'))

# create and build package v01
.testval <- c(1,2,3)
devtools::use_data(.testval, internal=T, overwrite=T)
v01 <- sub('\\d+\\.\\d+\\.\\d+\\.\\d+', '0.0.0.1', desc, perl=T)
writeChar(v01, 'DESCRIPTION')
bin01 <- devtools::build(binary=T, path='.')

# create and build package v10
.testval <- c(4,5,6)
devtools::use_data(.testval, internal=T, overwrite=T)
v01 <- sub('\\d+\\.\\d+\\.\\d+\\.\\d+', '1.0.0.0', desc, perl=T)
writeChar(v01, 'DESCRIPTION')
devtools::build(binary=T, path='.')
bin10 <- devtools::build(binary=T, path='.')

# up to this point we haven't loaded either package
sessionInfo()

# install v01
install.packages(repos=NULL, bin01)
cat(dummy.test.pkg:::.testval)
# 1 2 3 (as expected)

# unload the package
unloadNamespace('dummy.test.pkg')

# install v10
install.packages(repos=NULL, bin10)
cat(dummy.test.pkg:::.testval)
# 1 2 3 (NOT 4 5 6 which we expected)

### restart R here ###
cat(dummy.test.pkg:::.testval)
# 4 5 6 (as expected)

person logworthy    schedule 03.02.2016    source источник
comment
Не думайте, что вы можете сделать это безопасно. Есть ли проблема с перезапуском R?   -  person nicola    schedule 03.02.2016
comment
Это занимает некоторое время. У меня такая же проблема'. Мне интересно, что делают другие. Что я делаю: удаляю пакет, закрываю r, открываю r, устанавливаю новый пакет с тем же именем.   -  person Ruben    schedule 03.02.2016
comment
Два случайных вопроса: 1) есть ли в вашей среде переменная с именем «T»? 2) делает ли вызов gc() после detach(...,unload=TRUE) что-то другое?   -  person Jason    schedule 06.10.2016
comment
попробуйте выгрузить пространство имен, а не отсоединять его.   -  person Karl Forner    schedule 06.10.2016
comment
У меня нет переменных с именем T. gc() не решает проблему. unloadNamespace тоже не помогает.   -  person logworthy    schedule 28.10.2016


Ответы (2)


Вы ищете unloadNamespace. Я использую его именно для той цели, которую вы описываете все время.

Просто позвоните по порядку:

# this may fail, see below
unloadNamespace("mypackage")
# if it succeeds you're all good

# updating the package
install.packages("mypackage")

# reloading the updated package
library("mypackage")

У меня никогда не было с этим проблем, будь то установка из исходников/бинарника, из локального/CRAN/github, с/без packrat и т. д.

РЕДАКТИРОВАТЬ: это не решает конкретную проблему OP, связанную с обновлением пакета data. Однако он хорошо работает для большинства простых случаев, например. обновляя некоторый код R, поэтому я оставляю ответ для будущих читателей.

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

Например, я знаю, что это не удастся в моем текущем сеансе:

> unloadNamespace("magrittr")
Error in unloadNamespace("magrittr") : 
  namespace ‘magrittr’ is imported by ‘stringr’, ‘customFunctions’, ‘dplyr’, ‘tidyr’ so cannot be unloaded

Решение здесь состоит в том, чтобы сначала выгрузить (с помощью unloadNamespace) все пакеты, импортирующие «mypackage».

Если есть много импортируемых пакетов, вы можете сэкономить время, просто перезапустив R. (Поскольку вы, кажется, говорите о пользовательском локальном пакете, это, вероятно, не произойдет с вами, если вы не написали другие пакеты в зависимости от него.)

person asachet    schedule 19.10.2016
comment
К сожалению, unloadNamespace тоже не помогает. Я добавил воспроизводимый пример для демонстрации. - person logworthy; 28.10.2016
comment
@логворти; В самом деле, он ведет себя не так, как ожидалось, для файлов данных (хотя он хорошо работает в более простых сценариях, таких как просто код R)... Я понятия не имею, почему! Я довольно много экспериментировал и не мог заставить его работать вообще. Это особенность внутреннего устройства R, потенциально ошибка. Вам лучше обратиться в список рассылки R-devel (r-project.org/mail .html), где вы найдете людей, которые лучше всех разбираются в таких вещах. Удачи! - person asachet; 31.10.2016

Если вы не хотите перезапускать сеанс R, безопасным способом получения новых данных будет сохранение данных, например. по

save(.data, "data.rda")

скопируйте их на другую машину и там

load("data.rda")
person Johannes Ranke    schedule 19.10.2016