R에서 작업하는 동안 모든 패키지 분리
다른 문제를 해결하기 위해 작업하는 동안 다음과 같은 문제가 발생했습니다.
다음을 통해 모든 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
required(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))
개체의 경우 연결된 기본 패키지를 제거하지 않을 것으로 예상합니다.
감사합니다;
그래서, 누군가는 다음과 같이 간단히 대답했어야 합니다.
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))
보이지 않음(*)을 사용할 필요는 없지만 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예를 들어, 되돌릴 수 없을 정도로 부서질 수 있습니다.
(편집: 9/24/20) 버전 4.0.2 다음은 먼저 테스트할 패키지를 로드한 다음 패키지 "베이스" 및 "유틸리티"를 제외한 모든 패키지를 완전히 분리하는 시퀀스를 제공합니다.이러한 패키지는 분리하지 않는 것이 좋습니다.
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).
다음을 시도해 보십시오.
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()
nothing
로맹 프랑수아가 제공한 솔루션을 추가할 가치가 있을 수 있습니다.현재 GitHub에서 사용할 수 있는 패키지를 로드하면 Romain에서 제공하는 예와 같이 로드된 모든 패키지가 언로드됩니다.
loadedNamespaces()
[1] "base" "datasets" "grDevices" "graphics" "methods" "stats"
[7] "utils"
require(nothing, quietly = TRUE)
loadedNamespaces()
[1] "base"
설치
패키지 사용 시:
devtools::install_github("romainfrancois/nothing")
pacman
대안적인 접근 방식은 CRAN을 통해 제공되는 패키지를 사용합니다.
pacman::p_unload(pacman::p_loaded(), character.only = TRUE)
아슬아슬했어요.주의할 점?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()레이블이 "기타 첨부 패키지:"로 표시되는 항목을 식별하는 방법을 확인합니다.그 코드 조각을 위의 아이디어와 단일 기능으로 결합하면 당신은 집에 있고 건조합니다.하지만 그 부분은 당신에게 맡기겠습니다.
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)
또는 RStudio를 사용하는 경우 패키지 탭에서 확인란을 모두 선택 취소하여 분리하기만 하면 됩니다.
#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()
이렇게 하면 기본 패키지를 제외한 모든 패키지가 분리됩니다.
대부분의 경우 그것은plyr 대dplyr문제. 코드의 시작 부분에 사용합니다.
detach("package:plyr", unload=TRUE)
실행될 ▁the▁runs를 지웁니다.plyr
다양한 답변의 비트를 결합하여 제가 찾을 수 있는 가장 강력한 솔루션을 제공했습니다.
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)
}
}
첨부된 패키지를 모두 제거하려면 아래와 같이 하면 어떨까요?
intialPackages = search() # added as 1st line of R script to get list of default packages
# below lines are added when newly attached packages needs to be removed
newPackages = search()[!(search() %in% intialPackages)]
try(sapply(newPackages, detach, character.only=TRUE, unload=TRUE, force=TRUE), silent=TRUE)
유사한 이름의 함수가 서로 충돌하는 패키지에 문제가 있는 경우 원하는 함수의 패키지 네임스페이스를 언제든지 참조할 수 있습니다.
pkg_name::function_i_want()
언급URL : https://stackoverflow.com/questions/7505547/detach-all-packages-while-working-in-r
'programing' 카테고리의 다른 글
| 마스터 푸시에서 Git 트리거를 사용하여 젠킨스 CI를 만들려면 어떻게 해야 합니까? (0) | 2023.07.11 |
|---|---|
| 파이어베이스 업데이트 대 세트 (0) | 2023.07.11 |
| mongoose에서 중첩된 개체 업데이트 중 (0) | 2023.07.11 |
| HTML 페이지에서 엑셀 시트를 표시하는 방법 (0) | 2023.07.11 |
| PHP 7 MongoDB 클라이언트/드라이버를 설치하시겠습니까? (0) | 2023.07.11 |