আরে কাজ করার সময় সমস্ত প্যাকেজ বিচ্ছিন্ন করুন


103

অন্য একটি সমস্যা সমাধানের জন্য কাজ করার সময় আমি এই সমস্যাটি পেয়েছি:

আমি এর মাধ্যমে সমস্ত আর বস্তু মুছে ফেলতে পারি:

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

সেশনআইএনফো ()

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

অবজেক্টের জন্য, আশা করুন এটি সংযুক্ত বেস প্যাকেজগুলি সরিয়ে ফেলবে না

ধন্যবাদ;


4
আপনার প্রশ্নটি বৈধ নয় তা নয়, তবে কেন কেবল আর পুনরায় চালু করবেন না?
অ্যারন

5
অ্যারন @ কারণ আপনার খুব বেশি হওয়া উচিত নয় ;-) R CMD checkএকটি প্যাকেজ পাস করার জন্য নিজেকে পরিষ্কারভাবে আনলোড করা উচিত, তাই আর কোর আশা করছেন এটি সম্ভব হবে এবং কিছু করার ইচ্ছা আছে।
গ্যাভিন সিম্পসন

অ্যারন, আমি মনে করি যে কোনও সময় প্যাকেজগুলির কারণে বা হস্তক্ষেপের কারণ হতে পারে তবে সেশন চলতে দেওয়া কার্যকর হতে পারে তবে পূর্ববর্তী পদক্ষেপে ব্যবহৃত হয়েছিল ...
জন ক্লার্ক

6
নতুন করে স্লেটে আর ফিরিয়ে দেওয়া সম্ভব নয়। আমি এ সম্পর্কে জন চেম্বারের সাথে কথা বলেছি এবং এস 4 শ্রেণি / পদ্ধতি নিবন্ধনের জন্য এটি করা বিশেষত কঠিন।
হ্যাডলি

উত্তর:


103

সুতরাং, কারও সহজভাবে নিম্নলিখিত উত্তর দেওয়া উচিত ছিল।

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

দ্রষ্টব্য অদৃশ্য (*) এর ব্যবহার প্রয়োজনীয় নয় তবে NUL উত্তরটি আর উইন্ডোটিকে উল্লম্বভাবে স্প্যামিং করা থেকে বিরত রাখতে কার্যকর হতে পারে।

(সম্পাদনা: 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))

কেউ বেস প্যাকেজগুলির মাধ্যমে বেস প্যাকেজগুলি আনলোড করার চেষ্টা করতে পারে এবং ব্যবহারের চেষ্টাও করতে পারে unloadNamespace(loadedNamespaces())। তবে এগুলি সাধারণত ত্রুটি দ্বারা পরিপূর্ণ এবং sessionInfo()কেবল ত্রুটিগুলি ফিরিয়ে আনার কারণ হিসাবে মৌলিক কার্যকারিতা ভঙ্গ করতে পারে । মূল প্যাকেজটির ডিজাইনে পরিবর্তনের অভাবের কারণে এটি ঘটে। timeDateউদাহরণস্বরূপ, বর্তমানে অপরিবর্তনীয়ভাবে ভাঙ্গতে পারে।

সংস্করণ 4.0.০.২ এর জন্য (সম্পাদনা করুন: 9/24/20) নীচের প্রথমটি প্যাকেজগুলি পরীক্ষার জন্য লোড করে এবং তারপরে প্যাকেজ "বেস" এবং "ইউজেপস" ব্যতীত সমস্ত প্যাকেজ সম্পূর্ণরূপে বিচ্ছিন্ন করার অনুক্রম দেয়। এটি অত্যন্ত প্রস্তাবিত যে কেউ এই প্যাকেজগুলিকে আলাদা না করে।

    invisible(suppressMessages(suppressWarnings(lapply(c("gsl","fBasics","stringr","stringi","Rmpfr"), require, character.only = TRUE))))
    invisible(suppressMessages(suppressWarnings(lapply(names(sessionInfo()$loadedOnly), require, character.only = TRUE))))
    sessionInfo()

    #the above is a test

    invisible(lapply(paste0('package:', c("stringr","fBasics")), detach, character.only=TRUE,unload=TRUE))
    #In the line above, I have inserted by hand what I know the package dependencies to be. A user must know this a priori or have their own automated
    #method to discover it. Without removing dependencies first, the user will have to cycle through loading namespaces and then detaching otherPkgs a
    #second time through.
    invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE,unload=TRUE))

    bspkgs.nb<-sessionInfo()$basePkgs[sessionInfo()$basePkgs!="base"]
    bspkgs.nbu<-bspkgs.nb[bspkgs.nb!="utils"]
    names(bspkgs.nbu)<-bspkgs.nbu
    suppressMessages(invisible(lapply(paste0('package:', names(bspkgs.nbu)), detach, character.only=TRUE,unload=TRUE)))

    #again this thoroughly removes all packages and loaded namespaces except for base packages "base" and "utils" (which is highly not recommended).

4
আমি মনে করি এটির সরলতার কারণে এটি আপোভেটের দাবিদার এবং অতিরিক্ত প্যাকেজগুলির প্রয়োজন নেই।
আন্তোনিও সেরানানো

এটি আমার পক্ষে কার্যকর হয়নি। আমি এটির সতর্কতা পেয়েছি, তারপরে সেশন.info () এর সমস্ত প্যাকেজ রয়েছে ran
dxender

4
হ্যাঁ আর 3.6.0 এর সর্বশেষতম সংস্করণে এর পরিবর্তে নিম্নলিখিত ব্যক্তিকে ব্যবহার করা উচিত। অদৃশ্য (ল্যাপলি (পেস্ট0 ('প্যাকেজ:', নামগুলি (সেশনআইনফো () P অন্যান্যপিগিজ))), বিচ্ছিন্ন, চরিত্র.অনলি = সত্য, আনলোড = সত্য) নোট করুন অদৃশ্য (*) এর ব্যবহারের প্রয়োজন নেই তবে নালকে বাধা দিতে পারে উইন্ডো উল্লম্বভাবে স্প্যামিং থেকে উত্তর।
mmfrgmpds

ত্রুটিতে invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))ফলাফল ব্যবহার করা হচ্ছেError in FUN(X[[i]], ...) : invalid 'name' argument
19:43

ত্রুটিটি Error in FUN(X[[i]], ...)...ঘন ঘন ঘটে যখন কেবলমাত্র একটি নূন্যমূল্য উপস্থিত থাকে। এটির জন্য কেউ পরীক্ষা করতে পারে names(sessionInfo()$otherPkgs)। যদি এটি ফিরে আসে NULL, তবে এটিই কারণ।
মিমিফ্রিজিম্পডস

59

দয়া করে এটি চেষ্টা করুন:

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এটি কেবলমাত্র একমাত্র উপায়। ধন্যবাদ!
জেলিনাউক্লিনা

4
এই আর 4.0.2 জন্য কাজ করে, অন্যান্য সমাধানের না প্রদর্শিত যেহেতু
DSS

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 = "")
রামনাথ

4
@ রমনাথ +1 আসলে - তবে আমি খুব বেশি সহায়ক হতে চাইনি ;-)
গ্যাভিন সিম্পসন

4
force=TRUEপ্যাকেজগুলির নির্ভরতা থাকলে আপনি যুক্ত করতেও পারেন ।
জেমস

27

nothing

রোমেন ফ্রাঞ্জোইস দ্বারা উপলব্ধ সমাধান যোগ করার উপযুক্ত হতে পারে । প্যাকেজটি লোড করার পরে nothing, বর্তমানে গিটহাবটিতে উপলব্ধ , লোড হওয়া সমস্ত প্যাকেজগুলি আনলোড করবে; রোমেন যে উদাহরণ সরবরাহ করে:

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/Irtrration_to_pacman.html ) তাকিয়ে থাকতেও হয়ত pacman::p_unload("all")কাজ করবে?
শ্যান্ডলার

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)

4
একরকমভাবে আমি ওয়ান-লাইনার দিয়ে একই কাজ করতে পারি lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""), detach, character.only = TRUE, unload = TRUE)। যদিও আপনার উত্তর ছাড়া সেখানে পাবেন না!
ইউফোস

3

অথবা আপনার যদি আর স্টুডিও রয়েছে তবে প্যাকেজস ট্যাবে থাকা সমস্ত পরীক্ষিত বাক্সগুলি আলাদা করতে অনিচ্ছুক করুন


4
আপনার যদি প্রচুর পরিমাণে লোড প্যাকেজ থাকে তবে প্রত্যেকটিকে ম্যানুয়ালি চেক করা জটিল is
সিবো জিয়াং

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

এটি নিশ্চিত করবে যে সমস্ত প্যাকেজগুলি আপনার বেসিক প্যাকেজগুলি থেকে আলাদা হয়ে যায়


এটি কীভাবে @ এমজানিয়েকের উত্তর থেকে আলাদা
মূর্খ ওল্ফ

1

বেশিরভাগ সময় এর plyrবনাম dplyrইস্যু। কোডের শুরুতে এটি ব্যবহার করুন:

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

সুতরাং যখনই স্ক্রিপ্টটি চলে তখন এটি plyrপ্যাকেজ সাফ করে


0

যদি আপনার প্যাকেজগুলির সাথে একইরকম নামযুক্ত ফাংশনগুলির একে অপরের সাথে বিরোধপূর্ণ সমস্যা হয় তবে আপনি সর্বদা প্যাকেজটির নাম স্থানটি উল্লেখ করতে পারেন যে আপনি কী চান তা ফাংশন।

pkg_name::function_i_want()

এটি জিজ্ঞাসিত প্রশ্নের উত্তরের পরিবর্তে মন্তব্য।
সিবো জিয়াং

ধরুন আমার পূর্ববর্তী প্লাইর বনাম 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)
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.