2014-10-26 54 views
20

Volevo provare qualche nuovo pacchetto. L'ho installato, ha richiesto molte dipendenze, quindi ha installato molti altri pacchetti. L'ho provato e non mi ha colpito - ora vorrei disinstallare quel pacchetto includendo tutte le dipendenze!Disinstallare (rimuovere) Pacchetto R con dipendenze

C'è un modo per rimuovere pacchetti dati incluse tutte le dipendenze che non sono necessarie da nessun altro pacchetto nel sistema?

Ho guardato ?remove.packages ma non c'è alcuna opzione per farlo.

+4

È possibile codificare qualcosa in base a 'tools :: dependsOnPkgs'. – hrbrmstr

risposta

5

Ci sono base R modi per gestire questo, ma ho intenzione di raccomandare un pacchetto (so che stai cercando di sbarazzarsi di questi). Raccomando questo pacchetto per 2 motivi (1) risolve due problemi che stai avendo & (2) Dason K. e io stiamo sviluppando questo pacchetto (completa divulgazione). Il valore di questo pacchetto sta nel fatto che le funzioni sono più facili da ricordare con nomi coerenti. Fa anche alcune operazioni combinate. Nota che potresti fare tutto questo in base, ma questa domanda è già abbastanza localizzata, quindi userò uno strumento che facilita la risposta.

Questo pacchetto sarà:

  1. permette di cancellare pacchetto e le dipendenze
  2. consentono di installare i pacchetti in una directory temporanea piuttosto che libreria principale

L'avvertenza è che si può' t essere sicuro al 100% che la dipendenza del pacchetto non fosse già lì, installata precedentemente dall'utente. Pertanto proverò con cautela ad ogni passo di questa soluzione che non stai cancellando le cose che sono importanti. Questa soluzione si basa su 2 fattori (1) pacman (2) file.info. Supponiamo che le dipendenze che sono state modificate all'interno di una certa soglia di tempo (definita dall'utente) siano effettivamente pacchetti indesiderati. Nota la parola assume qui.

Ho reso questo riproducibile per la gente di casa in quanto la risposta installerà a caso un pacchetto da CRAN con dipendenze aggiuntive (questo installa un pacchetto che non hai già localmente con 3 o più dipendenze; qualsiasi pacchetto).

Realizzare uno esempio riproducibile

library(pacman) 

(available <- p_cran()) 
(randoms <- setdiff(available, p_lib())) 
(mypackages <- p_lib()) 

ndeps <- 1 
while(ndeps < 3) { 

    package <- sample(randoms, 1) 
    deps <- unlist(p_depends(package, character.only=TRUE), use.names=FALSE) 
    ndeps <- length(setdiff(deps, mypackages)) 

} 

package 
p_install(package, character.only = TRUE) 

disinstallazione pacchetto

Vi assegnare il nome del pacchetto dalla prima parte di package o OP può usare il pacchetto indesiderato hanno installato e assegnare tale a package (il mio pacchetto casuale è successo a package <- "OrdinalLogisticBiplot"). Questo processo di eliminazione dovrebbe, idealmente, essere eseguito in una sessione R pulita senza pacchetti aggiuntivi (tranne pacman) caricati.

## function to grab file info date/time modified 
infograb <- function(x) file.info(file.path(p_path(), x))[["mtime"]] 

## determine the differences in times modified for "package" 
## and all other packages in library 
diffs <- as.numeric(infograb(package)) - sapply(p_lib(), infograb) 

## user defined threshold 
threshold <- 15 

## determine packages just installed within the time frame of the unwanted package 
(delete_deps <- diffs[diffs < threshold & diffs >= 0]) 

## recursively find all packages that could have been installed 
potential_depends <- unlist(lapply(unlist(p_depends(package, character=TRUE)), 
    p_depends, character=TRUE, recursive=TRUE)) 

## delete packages that are both on the lists of (1) installed within time 
## frame of unwanted package and a dependency of that package 
p_delete(intersect(names(delete_deps), potential_depends), character.only = TRUE) 

Questo approccio presenta alcune grandi ipotesi.

Un approccio migliore da ottenere andare

p_temp(package_to_try) 

Ciò consente di provare prima e non l'hanno Muddy vostra biblioteca locale.

Se non sei impressionato con pacman puoi utilizzare il metodo descritto sopra per eliminarlo.

+0

Ciao Tyler! Dalla tua risposta non ho riconosciuto come 'p_delete' sia diverso da' remove.packages'. Sembra che 'p_delete' richieda che anche la dipendenza sia elencata lì, giusto? Allora, qual è il valore aggiunto del pacchetto 'pacman'? – TMS

+0

Posso vedere come usare 'pacman' per cancellare automaticamente i pacchetti, ma una soluzione completa e infallibile sarebbe un po 'complessa. (1) usa 'p_depends'; combinare gli elementi della lista (dipende, importa, suggerisce). (Idealmente si vorrebbe effettivamente una * ricorsiva * enumerazione di dipendenze, come in 'tools :: pkgDepends') (2) rimuovere i pacchetti base/consigliati dalla lista; opzionalmente rimuovi i pacchetti che sono richiesti anche da altri pacchetti installati (!). (3) usare 'p_delete' per cancellare. –

+0

@ Ben, ma questo potrebbe essere fatto anche senza pacman, giusto? Dov'è il valore aggiunto di pacman? Penso che questa risposta sia un po 'spenta. – TMS

7

V'è infatti una funzione remove.packages() nella base di R, ma è nel pacchetto utils, che è necessario caricare prima:

library(utils) 
remove.packages() 

Non è del tutto chiaro per me quanta pulizia ricorsiva questa funzione fa.

+0

ma questo non fa quello che l'OP vuole, ovvero rimuovere il pacchetto * e tutte le sue dipendenze che non sono richieste da nessun altro pacchetto installato * ... –

+0

@BenBolker Sì, ho il sospetto che tu abbia ragione. Potrei aver leggermente frainteso la domanda: dovevo andare a cercare un po 'per trovare 'remove.packages()' dato che non è solitamente caricato e quindi visibile. – Andrie

+0

Ho modificato le parole finali di OP per chiarire che cosa intendessero intendessero. – Spacedman

13

Ecco un codice che consente di rimuovere un pacchetto e le sue dipendenze non necessarie. Si noti che la sua interpretazione dei pacchetti dipendenti "non necessari" è l'insieme di pacchetti da cui questo pacchetto dipende, ma che non sono usati in nessun altro pacchetto. Ciò significa che verrà automaticamente suggerito di disinstallare i pacchetti che non hanno dipendenze inverse. Così l'ho implementato come un menu interattivo (come in update.packages) per darti il ​​controllo su cosa disinstallare.

library("tools") 

removeDepends <- function(pkg, recursive = FALSE){ 
    d <- package_dependencies(,installed.packages(), recursive = recursive) 
    depends <- if(!is.null(d[[pkg]])) d[[pkg]] else character() 
    needed <- unique(unlist(d[!names(d) %in% c(pkg,depends)])) 
    toRemove <- depends[!depends %in% needed] 
    if(length(toRemove)){ 
     toRemove <- select.list(c(pkg,sort(toRemove)), multiple = TRUE, 
           title = "Select packages to remove") 
     remove.packages(toRemove) 
     return(toRemove) 
    } else { 
     invisible(character()) 
    } 
} 

# Example 
install.packages("YplantQMC") # installs an unneeded dependency "LeafAngle" 
c("YplantQMC","LeafAngle") %in% installed.packages()[,1] 
## [1] TRUE TRUE 
removeDepends("YplantQMC") 
c("YplantQMC","LeafAngle") %in% installed.packages()[,1] 
## [1] FALSE FALSE 

Nota: l'opzione recursive può essere particolarmente utile. Se le dipendenze del pacchetto dipendono ulteriormente da altri pacchetti non necessari, l'impostazione di recursive = TRUE è di vitale importanza. Se le dipendenze sono poco profonde (cioè solo un livello in basso nell'albero delle dipendenze), questo può essere lasciato come FALSE (il valore predefinito).

Problemi correlati