आर में काम करते समय सभी पैकेजों को अलग करें


101

एक और समस्या को हल करने के लिए काम करते समय मुझे यह समस्या हुई:

मैं सभी R वस्तुओं को हटा सकता हूं:

rm(list = ls(all = TRUE))

क्या समतुल्य कमांड है जो कार्य सत्र के दौरान संकुल को अलग कर सकता है?

> 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 

की आवश्यकता होती है (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 

मैंने इस तरह से कोशिश की, हालांकि यह भी एक वैश्विक समाधान में काम नहीं किया:

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

मैं जिस चीज़ के लिए मज़ाक कर रहा हूँ वह कुछ वैश्विक है:

  rm(list = ls(all = TRUE))

वस्तुओं के लिए, उम्मीद है कि यह संलग्न आधार पैकेजों को नहीं हटाएगा

धन्यवाद;


3
ऐसा नहीं है कि आपका प्रश्न मान्य नहीं है, लेकिन आर को पुनः आरंभ क्यों नहीं किया?
हारून ने

5
@Aaron क्योंकि आपके पास भी नहीं होना चाहिए ;-) R CMD checkएक पैकेज को पारित करने के लिए सफाई से खुद को अनलोड करना माना जाता है, इसलिए आर कोर यह संभव होने की उम्मीद करता है और कुछ ऐसा करने की इच्छा हो सकती है।
गाविन सिम्पसन

@Aaron, मुझे लगता है कि कुछ समय के लिए यह उपयोगी हो सकता है कि सत्र चल रहा है जब कुछ पैकेज पैदा कर रहे हैं या हस्तक्षेप का कारण हो सकता है, लेकिन पिछले चरणों में उपयोग किया गया था ...
जॉन क्लार्क

5
R को एक ताज़ा स्लेट पर वापस करना संभव नहीं है। मैंने इस बारे में जॉन चैंबर्स के साथ बात की है, और S4 वर्ग / विधि पंजीकरण के लिए करना विशेष रूप से मुश्किल है।
हैडली

जवाबों:


98

तो, किसी को बस निम्नलिखित उत्तर देना चाहिए था।

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

(संपादित करें: 6-28-19) आर 3.6.0 के नवीनतम संस्करण में इसके बजाय कृपया उपयोग करें।

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

ध्यान दें कि अदृश्य (*) का उपयोग आवश्यक नहीं है, लेकिन R विंडो को लंबवत स्पैमिंग से NULL उत्तर को रोकने के लिए उपयोगी हो सकता है।

(संपादित करें: 9/20/2019) संस्करण 3.6.1 में

यह केवल names(sessionInfo()$loadedOnly)पहले से स्पष्ट रूप से संलग्न पैकेजों में लोड किए गए कन्वर्ट करने के लिए सहायक हो सकता है , और फिर संकुल को अलग कर सकता है, जैसा कि।

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

एक $ basePkgs के माध्यम से आधार पैकेजों को उतारने का प्रयास कर सकता है और उपयोग करने का प्रयास भी कर सकता है unloadNamespace(loadedNamespaces())। हालांकि ये आम तौर पर त्रुटियों से भरा होता है और बुनियादी कार्यक्षमता को तोड़ सकता है जैसे कि sessionInfo()केवल त्रुटियों को वापस करने के लिए। यह आमतौर पर मूल पैकेज के डिजाइन में प्रतिवर्तीता की कमी के कारण होता है। वर्तमान में timeDateअपरिवर्तनीय रूप से टूट सकता है, उदाहरण के लिए।


3
मुझे लगता है कि यह अपनी सादगी के कारण अपवित्र है और अतिरिक्त पैकेज की आवश्यकता नहीं है।
एंटोनियो सेरानो

इसने मेरे लिए काम नहीं किया। मैंने इसे चेतावनी दी, फिर भाग गया ।.in.info () सभी पैकेज अभी भी थे।
dxander

1
हां आर 3.6.0 के नवीनतम संस्करण में इसके बजाय निम्नलिखित का उपयोग करना चाहिए। अदृश्य (lapply (पेस्ट 0 ('पैकेज:', नाम (sessionInfo () $ otherPkgs)), detach, character.only = TRUE, unload = TRUE)) नोट अदृश्य (*) के उपयोग की आवश्यकता नहीं है, लेकिन NULL को रोक सकते हैं खिड़की से लंबवत स्पैमिंग का उत्तर दें।
mmfrgmpds जू

invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))एक Error in FUN(X[[i]], ...) : invalid 'name' argumentत्रुटि में परिणाम का उपयोग करना
dvanic

त्रुटि Error in FUN(X[[i]], ...)...तब होती है जब केवल एक पूर्ण मान मौजूद होता है। इसके साथ एक परीक्षण किया जा सकता है names(sessionInfo()$otherPkgs)। अगर यह लौटता है NULL, तो यही कारण है।
mmfrgmpds

57

कृपया इसे आज़माएँ:

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
मामले में जब आप गड़बड़ करते हैं plyrऔर dplyrयह जाने का एकमात्र तरीका लगता है। धन्यवाद!
जेलेनाउक्लिना

29

तुम पास थे। ध्यान दें कि ?detachपहले तर्क nameके बारे में क्या कहना है detach():

तर्क:

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’.

इसलिए हमें बार- detach()बार प्रति तत्व एक बार कॉल करने की आवश्यकता है pkg। कुछ अन्य तर्क हैं जिन्हें हमें यह काम करने के लिए निर्दिष्ट करने की आवश्यकता है। पहला है character.only = TRUE, जो फ़ंक्शन को यह मानने की अनुमति देता है कि nameयह वर्ण स्ट्रिंग है - यह इसके बिना काम नहीं करेगा। दूसरा, हम शायद किसी भी संबंधित नामस्थान को अनलोड करना चाहते हैं। इसे सेटिंग करके हासिल किया जा सकता है unload = TRUE। इसलिए समाधान है, उदाहरण के लिए:

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

यहाँ एक पूर्ण उदाहरण है:

> 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

यदि आप इसे किसी फ़ंक्शन में बदलना चाहते हैं, तो कोड का अध्ययन करके sessionInfo()देखें कि यह कैसे पहचानता है कि यह "अन्य संलग्न पैकेज" के रूप में क्या लेबल करता है। एक एकल फ़ंक्शन में ऊपर दिए गए विचार के साथ कोड के उस बिट को मिलाएं और आप घर और सूखे हैं। मैं उस बिट को आप तक छोड़ दूँगा।


12
आप जोड़कर इस स्वचालित कर सकते हैं pkgs = names(sessionInfo()$otherPkgs)औरpkgs = paste('package:', pkgs, sep = "")
रामनाथ

2
@ रामनाथ +1 वास्तव में - लेकिन मैं बहुत मददगार नहीं बनना चाहता था ;-)
गेविन सिम्पसन

4
आप force=TRUEपैकेज की निर्भरता होने की स्थिति में भी जोड़ना चाह सकते हैं ।
जेम्स

26

nothing

यह रोमेन फ्रांस्वा द्वारा उपलब्ध कराए गए समाधान को जोड़ने के लायक हो सकता है । जब पैकेज लोड किया जाता है nothing, जो वर्तमान में GitHub पर उपलब्ध है , तो सभी लोड किए गए पैकेज को अनलोड करेगा; उदाहरण के लिए कि रोमेन प्रदान करता है:

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

require(nothing, quietly = TRUE)

loadedNamespaces()
[1] "base"

स्थापना

devtoolsपैकेज के उपयोग के साथ :

devtools::install_github("romainfrancois/nothing")

pacman

एक वैकल्पिक दृष्टिकोण pacmanCRAN के माध्यम से उपलब्ध पैकेज का उपयोग करता है :

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

4
विग्नेट ( trinker.github.io/pacman/vignettes/Introduction_to_pacman.html ) को देखते हुए शायद pacman::p_unload("all")काम करेगा?
chandler

10

गैविन के जवाब पर निर्माण करना लेकिन एक पूर्ण कार्य के लिए यह क्रम नहीं होगा:

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
किसी तरह मैं वन-लाइनर के साथ भी ऐसा ही कर सकता हूं lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""), detach, character.only = TRUE, unload = TRUE)। आपके जवाब के बिना वहाँ कभी नहीं मिलेगा!
उफोस

4

या यदि आपके पास RStudio है, तो बस पैकेज के सभी चेक बॉक्स को अलग करने के लिए अनचेक करें


1
यदि आपके पास बहुत सारे भरे हुए पैकेज हैं, तो हर एक को मैन्युअल रूप से अनचेक करना बोझिल है।
सिबो जियांग

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

यह सुनिश्चित करेगा कि सभी पैकेज आपके मूल पैकेजों से अलग हो जाएंगे


यह @mjaniec उत्तर से अलग कैसे है
स्टुपिडॉल्फ

1

अधिकांश समय इसका plyrबनाम dplyrमुद्दा है। कोड की शुरुआत में इसका उपयोग करें:

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

इसलिए जब भी स्क्रिप्ट चलती है, इसका plyrपैकेज साफ हो जाता है


0

यदि आपको ऐसे पैकेजों की समस्या है, जिनके समान कार्य एक-दूसरे के साथ परस्पर विरोधी हैं, तो आप हमेशा पैकेज के नेमस्पेस को संदर्भित कर सकते हैं, जो आप चाहते हैं।

pkg_name::function_i_want()

यह पूछे गए प्रश्न के उत्तर के बजाय टिप्पणी है।
सिबो जियांग

मान लीजिए कि मुझे पिछले plyr v। Dplyr उत्तर पर टिप्पणी के रूप में इसे सेट करना है, क्या इसे स्थानांतरित करना संभव है? मैं अभी भी यहाँ सम्मेलनों को सीख रहा हूँ।
एम। लकड़ी

0

विभिन्न उत्तरों से बिट्स को मिलाते हुए सबसे मजबूत समाधान दिया गया जो मुझे मिल सकता है ...

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)
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.