отсоединить все пакеты во время работы в R - PullRequest
83 голосов
/ 21 сентября 2011

Работая над решением другой проблемы, я получил эту проблему:

Я могу удалить все объекты 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))

для объектов, ожидайте, что это не приведет к удалению прикрепленных базовых пакетов

спасибо;

Ответы [ 8 ]

81 голосов
/ 30 августа 2016

Итак, кто-то должен был просто ответить на следующее.

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.

50 голосов
/ 11 января 2012

Пожалуйста, попробуйте это:

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()
29 голосов
/ 21 сентября 2011

Вы были близки.Обратите внимание, что ?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(), чтобыПосмотрите, как он определяет, что он помечает как «другие прикрепленные пакеты:».Объедините этот кусочек кода с идеей выше в одной функции, и вы дома и сухо.Хотя я оставлю это на ваше усмотрение.

20 голосов
/ 24 января 2017

nothing

Возможно, стоит добавить решение, сделанное Ромен Франсуа . После загрузки пакет 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

В альтернативном подходе используется пакет pacman, доступный через CRAN:

pacman::p_unload(pacman::p_loaded(), character.only = TRUE)
8 голосов
/ 22 сентября 2011

Основываясь на ответе Гэвина, но не совсем на полную функцию, будет следующая последовательность:

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)
3 голосов
/ 05 июня 2017

или, если у вас есть RStudio, просто снимите все флажки на вкладке «Пакеты», чтобы отключить

0 голосов
/ 25 января 2019

Если у вас возникают проблемы с пакетами, функции которых с одинаковыми именами конфликтуют друг с другом, вы всегда можете ссылаться на пространство имен пакета, функция которого вам НУЖНА.

pkg_name::function_i_want()
0 голосов
/ 24 декабря 2017

В большинстве случаев это проблема plyr против dplyr.Используйте это в начале кода:

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

Поэтому, когда скрипт запускается, он очищает пакет plyr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...