Ho bisogno di ripulire un'istanza R per restituirlo allo stato di virginal all'avvio. Finora, quello che sto facendo è:Come determinare l'ordine di importazione dello spazio dei nomi in [R]
Su lancio, registrare i pacchetti e gli spazi dei nomi caricati
original_packages <- grep('^package:', search(), value = TRUE)
original_namespaces <- loadedNamespaces()
Quando ho bisogno di svuotare l'istanza, staccare ogni pacchetto caricato che non c'era al momento del lancio:
for (pkg in grep('^package:', search(), value = TRUE)) {
if (! pkg %in% original_packages){
detach(pkg, unload=TRUE, force=TRUE, character.only=TRUE)
}
}
Il problema è che se ho caricato un pacchetto con un mazzo di spazi dei nomi importati, come ggplot2, quegli spazi restano caricati, e devo scaricarli in ordine di importazione, da alto livello verso il basso. Semplicemente scaricandoli ciecamente non funziona, dato che "namespace" x "è importato da errori" y "," z "quindi non può essere scaricato".
Ecco esempio riproducibile:
original_packages <- grep('^package:', search(), value = TRUE)
original_namespaces <- loadedNamespaces()
library(ggplot2)
library(plyr)
loadedNamespaces()
for (pkg in grep('^package:', search(), value = TRUE)) {
if (! pkg %in% original_packages){
detach(pkg, unload=TRUE, force=TRUE, character.only=TRUE)
}
}
for (ns in loadedNamespaces()) {
if (! ns %in% original_namespaces){
unloadNamespace(ns)
}
}
C'è qualche modo per capire la gerarchia dello spazio dei nomi di importazione? Se è così, allora dovrei essere in grado di ordinare l'ultimo ciclo correttamente ...
ho rinunciato a questo metodo molto tempo fa. AFAIK, la documentazione per 'detach' dice che non è garantito il funzionamento. L'unico modo garantito è iniziare una nuova sessione. – Andrie
Sì, sfortunatamente non riesco ad avviare una nuova sessione con rpy2 AFAICT - questo è per un'app Web che ha una sessione R persistente nel suo design attuale. – Tarek
In seguito al commento di @ Andrie, gli ultimi commenti sulla risposta a [questa domanda SO] (http://stackoverflow.com/questions/11004018/how-can-a-non-imported-method-in-a- not-attached-package-be-found-by-calls-to-fun) ottenere uno dei motivi per cui semplicemente 'detach'ing non ripristinerà in modo affidabile la tua sessione al suo stato originale. –