2014-10-26 48 views
20

Yeni bir paket denemek istedim. Onu yükledim, çok fazla bağımlılık gerektiriyordu, bu yüzden birçok paket kurdu. Denedim ve etkilenmedim - şimdi tüm bağımlılıkları da içeren bu paketi kaldırmak istiyorum!Yüklemeyi kaldır (kaldır) Bağımlılıkları olan R paket

Sistemde herhangi bir paket tarafından gerek duyulmayan tüm bağımlılıkları içeren belirli paketleri kaldırmak için herhangi bir yolu var mı?

?remove.packages'a baktım ama bunu yapmak için seçenek yok.

+4

'tools :: dependsOnPkgs' temelli bir şeyi kodlayabilirsiniz. – hrbrmstr

cevap

5

Bunu işlemek için base R yolları var, ancak bir paket önereceğim (bunlardan kurtulmaya çalıştığınızı biliyorum). Bu paketi 2 nedenden ötürü tavsiye ediyorum (1) & (2) Dason K. 'ya sahip olduğunuz iki problemi çözüyor ve bu paketi geliştiriyoruz (tam açıklama). Bu paketin değeri, fonksiyonların tutarlı olan isimleri hatırlamanın daha kolay olduğu anlamına gelmektedir. Aynı zamanda bazı kombine operasyonlar yapar. Tüm bunları üssünde yapabileceğinizi unutmayın, ancak bu soru zaten oldukça yerelleştirilmiştir, bu yüzden daha kolay yanıt veren bir araç kullanacağım.

Bu paket yapacaktır:

  1. Eğer
  2. ana kütüphaneden yerine geçici bir dizinde paketleri yüklemesine izin paketi ve bağımlılıkları silmenize izin

uyarı 'olduğunu yapabilirsiniz olduğunu Daha önce kullanıcı tarafından kurulan paket bağımlılığının zaten orada olmadığından% 100 emin olun. Bu nedenle, bu çözümün her adımında, önemli olan şeyleri silmediğinize dikkat etmeliydim. Bu çözüm 2 faktöre (1) pacman (2) file.info dayanmaktadır. Belirli bir (kullanıcı tanımlı) zaman aralığında değiştirilen bağımlılıkların gerçekten istenmeyen paketler olduğunu kabul edeceğiz. Kelimeyi buraya not edin.

Evdeki insanlar için bu tekrarlanabilir hale getirdim, çünkü cevap ek bağımlılıkları olan CRAN'dan rastgele bir paket kuracaktır (bu, yerel olarak 3 veya daha fazla bağımlılık içeren bir paket yükler; herhangi bir paket).

bir tekrarlanabilir örnek

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) 

kaldırma paketi yapma

Biz package ilk bölümünden paket adı atar veya OP, yüklü istenmeyen paketi kullanmak ve bu atayabilirsiniz package (rastgele paketim package <- "OrdinalLogisticBiplot" oldu). Bu silme işlemi, ideal olarak, temiz bir R oturumuyla, hiçbir eklenti paketi (pacman hariç) yüklenmiş olarak yapılmalıdır.

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

Bu yaklaşım bazı büyük varsayımlarda bulunmaktadır.

gelen Daha iyi bir yaklaşım

p_temp(package_to_try) 

gitmek olsun Bu, ilk denemek ve yerel kütüphane bulandırmak yok sağlar.

pacman ile bastırılmamışsanız, silmek için yukarıda açıklanan yöntemi kullanabilirsiniz.

+0

Merhaba Tyler! Sizden cevap, 'p_delete'nin' remove.packages'den farklı olduğunu nasıl anlayamadım. Görünüşe göre 'p_delete' de orada listelenecek bağımlılığı gerektiriyor, doğru mu? Öyleyse pacman paketinin katma değeri nedir? – TMS

+0

Paketleri otomatik olarak silmek için pacman'ın nasıl kullanılacağını görebiliyorum, ancak tam ve kusursuz bir çözüm biraz karmaşık olabilir. (1) 'p_depends' işlevini kullanın; listenin öğelerini birleştirir (bağlıdır, içe aktarır, önerir). (İdeal olarak, “tools :: pkgDepends” ifadesinde olduğu gibi, bağımlılıkların * yinelemeli * sayımını istersiniz) (2) taban/önerilen paketleri listeden kaldırın; İsteğe bağlı olarak diğer yüklü paketlerin (!) gerektirdiği paketleri de kaldırın. (3) silmek için 'p_delete' kullanın. –

+0

@Ben, ama bu pacman olmadan da yapılabilir, değil mi? Pacman'ın katma değeri nerede? Bu cevabın biraz kapalı olduğunu düşünüyorum. – TMS

7

aslında baz Ar bir işlev remove.packages() yoktur, ancak öncelikle yüklemeniz gerekir paketin utils, öyle:

library(utils) 
remove.packages() 

Bu fonksiyon yapar ne kadar özyinelemeli temizleme benim için tamamen net değil.

+0

ancak OP'nin istediği şeyi yapmıyor, bu da paketi * ve diğer tüm yüklü paketlerin gerektirmediği tüm bağımlılıklarını kaldırmak için * ... –

+0

@BenBolker Evet, haklı olduğunuzu sanıyorum. Soruyu biraz yanlış anlayabilirim - gidip, genellikle yüklenemediğinden ve dolayısıyla görülebilir olduğundan, remove.packages() öğesini bulmak için biraz avlanmak zorunda kaldım. – Andrie

+0

OP'lerin son sözlerini, ne düşündüklerini açıklığa kavuşturmak için düzenledim. – Spacedman

13

Paket ve gereksiz bağımlılıkları kaldırmanız gereken bazı kodlar. "Gereksiz" bağımlı paketlerin yorumunun, bu paketin bağımlı olduğu, ancak başka bir pakette kullanılmayan paketler kümesi olduğunu unutmayın. Bu, ters bağımlılıkları olmayan paketleri kaldırmayı önerecek şekilde varsayılan olarak da geçerli olacaktır. Böylece, neyi kaldırmanız gerektiğine dair kontrol sağlamak için etkileşimli bir menü olarak (update.packages'da olduğu gibi) uyguladım.

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 

Not: recursive seçenek özellikle faydalı olabilir. Paket bağımlılıkları diğer gereksiz paketlere de bağlıysa, recursive = TRUE ayarı hayati önem taşır. Bağımlılıklar sığ ise (yani bağımlılık ağacından yalnızca bir seviye), bu FALSE (varsayılan) olarak bırakılabilir.