2016-02-03 10 views
11

Ich habe ein Paket geschrieben, die devtools enthalten interne Daten verwendet:Was ist ein zuverlässiger Prozess zum Abnehmen eines R-Pakets, um es zu aktualisieren?

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

Ich änderte vor kurzem, dass die Daten und das Paket wieder aufgebaut. Ich möchte auf einen anderen Rechner das Paket aktualisieren, die das ältere Paket hat derzeit geladen:

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

ich überprüfen, um zu sehen, ob die Änderungen durchgemacht haben:

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

Nicht das, was ich erwartet hatte ... vielleicht hilft ein Neustart?

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

Welches ist das erwartete Ergebnis.

Lesen der Hilfe für detach legt nahe, dass es unter bestimmten Umständen flockig sein kann, zum Beispiel:

Wenn Sie Bibliothek auf einem Paket, dessen Namespace geladen wird, legt er die Exporte des bereits geladenen Namensraum . Das Abnehmen und erneutes Anhängen eines Pakets kann daher einige oder alle Komponenten des Pakets nicht aktualisieren und wird nicht empfohlen.

Meine Situation hier ist, dass ich das geladene Paket vollständig löschen möchte, damit ich es aktualisieren kann. Gibt es eine Möglichkeit, dies ohne Neustart von R zu tun?


2016/10/28 EDIT - mit einem reproduzierbaren Beispiel aktualisiert unter

  • auf Windows getestet
  • erfordert 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

Glauben Sie nicht, dass Sie es sicher tun können. Gibt es ein Problem beim Neustart von R? – nicola

+3

Es braucht etwas Zeit. Ich habe das gleiche Problem'. Ich bin gespannt was andere machen. Was ich mache: Paket entfernen, r schließen, r öffnen, neues Paket mit gleichem Namen installieren. – Ruben

+0

Zwei zufällige Fragen: 1) Gibt es in Ihrer Umgebung eine Variable namens "T"? 2) macht einen Aufruf an 'gc()' nach 'detach (..., unload = TRUE)' etwas anderes tun? – Jason

Antwort

0

Wenn Sie nicht neu starten möchten R-Sitzung, ein sicherer Weg, um die neuen Daten zu bekommen wäre es, die Daten zu speichern, z.B. von

save(.data, "data.rda") 

kopieren Sie sie auf zu der anderen Maschine, und es

load("data.rda") 
2

Sie suchen unloadNamespace. Ich benutze es für genau den Zweck, den du die ganze Zeit beschreibst.

Einfach anrufen, um:

# 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") 

Ich hatte nie ein Problem damit, ob von der Quelle/Binär-Installation, von den lokalen/CRAN/GitHub, mit/ohne packrat usw.

EDIT : Dies löst nicht das spezielle Problem von OP, welches das Paket Daten aktualisiert. Es funktioniert jedoch gut für die meisten einfacheren Fälle, z.B. einige R-Codes aktualisieren, so hinterlasse ich die Antwort für zukünftige Leser.

Was jedoch passieren kann, ist, dass das Zielpaket tatsächlich von anderen aktuell geladenen Paketen importiert wurde. In diesem Fall schlägt das Entladen fehl.

Zum Beispiel weiß, dass ich dies in meiner aktuellen Sitzung fehl:

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

Die Lösung ist hier zum ersten Entladen (mit unloadNamespace) alle Pakete importieren „mypackage“.

Wenn viele Pakete importiert werden, sparen Sie möglicherweise Zeit, indem Sie R neu starten. (Da Sie über ein benutzerdefiniertes lokales Paket zu sprechen scheinen, wird Ihnen das wahrscheinlich nicht passieren, außer Sie haben andere Pakete geschrieben darauf.)

+0

Leider scheint 'unloadNamespace' auch nicht zu helfen. Ich habe ein reproduzierbares Beispiel hinzugefügt. – logworthy

+1

@logworthy; Tatsächlich verhält es sich nicht wie erwartet für Datendateien (obwohl es in einfacheren Szenarios gut funktioniert, wie nur R-Code) ... Ich habe keine Ahnung warum! Ich habe viel experimentiert und konnte es überhaupt nicht zur Arbeit bringen. Dies ist eine Besonderheit von R Internals, möglicherweise ein Fehler. Sie sollten besser auf der R-devel-Mailingliste (https://www.r-project.org/mail.html) fragen, wo Sie die Leute finden, die am meisten über solche Dinge wissen. Viel Glück! –