2012-04-03 13 views
7

Sto usando il pacchetto multicore in R per parallelizzare il mio codice. Tuttavia, se viene caricato il pacchetto tcltk, i processi di forking con il pacchetto multicore causeranno il blocco di R indefinitamente. Quindi voglio impedire a tcltk di caricare. Voglio un errore immediato se qualsiasi pacchetto prova a caricarlo come dipendenza. È possibile?Come posso evitare che R carichi un pacchetto?

In alternativa, è possibile scaricare un pacchetto dopo che è stato caricato?

+0

Si potrebbe forse avere una directory separata con i pacchetti sans tcltk. R non può caricare qualcosa che non è lì. –

+0

Credo che tcltk sia un pacchetto integrato. Suppongo che potrei compilare R senza supporto tcltk, ma sembra un po 'estremo. –

+0

anche estreme (ma forse preferibile ??) sarebbe quello di creare un pacchetto fittizio, anche chiamata 'tcltk', e posizionarlo nella directory separata. Quindi, finché il tuo 'libPaths' è impostato per cercare prima in quella directory, caricherà sempre il pacchetto fittizio. È quindi possibile anche utilizzare impostare il seguente in modo che un errore viene generato ogni volta che un pacchetto di prova a caricare 'tcltk':' setHook (hookName = packageEvent ("tcltk", "onLoad"), value = function (...) si ferma ("Attenzione: provato a caricare tcltk")) '. (Si noti che il pacchetto verrà comunque caricato, nonostante l'errore). Sembra che ci deve essere una soluzione più pulita, però. –

risposta

3

Se immediatamente staccando il pacchetto dopo che è stato attaccato è una buona soluzione abbastanza, quindi provare qualcosa di simile al seguente:

setHook(hookName = packageEvent("tcltk", "attach"), 
     value = function(...) detach(package:tcltk)) 

# Try it out 
library(tcltk) 
# Loading Tcl/Tk interface ... done 
# Error in as.environment(pos) : invalid 'pos' argument 
search() 
# [1] ".GlobalEnv"  "package:graphics" "package:grDevices" 
# [4] "package:utils"  "package:datasets" "package:methods" 
# [7] "Autoloads"   "package:base"  

Se (come sembra probabile) l'atto stesso di carico & attaccare il pacchetto sta causando il problema, potresti anche perseguire una strategia come quella schematizzata nei commenti alla tua domanda. Vale a dire:

  1. creare un pacchetto fittizio innocuo, chiamato anche tcltk
  2. posto in una directory di nome, per esempio, "C:/R/Library/dummy/".
  3. Prima di eseguire altri comandi, anteporre quella directory a .libPaths eseguendo .libPaths(c("C:/R/Library/dummy/", .libPaths())).

Quindi, se qualsiasi pacchetto tenta di caricare tcltk, cercherà prima per i pacchetti in "C:/R/Library/dummy/", e, trovando una di quel nome, verrà caricato per un momento (prima che venga immediatamente rimosso dal gancio descritto sopra).

1

Un altro modo per evitare il caricamento di un particolare pacchetto come dipendenza è, sulla base del presupposto che nessuna delle funzioni necessarie dipendono da quel pacchetto, potrebbe essere quella di fare riferimento le funzioni necessarie utilizzando il loro spazio dei nomi:

lattice::xyplot(1~1) 

questo modo, non c'è bisogno di caricare il pacchetto con la funzione, e non si inavvertitamente caricare il pacchetto problema.

Problemi correlati