R'de çalışırken tüm paketleri ayırın


101

Başka bir sorunu çözmeye çalışırken şu sorunu yaşadım:

Tüm R nesnelerini şu şekilde kaldırabilirim:

rm(list = ls(all = TRUE))

Çalışma oturumu sırasında kurulu paketleri ayırabilecek eşdeğer bir komut var mı?

> sessionInfo()
R version 2.12.2 (2011-02-25)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base 

gerektirir (ggplot2)

Loading required package: ggplot2
Loading required package: reshape
Loading required package: plyr

Attaching package: 'reshape'

The following object(s) are masked from 'package:plyr':

    round_any

Loading required package: grid
Loading required package: proto

sessionInfo ()

R version 2.12.2 (2011-02-25)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
[1] ggplot2_0.8.9 proto_0.3-9.1 reshape_0.8.4 plyr_1.4 

Bu şekilde denedim, ancak küresel bir çözümde işe yaramadı:

pkg <- c("package:ggplot2_0.8.9", "package:proto_0.3-9.1", "package:reshape_0.8.4",  "package:plyr_1.4")

 detach(pkg, character.only = TRUE)

Error in detach(pkg, character.only = TRUE) : invalid 'name' argument
In addition: Warning message:
In if (is.na(pos)) stop("invalid 'name' argument") :
  the condition has length > 1 and only the first element will be used

Merak ettiğim şey küresel bir şey:

  rm(list = ls(all = TRUE))

nesneler için, ekli temel paketleri kaldırmamasını bekleyin

Teşekkürler;


3
Sorunuzun geçerli olmadığından değil, ama neden sadece R'yi yeniden başlatmıyorsunuz?
Aaron Stack Overflow'dan

5
@Aaron, çünkü sahip olmamanız gerekir ;-) R CMD checkBir paketi geçmek için kendisini temiz bir şekilde boşaltması gerekir, bu nedenle R Core bunun mümkün olmasını ve birinin yapmak isteyebileceği bir şey olmasını bekler.
Gavin Simpson

@Aaron, bazen bazı paketler parazite neden olduğunda veya parazite neden olduğunda oturumun devam etmesine izin vermenin yararlı olabileceğini düşünüyorum, ancak önceki adımlarda kullanılmış ...
John Clark

5
R'yi yeni bir tahtaya döndürmek mümkün değildir. John Chambers ile bunun hakkında konuştum ve özellikle S4 sınıf / yöntem kaydı için yapmak zor.
hadley

Yanıtlar:


100

Öyleyse, birisinin aşağıdakileri basitçe yanıtlaması gerekirdi.

lapply(paste('package:',names(sessionInfo()$otherPkgs),sep=""),detach,character.only=TRUE,unload=TRUE)

(düzenleme: 6-28-19) R 3.6.0'ın son sürümünde lütfen bunun yerine kullanın.

invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))

Invisible (*) kullanımının gerekli olmadığını, ancak NULL yanıtının R penceresine dikey olarak spam göndermesini önlemek için yararlı olabileceğini unutmayın.

(düzenleme: 9/20/2019) 3.6.1 sürümünde

Yüklenen names(sessionInfo()$loadedOnly)paketleri önce açıkça eklenmiş paketlere dönüştürmek ve ardından paketleri bu şekilde ayırmak faydalı olabilir .

lapply(names(sessionInfo()$loadedOnly), require, character.only = TRUE)
invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE, force=TRUE))

$ BasePkgs aracılığıyla temel paketleri kaldırmaya çalışabilir ve ayrıca unloadNamespace(loadedNamespaces()). Ancak bunlar tipik olarak hatalarla doludur ve sessionInfo()yalnızca hataların döndürülmesine neden olmak gibi temel işlevleri bozabilir . Bu genellikle orijinal ambalajın tasarımındaki tersinirlik eksikliği nedeniyle oluşur. timeDateÖrneğin şu anda geri dönüşü olmayan bir şekilde kırılabilir.


3
Bence bu basitliği ve ek paketlere ihtiyaç duymadığı için olumlu oyları hak ediyor.
Antonio Serrano

Bu benim için işe yaramadı. Çalıştırdım uyarılar aldım, sonra session.info () çalıştırdım, tüm paketler hala oradaydı.
dxander

1
Evet, R 3.6.0'ın en son sürümünde bunun yerine aşağıdakiler kullanılmalıdır. görünmez (lapply (paste0 ('paket:', isimler (sessionInfo () $ diğerPkgs)), detach, character.only = TRUE, unload = TRUE)) Görünmez (*) kullanımının gerekli olmadığını ancak NULL'u engelleyebileceğini unutmayın. pencereye dikey olarak spam göndermekten yanıt verin.
mmfrgmpds

invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))Sonuçları Error in FUN(X[[i]], ...) : invalid 'name' argumenthatayla kullanmak
dvanic

Hata Error in FUN(X[[i]], ...)...genellikle yalnızca bir NULL değeri mevcut olduğunda ortaya çıkar. Bunun için test edilebilir names(sessionInfo()$otherPkgs). Geri dönerse NULL, nedeni budur.
mmfrgmpds

57

Lütfen şunu deneyin:

detachAllPackages <- function() {

  basic.packages <- c("package:stats","package:graphics","package:grDevices","package:utils","package:datasets","package:methods","package:base")

  package.list <- search()[ifelse(unlist(gregexpr("package:",search()))==1,TRUE,FALSE)]

  package.list <- setdiff(package.list,basic.packages)

  if (length(package.list)>0)  for (package in package.list) detach(package, character.only=TRUE)

}

detachAllPackages()

4
batırdığınızda plyrve dplyrgitmenin tek yolu bu gibi görünüyor. Teşekkürler!
JelenaČuklina

29

Sen yakındın. Aşağıdaki ?detachilk argüman hakkında söylenmesi gerekenlere namedikkat edin detach():

Argümanlar:

name: The object to detach.  Defaults to ‘search()[pos]’.  This can
      be an unquoted name or a character string but _not_ a
      character vector.  If a number is supplied this is taken as
      ‘pos’.

Bu yüzden detach()öğesinin her bir öğesi için tekrar tekrar çağırmamız gerekir pkg. Bunun işe yaraması için belirtmemiz gereken birkaç başka argüman var. Birincisi character.only = TRUE, işlevin namebunun bir karakter dizisi olduğunu varsaymasına izin verir - onsuz çalışmaz. İkinci olarak, muhtemelen ilişkili tüm ad alanlarını da kaldırmak istiyoruz. Bu, ayarlayarak elde edilebilir unload = TRUE. Yani çözüm, örneğin:

pkg <- c("package:vegan","package:permute")
lapply(pkg, detach, character.only = TRUE, unload = TRUE)

İşte tam bir örnek:

> require(vegan)
Loading required package: vegan
Loading required package: permute
This is vegan 2.0-0
> sessionInfo()
R version 2.13.1 Patched (2011-09-13 r57007)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_GB.utf8       LC_NUMERIC=C             
 [3] LC_TIME=en_GB.utf8        LC_COLLATE=en_GB.utf8    
 [5] LC_MONETARY=C             LC_MESSAGES=en_GB.utf8   
 [7] LC_PAPER=en_GB.utf8       LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] vegan_2.0-0   permute_0.7-0

loaded via a namespace (and not attached):
[1] grid_2.13.1     lattice_0.19-33 tools_2.13.1   
> pkg <- c("package:vegan","package:permute")
> lapply(pkg, detach, character.only = TRUE, unload = TRUE)
[[1]]
NULL

[[2]]
NULL

> sessionInfo()
R version 2.13.1 Patched (2011-09-13 r57007)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_GB.utf8       LC_NUMERIC=C             
 [3] LC_TIME=en_GB.utf8        LC_COLLATE=en_GB.utf8    
 [5] LC_MONETARY=C             LC_MESSAGES=en_GB.utf8   
 [7] LC_PAPER=en_GB.utf8       LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

loaded via a namespace (and not attached):
[1] grid_2.13.1     lattice_0.19-33 tools_2.13.1

Bunu bir işleve dönüştürmek istiyorsanız sessionInfo(), "diğer ekli paketler" olarak neyi etiketlediğini görmek için kodu inceleyin. Bu kod parçasını yukarıdaki fikirle tek bir işlevde birleştirin ve evde ve kuru kaldınız. Yine de bu kısmı size bırakacağım.


12
pkgs = names(sessionInfo()$otherPkgs)ve ekleyerek bunu otomatikleştirebilirsinizpkgs = paste('package:', pkgs, sep = "")
Ramnath

2
@Ramnath +1 Gerçekten - ama çok yardımcı olmak istemedim ;-)
Gavin Simpson

4
force=TRUEPaketlerin bağımlılıkları olması durumunda da eklemek isteyebilirsiniz .
James

26

nothing

Romain François tarafından sunulan çözümü eklemeye değer olabilir . nothingŞu anda GitHub'da bulunan paket yüklendiğinde, yüklenen tüm paketleri kaldıracaktır; Romain'in sağladığı örnekte olduğu gibi:

loadedNamespaces()
[1] "base"      "datasets"  "grDevices" "graphics"  "methods"   "stats"
[7] "utils"

require(nothing, quietly = TRUE)

loadedNamespaces()
[1] "base"

Kurulum

devtoolsPaketin kullanımı ile :

devtools::install_github("romainfrancois/nothing")

pacman

Alternatif bir yaklaşım, pacmanCRAN aracılığıyla sunulan paketi kullanır :

pacman::p_unload(pacman::p_loaded(), character.only = TRUE)

4
Vinyete ( trinker.github.io/pacman/vignettes/Introduction_to_pacman.html ) bakmak belki pacman::p_unload("all")de işe yarayabilir mi?
chandler

10

Gavin'in cevabına dayalı olarak, ancak tam anlamıyla tam bir işleve sahip olmamak üzere, şu sekans:

sess.pkgs <- function (package = NULL) 
{   z <- list()
       if (is.null(package)) {
        package <- grep("^package:", search(), value = TRUE)
        keep <- sapply(package, function(x) x == "package:base" || 
            !is.null(attr(as.environment(x), "path")))
        package <- sub("^package:", "", package[keep])
    }
    pkgDesc <- lapply(package, packageDescription)
    if (length(package) == 0) 
        stop("no valid packages were specified")
    basePkgs <- sapply(pkgDesc, function(x) !is.null(x$Priority) && 
        x$Priority == "base")
    z$basePkgs <- package[basePkgs]
    if (any(!basePkgs)) {
        z$otherPkgs <-  package[!basePkgs]
    }
    z
}

lapply(paste("package:",sess.pkgs()$otherPkgs, sep=""), detach, 
                             character.only = TRUE, unload = TRUE)

2
bir şekilde tek astar ile aynı şeyi yapabilirim lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""), detach, character.only = TRUE, unload = TRUE). Yine de cevabınız olmadan oraya asla varamazdım!
Ufos

4

veya RStudio'unuz varsa, ayırmak için Paketler Sekmesindeki tüm işaretli kutuların işaretini kaldırmanız yeterlidir.


1
Çok sayıda yüklenmiş paketiniz varsa, her birinin işaretini manuel olarak kaldırmak zahmetlidir.
Sibo Jiang

3
#Detach all  packages
detachAllPackages <- function() {

  basic.packages <- c("package:stats","package:graphics","package:grDevices","package:utils","package:datasets","package:methods","package:base")

  package.list <- search()[ifelse(unlist(gregexpr("package:",search()))==1,TRUE,FALSE)]

  package.list <- setdiff(package.list,basic.packages)

  if (length(package.list)>0)  for (package in package.list) detach(package, character.only=TRUE)

}

detachAllPackages()

bu, temel paketlerinizden ayrı olarak tüm paketlerin ayrılmasını sağlayacaktır


Bunun @mjaniec cevabından farkı nedir?
StupidWolf

1

Çoğu zaman plyrvs dplyrsorunu. Bunu kodun başında kullanın:

detach("package:plyr", unload=TRUE)

Böylece, komut dosyası her çalıştığında, plyrpaketi temizler


0

Birbiriyle çelişen benzer adlandırılmış işlevlere sahip paketlerde sorun yaşıyorsanız, istediğiniz işlevi YAPAN paketin ad alanına her zaman başvurabilirsiniz.

pkg_name::function_i_want()

Bu, sorulan soruya verilen yanıt yerine yorumdur.
Sibo Jiang

Diyelim ki bunu önceki plyr v. Dplyr cevabına yorum olarak ayarlamalıydım, onu taşımak mümkün mü? Hala buradaki kuralları öğreniyorum.
M. Wood

0

Çeşitli cevaplardan bitleri birleştirmek, bulabildiğim en sağlam çözümü verdi ...

packs <- c(names(sessionInfo()$otherPkgs), names(sessionInfo()$loadedOnly))
if(length(packs) > 0){ 
  message('Unloading packages -- if any problems occur, please try this from a fresh R session')
  while(length(packs) > 0){
    newpacks <- c()
    for(packi in 1:length(packs)){
      u=try(unloadNamespace(packs[packi]))
      if(class(u) %in% 'try-error') newpacks <- c(newpacks,packs[packi])
    }
    packs <- newpacks
    Sys.sleep(.1)
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.