在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
需要(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
我试过这种方式,虽然它不是一个全球性的解决scheme:
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))
对于对象,期望它不会删除附加的基础包
谢谢;
请试试这个:
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()
你很近 请注意什么?detach
不得不说关于detach()
的第一个参数name
:
参数:
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'.
所以我们需要反复每个元素的pkg
调用一次detach()
。 有几个我们需要指定的其他参数来使这个工作。 第一个是character.only = TRUE
,它允许函数假定这个name
是一个string – 没有它就无法工作。 其次,我们也可能要卸载任何相关的命名空间。 这可以通过设置unload = TRUE
来实现。 所以解决scheme是,例如:
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()
的代码,看看它是如何标识它被标记为“其他附加包:”。 结合这一点代码与上述想法在一个单一的function,你在家里,干燥。 尽pipe如此,我会留给你的。
所以,有人应该简单回答以下几点。
lapply(paste('package:',names(sessionInfo()$otherPkgs),sep=""),detach,character.only=TRUE,unload=TRUE)
nothing
可能需要添加RomainFrançois提供的解决scheme。 当加载包时, 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
另一种方法是通过CRAN使用pacman
软件包:
pacman::p_unload(pacman::p_loaded(), character.only = TRUE)
build立在加文的答案,但不完全是一个完整的function将是这样的顺序:
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,只需取消选中“软件包”选项卡中的所有checkbox以分离即可