Podczas pracy nad rozwiązaniem innego problemu mam ten problem:
Mogę usunąć wszystkie obiekty R poprzez:
rm(list = ls(all = TRUE))
Czy istnieje równoważne polecenie, które może odłączyć zainstalowane pakiety podczas sesji roboczej?
> 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
wymagają (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
Próbowałem w ten sposób, chociaż nawet to działało w nie globalnym rozwiązaniu:
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
Szukam czegoś globalnego, takiego jak:
rm(list = ls(all = TRUE))
dla obiektów, spodziewaj się, że nie usunie dołączonych pakietów podstawowych
dzięki;
R CMD check
pakietu ma na celu czyste wyładowanie się, więc R Core spodziewa się, że będzie to możliwe i coś, co ktoś chciałby zrobić.Odpowiedzi:
Więc ktoś powinien był po prostu odpowiedzieć na następujące pytania.
(edycja: 6-28-19) W najnowszej wersji R 3.6.0 użyj zamiast tego.
Zauważ, że użycie invisible (*) nie jest konieczne, ale może być przydatne, aby zapobiec blokowaniu przez odpowiedź NULL pionowo okna R.
(edycja: 20.09.2019) W wersji 3.6.1
Pomocne może być
names(sessionInfo()$loadedOnly)
najpierw przekonwertowanie załadowanych tylko na jawnie dołączone pakiety, a następnie odłączenie tych pakietów.Można spróbować wyładować pakiety podstawowe za pośrednictwem $ basePkgs, a także spróbować użyć
unloadNamespace(loadedNamespaces())
. Jednak są one zwykle obarczone błędami i mogą powodować uszkodzenie podstawowych funkcji, takich jaksessionInfo()
zwracanie tylko błędów. Dzieje się tak zazwyczaj z powodu braku odwracalności w projekcie oryginalnego opakowania. ObecnietimeDate
może np. Nieodwracalnie się zepsuć.źródło
invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))
skutkujeError in FUN(X[[i]], ...) : invalid 'name' argument
błędemError in FUN(X[[i]], ...)...
często występuje, gdy obecna jest tylko wartość NULL. Można to sprawdzić za pomocąnames(sessionInfo()$otherPkgs)
. Jeśli powróciNULL
, to jest przyczyna.Spróbuj tego:
źródło
plyr
idplyr
wydaje się, że jest to jedyna droga. Dzięki!Byłeś blisko. Zauważ, co
?detach
ma do powiedzenia o pierwszy argumentname
zdetach()
:Musimy więc wielokrotnie wywoływać
detach()
raz dla każdego elementupkg
. Jest jeszcze kilka innych argumentów, które musimy określić, aby to zadziałało. Pierwsza tocharacter.only = TRUE
, która pozwala funkcji przyjąć, żename
jest to ciąg znaków - bez niego nie będzie działać. Po drugie, prawdopodobnie chcemy również zwolnić wszelką powiązaną przestrzeń nazw. Można to osiągnąć poprzez ustawienieunload = TRUE
. Tak więc rozwiązaniem jest na przykład:Oto pełny przykład:
Jeśli chcesz przekształcić to w funkcję, przestudiuj kod,
sessionInfo()
aby zobaczyć, jak identyfikuje to, co oznacza jako „inne dołączone pakiety:”. Połącz ten fragment kodu z powyższym pomysłem w jednej funkcji, a będziesz suchy. Jednak zostawię to tobie.źródło
pkgs = names(sessionInfo()$otherPkgs)
ipkgs = paste('package:', pkgs, sep = "")
force=TRUE
jeśli pakiety mają zależności.nothing
Warto dodać rozwiązanie udostępnione przez Romaina François . Po załadowaniu pakiet
nothing
, który jest obecnie dostępny na GitHub , wyładuje wszystkie załadowane pakiety; jak w przykładzie, który podaje Romain:Instalacja
Przy korzystaniu z
devtools
pakietu:pacman
Alternatywne podejście wykorzystuje
pacman
pakiet dostępny w CRAN:źródło
pacman::p_unload("all")
by się udało ?Opierając się na odpowiedzi Gavina, ale niezupełnie do pełnej funkcji, byłaby następująca:
źródło
lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""), detach, character.only = TRUE, unload = TRUE)
. Jednak nigdy nie dotarłbym tam bez twojej odpowiedzi!lub jeśli masz RStudio, po prostu odznacz wszystkie zaznaczone pola na karcie Pakiety, aby odłączyć
źródło
zapewni to odłączenie wszystkich pakietów poza pakietami podstawowymi
źródło
W większości przypadków jest to problem z
plyr
vs.dplyr
Użyj tego na początku kodu:Więc za każdym razem, gdy skrypt jest uruchamiany, czyści
plyr
pakietźródło
Jeśli masz problemy z pakietami, które mają podobnie nazwane funkcje, które są ze sobą w konflikcie, zawsze możesz odwołać się do przestrzeni nazw pakietu, której funkcja, której potrzebujesz.
źródło
Połączenie fragmentów różnych odpowiedzi dało najpotężniejsze rozwiązanie, jakie udało mi się znaleźć ...
źródło