2013-07-21 24 views
7

Tüm bağımlılıkları olan bir paketi kaldırmaya çalışıyorum. Çalıştığım sorun, bağımlılıkları kaldırmak için verilen sıra. Bağımlılıklar özyineliyken, bağımlılık ağacında sadece aşağıdan yukarıya boşaltılabilirler.Bir paket ve tüm bağımlıları kaldırma

Bunu başarmak için R'de kolay veya doğal bir yol var mı?

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

Ama sonuçlanır: ne bir ilk seferde Aşağıda ben başarmak istiyorum

> 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 
+3

Ben killall R; Bunun yerine R'. Süreçler ucuzdur. –

+0

Haha evet, bu zaten bir pencereye özel bir çözüm. Unix'te gerçekten sadece geçici bir çatal kullanabiliriz. – Jeroen

+1

Her sene, bir Windows siğil çevresinde mühendislik geçirdiğinizde, Deity bir yavruyu öldürür. Sadece yapma. –

cevap

1

Bu benim için çalışıyor - biraz ham ama işi alır.

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)]; 
    while(! length(todetach) == 0){ 
    for(i in seq_along(todetach)){ 
     suppressWarnings(tryCatch(detach(todetach[i], unload=TRUE, character.only=TRUE, force=TRUE),error = function(x) return(NA))) 
    } 
    nowattached <- search(); 
    todetach <- sample(nowattached[!(nowattached %in% currentlyattached)]); 
    } 

    #try to unload packages that are still loaded 
    nowloaded <- loadedNamespaces(); 
    tounload <- nowloaded[!(nowloaded %in% currentlyloaded)]; 
    while(! length(tounload) == 0){ 
    for(i in seq_along(todetach)){ 
     suppressWarnings(tryCatch(unloadNamespace(tounload[i]),error = function(x) return(NA))) 
    } 
    nowloaded <- loadedNamespaces(); 
    tounload <- sample(nowloaded[!(nowloaded %in% currentlyloaded)]); 
    } 
}); 
+0

Sanırım ikincisindeki for döngüsünün şu an için olması gerekir (i'de seq_along (tounload)) – PolBM