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 

필요 (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 Core는 이것이 가능하고 누군가가 원하는 것을 기대합니다.
Gavin Simpson

@Aaron, 나는 ... 세션이 일부 패키지가 원인이되거나 간섭을 일으킬 수있는 경우에 갈 수 있도록하는 것이 유용 할 수 있습니다 언젠가 생각하지만, 이전 단계에서 사용되었다
존 클라크

5
R을 새로운 슬레이트로 되돌릴 수 없습니다. 이에 대해 John Chambers와 이야기를 나눴는데 특히 S4 클래스 / 방법 등록을하기가 어렵습니다.
hadley 2011 년

답변:


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 창에 수직으로 스팸을 보내는 것을 방지하는 데 유용 할 수 있습니다.

(편집 : 2019 년 9 월 20 일) 버전 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 2018

이것은 나를 위해 작동하지 않았습니다. 경고를 받고 실행 한 다음 모든 패키지가 여전히 거기에있는 session.info ()를 실행했습니다.
dxander 19

1
예, 최신 버전의 R 3.6.0에서는 다음을 대신 사용해야합니다. invisible (lapply (paste0 ( 'package :', names (sessionInfo () $ otherPkgs)), detach, character.only = TRUE, unload = TRUE)) invisible (*) 사용은 필수는 아니지만 NULL을 방지 할 수 있습니다. 창에 수직으로 스팸을 보내 응답합니다.
mmfrgmpds 19-06-28

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 19 년

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그것이 유일한 길인 것처럼 보입니다. 감사!
JelenaČuklina

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 = "")
Ramnath

2
실제로 한 @Ramnath -하지만 난되고 싶지 않았다 너무 ;-) 도움이
개빈 심슨

4
force=TRUE패키지에 종속성이있는 경우 추가 할 수도 있습니다 .
James

26

nothing

Romain François에서 제공하는 솔루션을 추가하는 것이 좋습니다. nothing현재 GitHub 에서 사용할 수 있는 패키지를로드하면로드 된 모든 패키지 를 언로드합니다. Romain이 제공하는 예에서와 같이 :

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

Gavin의 대답을 기반으로하지만 완전한 기능은 아니지만 다음 시퀀스가 ​​될 것입니다.

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

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

대부분의 경우 plyrdplyr문제입니다. 코드 시작 부분에 다음을 사용하십시오.

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

따라서 스크립트가 실행될 때마다 plyr패키지 가 지워집니다.


0

비슷한 이름의 함수가 서로 충돌하는 패키지에 문제가있는 경우 원하는 함수가있는 패키지의 네임 스페이스를 항상 참조 할 수 있습니다.

pkg_name::function_i_want()

이것은 질문에 대한 답변이 아닌 댓글입니다.
SIBO 지앙

내가 이것을 이전 plyr v. dplyr 답변에 대한 주석으로 설정해야한다고 가정하면, 이동할 수 있습니까? 나는 아직도 여기서 관습을 배우고있다.
M. Wood

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.