Próbuję usunąć pakiet ze wszystkimi jego zależnościami. Problem, na który napotykam, to kolejność rozładowywania zależności. Ponieważ zależności są rekursywne, można je tylko rozładować z dołu do góry w drzewie zależności.Rozładuj pakiet i wszystkie zależności.
Czy istnieje prosty lub natywny sposób w R, aby osiągnąć ten cel? Poniżej pierwszej podróży w tym, co chciałbym osiągnąć:
eval_current <- function(expr, envir=parent.frame(), timeout=60){
#set the timeout
setTimeLimit(elapsed=timeout, transient=TRUE);
#currently loaded packages
currentlyattached <- search();
currentlyloaded <- loadedNamespaces();
on.exit({
#reset time limit
setTimeLimit(cpu=Inf, elapsed=Inf, transient=FALSE);
#try to detach packages that were attached during eval
nowattached <- search();
todetach <- nowattached[!(nowattached %in% currentlyattached)];
for(i in seq_along(todetach)){
try(detach(todetach[i], unload=TRUE, character.only=TRUE, force=TRUE));
}
#try to unload packages that are still loaded
nowloaded <- loadedNamespaces();
tounload <- nowloaded[!(nowloaded %in% currentlyloaded)];
for(i in seq_along(tounload)){
try(unloadNamespace(tounload[i]));
}
});
eval(expr, envir)
}
Ale to skutkuje:
> eval_current({library(ggplot2); qplot(rnorm(100));})
Error in unloadNamespace(tounload[i]) :
namespace ‘colorspace’ is imported by ‘munsell’ so cannot be unloaded
Error in unloadNamespace(tounload[i]) :
namespace ‘dichromat’ is imported by ‘scales’ so cannot be unloaded
Error in unloadNamespace(tounload[i]) :
namespace ‘grid’ is imported by ‘gtable’ so cannot be unloaded
Error in unloadNamespace(tounload[i]) :
namespace ‘labeling’ is imported by ‘scales’ so cannot be unloaded
Error in unloadNamespace(tounload[i]) :
namespace ‘munsell’ is imported by ‘scales’ so cannot be unloaded
Ja bym 'killall R; R "zamiast tego. Procesy są tanie. –
Haha tak, to już jest rozwiązanie specyficzne dla systemu Windows. Na unixie możemy po prostu użyć tymczasowego widelca. – Jeroen
Za każdą minutę spędzoną na inżynierii wokół brodawek Windows, $ Deity zabija kotka. Po prostu tego nie rób. –