2012-04-03 12 views
7

Estoy usando el paquete multinúcleo en R para paralelizar mi código. Sin embargo, si se carga el paquete tcltk, la bifurcación de procesos con el paquete multinúcleo hará que R cuelgue indefinidamente. Por lo tanto, quiero evitar que tcltk se cargue nunca. Quiero un error inmediato si algún paquete intenta cargarlo como una dependencia. es posible?¿Cómo puedo evitar que R cargue un paquete?

Como alternativa, ¿puedo descargar un paquete después de que se haya cargado?

+0

Quizás podría tener un directorio separado con paquetes sans tcltk. R no puede cargar algo que no está allí. –

+0

Creo que tcltk es un paquete integrado. Supongo que podría compilar R sin soporte tcltk, pero eso parece un poco extremo. –

+0

También extremo (¿pero quizás preferible?) Sería crear un paquete ficticio, también llamado 'tcltk', y colocarlo en el directorio separado. Entonces, siempre que su 'libPaths' esté configurado para buscar primero en ese directorio, siempre cargará el paquete ficticio. También podría usar establecer lo siguiente para que se produzca un error cada vez que un paquete intente cargar 'tcltk':' setHook (hookName = packageEvent ("tcltk", "onLoad"), value = function (...) stop ("Advertencia: intentado cargar tcltk")) '. (Tenga en cuenta que el paquete aún se cargará, a pesar del error). Parece que debe haber una solución más limpia, sin embargo. –

Respuesta

3

Si inmediatamente separar el paquete después de que se ha unido es una solución lo suficientemente buena, a continuación, intentar algo así como lo siguiente:

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"  

Si (como parece probable) el acto mismo de la carga & adjuntando el paquete está causando el problema, también puede seguir una estrategia como la esbozada en los comentarios a su pregunta. A saber:

  1. Crear un paquete ficticio inofensivo, también llamado tcltk
  2. colocarlo en un directorio llamado, por ejemplo, "C:/R/Library/dummy/".
  3. Antes de ejecutar cualquier otro comando, anteceda ese directorio al .libPaths ejecutando .libPaths(c("C:/R/Library/dummy/", .libPaths())).

Entonces, si cualquier paquete intenta cargar tcltk, primero la búsqueda de paquetes en "C:/R/Library/dummy/", y al encontrar una de ese nombre, lo cargará por un momento (antes de que sea inmediatamente separado por el gancho descrito encima).

1

Otra forma de evitar cargar un paquete en particular como una dependencia es, basado en el supuesto de que ninguna de las funciones que se requieren dependen de ese paquete, sería hacer referencia a las funciones que necesita el uso de su espacio de nombres:

lattice::xyplot(1~1) 

De esta manera, no necesita cargar el paquete con su función, y no carga inadvertidamente el paquete problemático.

Cuestiones relacionadas