Rでの作業中にすべてのパッケージを切り離す


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 

require(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
あなたの質問が有効ではないというわけではありませんが、なぜRを再起動しないのですか?
アーロンがスタックオーバーフローを去る

5
@Aaronはあまり必要ないので;-) R CMD checkパッケージを渡すと、それ自体がきれいにアンロードされるはずなので、Rコアはこれが可能であり、何かしたいことを期待しています。
Gavin Simpson

@アーロン、いくつかのパッケージが干渉を引き起こしている、または干渉を引き起こしている可能性がある場合にセッションを続行すると便利な場合がありますが、前の手順で使用されていました...
John Clark

5
Rを新しい状態に戻すことはできません。これについてJohn Chambersと話しましたが、S4クラス/メソッドの登録を行うのは特に困難です。
ハドリー2009

回答:


98

したがって、誰かが単に次のように答えるべきでした。

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

(編集:6-28-19)R 3.6.0の最新バージョンでは、代わりに使用してください。

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

invisible(*)の使用は必須ではありませんが、NULL応答がRウィンドウを垂直方向にスパムすることを防ぐのに役立ちます。

(編集: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
そのシンプルさと追加のパッケージを必要としないため、これは賛成票に値すると思います。
Antonio Serrano

これは私にはうまくいきませんでした。警告が表示されて実行した後、session.info()を実行したところ、すべてのパッケージがまだ存在していました。
dxander

1
はい、最新バージョンのR 3.6.0では、代わりに以下を使用してください。invisible(lapply(paste0( 'package:'、names(sessionInfo()$ otherPkgs))、detach、character.only = TRUE、unload = TRUE))invisible(*)の使用は必須ではありませんが、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]], ...)...NULL値のみが存在する場合、エラーが頻繁に発生します。これをでテストでき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
あなたが台無しにするとき場合はplyrdplyrそれは行くための唯一の方法と思われます。ありがとう!
JelenaČuklina

29

あなたは近くにいた。何に注意してください?detach最初の引数について言いたいことがあるnamedetach()

引数:

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()要素ごとに1回繰り返し呼び出す必要がありpkgます。これを機能させるために指定する必要がある他の引数がいくつかあります。1つ目はです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()「他の添付パッケージ」としてラベル付けされているものをどのように識別するかを確認してください。そのコードのコードを上記のアイデアと1つの関数で組み合わせると、家に帰ってドライになります。少しお任せします。


12
pkgs = names(sessionInfo()$otherPkgs)and を追加することでこれを自動化できますpkgs = paste('package:', pkgs, sep = "")
Ramnath '21

2
@Ramnath +1確かに-しかし、私はあまり役に立ちたくありませんでした;-)
Gavin Simpson

4
force=TRUEパッケージに依存関係がある場合は、追加することもできます。
ジェームズ

26

nothing

RomainFrançoisによって提供されたソリューションを追加することは価値があるかもしれません。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

別のアプローチではpacman、CRANを通じて利用可能なパッケージを使用します。

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

4
ビネット(trinker.github.io/pacman/vignettes/Introduction_to_pacman.html)を見ても、おそらくpacman::p_unload("all")うまくいくでしょうか?
チャンドラー2017

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)。しかし、あなたの答えなしではそこに到達することは決してないでしょう!
Ufos 2018

4

または、RStudioを使用している場合は、[パッケージ]タブのすべてのチェックボックスをオフにしてデタッチします


1
ロードされたパッケージがたくさんある場合、すべてのパッケージを手動でオフにするのは面倒です。
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()

これにより、すべてのパッケージが基本パッケージとは別に切り離されます。


これは@mjaniecの回答とどう違うのですか
StupidWolf

1

ほとんどの場合、そのplyrvs dplyr問題です。コードの最初でこれを使用します:

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

したがって、スクリプトが実行されるたびに、plyrパッケージがクリアされます


0

同じ名前の関数が互いに競合しているパッケージで問題が発生している場合は、必要な関数を持つパッケージの名前空間をいつでも参照できます。

pkg_name::function_i_want()

これは、質問に対する回答ではなくコメントです。
Sibo Jiang

これを前のplyr対dplyrの回答へのコメントとして設定していたとしたら、それを移動することはできますか?私はまだ慣習をここで学んでいます。
M.ウッド

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.