Работая над решением другой проблемы, у меня возникла эта проблема:
Я могу удалить все объекты 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))
для объектов ожидайте, что он не удалит прикрепленные базовые пакеты
Спасибо;
R CMD check
пакет, предполагается, что он полностью выгружается, поэтому R Core ожидает, что это возможно, и что-то, что можно было бы сделать.Ответы:
Итак, кто-то должен был просто ответить следующее.
(редактировать: 6-28-19) В последней версии R 3.6.0 используйте вместо нее.
Обратите внимание, что использование invisible (*) не обязательно, но может быть полезно для предотвращения вертикального спама в R-окне ответом NULL.
(редактировать: 20.09.2019) В версии 3.6.1
Может быть полезно
names(sessionInfo()$loadedOnly)
сначала преобразовать загруженные пакеты только в явно прикрепленные пакеты, а затем отсоединить пакеты.Можно попытаться выгрузить базовые пакеты через $ basePkgs, а также попытаться использовать
unloadNamespace(loadedNamespaces())
. Однако они обычно чреваты ошибками и могут нарушить базовую функциональность, например привестиsessionInfo()
к возврату только ошибок. Обычно это происходит из-за отсутствия обратимости в оригинальном дизайне упаковки. В настоящее времяtimeDate
может, например, сломаться безвозвратно.источник
invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))
результатов вError in FUN(X[[i]], ...) : invalid 'name' argument
ошибкеError in FUN(X[[i]], ...)...
часто возникает, когда присутствует только значение NULL. Проверить это можно с помощьюnames(sessionInfo()$otherPkgs)
. Если он вернетсяNULL
, значит, это причина.Пожалуйста, попробуйте это:
источник
plyr
иdplyr
кажется, что это единственный выход. Спасибо!Вы были близки. Обратите внимание , что
?detach
должно сказать о первом аргументеname
изdetach()
:Поэтому нам нужно многократно вызывать
detach()
один раз для каждого элементаpkg
. Есть еще пара аргументов, которые нам нужно указать, чтобы это работало. Во-первыхcharacter.only = TRUE
, функция предполагает, чтоname
это символьная строка - без нее она не будет работать. Во-вторых, мы также, вероятно, захотим выгрузить любое связанное пространство имен. Этого можно добиться, установивunload = TRUE
. Итак, решение, например:Вот полный пример:
Если вы хотите превратить это в функцию, изучите код,
sessionInfo()
чтобы увидеть, как он идентифицирует то, что помечает как «другие прикрепленные пакеты:». Объедините этот фрагмент кода с идеей, описанной выше, в одной функции, и вы дома и сухо. Я оставлю это на ваше усмотрение.источник
pkgs = names(sessionInfo()$otherPkgs)
иpkgs = paste('package:', pkgs, sep = "")
force=TRUE
если у пакетов есть зависимости.nothing
Возможно, стоит добавить решение, предоставленное Роменом Франсуа . При загрузке пакет
nothing
, который в настоящее время доступен на GitHub , выгружает все загруженные пакеты; как в примере, который предоставляет Ромен:Монтаж
При использовании
devtools
пакета:pacman
Альтернативный подход использует
pacman
пакет, доступный через CRAN:источник
pacman::p_unload("all")
тоже подойдет ?Основываясь на ответе Гэвина, но не в полной мере, это будет следующая последовательность:
источник
lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""), detach, character.only = TRUE, unload = TRUE)
. Но без вашего ответа я бы туда не попал!или если у вас есть RStudio, просто снимите все флажки на вкладке «Пакеты», чтобы отсоединить
источник
это гарантирует, что все пакеты будут отсоединены от ваших базовых пакетов
источник
В большинстве случаев это проблема
plyr
vs.dplyr
Используйте это в начале кода:Поэтому всякий раз, когда запускается скрипт, он очищает
plyr
пакетисточник
если у вас возникли проблемы с пакетами, в которых функции с одинаковыми именами конфликтуют друг с другом, вы всегда можете сослаться на пространство имен пакета, функция которого вам нужна.
источник
Объединение битов из разных ответов дало самое надежное решение, которое я смог найти ...
источник