2012-01-11 14 views
5

Ho esaminato la guida per update.packages(..., checkBuilt = TRUE) e non sono chiaro sul perché uno non vorrebbe avere TRUE come predefinito. L'impostazione predefinita è FALSE.Aggiornamento pacchetti in R - impatto di checkBuilt = TRUE o FALSE

Questa domanda ha due parti. (1) Qualcuno può fornire una spiegazione chiara dell'uso di questo argomento e delle motivazioni per FALSE o TRUE?

Come ho capito, se si aggiorna R, allora questo potrebbe avere risultati diversi - se i pacchetti non sono stati aggiornati, quindi FALSE non causerà la modifica delle librerie locali con pacchetti aggiornati, mentre TRUE causerà più (tutti?) pacchetti da aggiornare. L'opzione predefinita (FALSE) può conferire un vantaggio in termini di velocità: verranno aggiornati meno pacchetti. La stabilità è incerta: una nuova versione di R potrebbe funzionare meglio con un nuovo pacchetto, oppure potrebbe non esserlo (ad esempio se ci sono regressioni/bug nel nuovo pacchetto) e potrebbe non funzionare con la versione precedente del pacchetto (la compatibilità con le versioni precedenti non è garantita). Altri pro e contro non sono ovvi per me. (E potrei sbagliare abbastanza qui - ecco perché chiedo un chiarimento come parte 1.)

(2) Tuttavia, se uno non ha cambiato la versione installata di R, allora non dovrebbero avere lo stesso risultato? Vedere this post per un esempio in cui sembra che la semplice chiamata di update.packages() abbia creato problemi, anche se la versione di R non è cambiata.

+1

Non è una risposta, ma ecco la mia ipotesi: l'argomento 'checkBuilt' è stato introdotto in r31400 (2004), vedi anche http://cran.r-project.org/bin/windows/base/old/2.1.0/NEWS.rw2010.A quel tempo, l'introduzione dell'argomento con default 'FALSE' significava che il comportamento predefinito non cambiava, cosa che a me sembra più sensata. Per quanto ne so, il valore predefinito non è mai cambiato in seguito. Inoltre, immagino che il core di R potrebbe essere riluttante a riguardo, poiché probabilmente sarebbe necessario un lungo annuncio simile ad annunciare funzioni come deprecate (e causerebbe migliaia di domande di utenti ignari ...) – cbeleites

+0

@cbeleites Grazie per aver risposto! Come saprai, sei l'autore del post a cui mi sono collegato, quindi speravo che tu potessi inserire un nuovo background. :) Capisco questa riluttanza a cambiare - sembra una spiegazione plausibile per il default originale e la sua persistenza. Quindi, nel presente, mi chiedo se gli utenti dovrebbero ignorare il valore predefinito. – Iterator

+0

Sou, è possibile sovrascrivere l'impostazione predefinita abbastanza facilmente. Anche se penso che non valga lo sforzo per 'update.packages' (lo faccio più regolarmente per cose come il wrapping' print' attorno alla trama basata sulla griglia - anche se anche questo non è più necessario con 'Sweave' (' RweaveLatex') opzione 'stampa = TRUE'). E quindi è molto più semplice aggiornare i pacchetti che ridurli. – cbeleites

risposta

4

CheckBuilt = TRUE è particolarmente utile per gli aggiornamenti principali come 2.14.0 che ha portato grandi cambiamenti negli spazi dei nomi. I pacchetti senza uno spazio dei nomi creato con la versione precedente di R devono essere ricompilati, altrimenti non verranno caricati affatto. Quindi, se si dispone di un tale pacchetto (come ICE) installati in R 2.13, e si aggiorna a R 2.14, non sarà in grado di caricare più:

> library(ICE) 
Error in library(ICE) : 
    package ‘ICE’ does not have a NAMESPACE and should be re-installed 

Poiché non esiste una versione più recente con un namespace, update.packages() non lo aggiornerà senza CheckBuilt = TRUE. Così dicendo update.packages(checkBuilt = TRUE), dite chiaramente, aggiornare tutti i pacchetti se:

  • C'è una versione più recente sul CRAN
  • O re-installare il pacchetto se è stato costruito con una versione precedente di R .

e non modificherà i pacchetti che sono stati compilati nella stessa versione di R e senza aggiornare disponibile sul CRAN. CheckBuilt significa davvero "reinstallare se compilato in una versione precedente", non "reinstallare tutti i pacchetti".

Perché è FALSE per impostazione predefinita? Immagino che metta un carico enorme sul CRAN e il più delle volte non sia necessario: non ho mai visto un problema dopo un aggiornamento secondario (cioè R 2.13.0 a 2.13.1). Consiglio vivamente di farlo dopo qualsiasi aggiornamento importante come 2.13.1 a 2.14.0.

Credo che il caso specifico menzionato in (2) sia un'eccezione. Si tratta di aggiornare i pacchetti installati con apt piuttosto che da R. Non si può davvero trarre alcuna conclusione da un tale errore segfault. E comunque, se lo ha aggiornato CheckBuilt = TRUE, significa che è stato costruito in una versione precedente di R.

+0

Un buon punto per quanto riguarda il segfault - questa è probabilmente un'aringa rossa. – Iterator

+0

Ho installato R 3.2.3 e quasi tutti i miei pacchetti sono stati installati e compilati usando R 3.2.1 o 3.2.2 (in base ai pacchetti installati). Comunque se faccio update.packages (lib.loc = .libPaths(), checkBuilt = TRUE, ask = FALSE) quasi nessuno è stato reinstallato .. perché? – lucacerone

Problemi correlati