Отсоединить все пакеты во время работы в 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 

Я пробовал этот путь, хотя даже он работал не в глобальном решении:

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))

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

спасибо;

Ответ 1

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

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.

(редакция: 20.09.2009) В версии 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 может сломаться, например, необратимо.

Ответ 2

Пожалуйста, попробуйте следующее:

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()

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Построение ответа Гэвина, но не вполне полная функция, будет следующей:

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)

Ответ 6

или если у вас есть RStudio, просто снимите все флажки в закладке Packages, чтобы отсоединить

Ответ 7

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

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

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

Ответ 8

Объединение битов из разных ответов дало самое надежное решение, которое я мог найти...

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)
  }
}

Ответ 9

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

pkg_name::function_i_want()