2016-02-03 9 views
11

я написал пакет, который использует DevTools включать внутренние данные:Что такое надежный процесс отсоединения пакета R, чтобы его обновить?

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?


EDIT 2016/10/28 - обновленный с воспроизводимым примером ниже

  • испытанного на окнах
  • требует DevTools

...

# 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) 
+3

Не думайте, что вы можете сделать это безопасно. Есть ли проблема при перезапуске R? – nicola

+3

Это занимает некоторое время. У меня такая же проблема'. Мне любопытно, что делают другие. Что я делаю: удалить пакет, закрыть r, открыть r, установить новый пакет с тем же именем. – Ruben

+0

Два случайных вопроса: 1) есть ли переменная в вашей среде с именем «T»? 2) выполняет вызов 'gc()' после 'detach (..., unload = TRUE)' делать что-то другое? – Jason

ответ

0

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

save(.data, "data.rda") 

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

load("data.rda") 
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 и т.д.

EDIT : это не решит особую проблему OP, которая обновляет пакет данные. Однако он работает хорошо для большинства более простых случаев, например. обновляя некоторый R-код, поэтому я оставляю ответ для будущих читателей.

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

Например, я знаю, что это будет терпеть неудачу в моей нынешней сессии:

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

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

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

+0

К сожалению, 'unloadNamespace' тоже не помогает. Я добавил воспроизводимый пример для демонстрации. – logworthy

+1

@logworthy; Действительно, он не ведет себя так, как ожидалось, для файлов данных (хотя он хорошо работает в более простых сценариях, например, только R-код). Я понятия не имею, почему! Я довольно много экспериментировал и не мог заставить его работать вообще. Это особенность внутренних элементов R, возможно, ошибка. Вам будет лучше расспросить список рассылки R-devel (https://www.r-project.org/mail.html), где вы найдете парней, которые больше всего знают о таких вещах. Удачи! –