2012-04-03 18 views
7

Używam pakietu multicore w R do równoległego mojego kodu. Jeśli jednak zostanie załadowany pakiet tcltk, rozwidlenie procesów za pomocą pakietu wielordzeniowego spowoduje, że R zawiesza się w nieskończoność. Dlatego chcę zapobiec ładowaniu tcltk. Chcę natychmiastowy błąd, jeśli jakikolwiek pakiet próbuje załadować go jako zależność. czy to możliwe?Jak mogę zapobiec ładowaniu pakietu przez R.?

Alternatywnie, czy mogę wyładować paczkę po załadowaniu?

+0

Być może mógłbyś mieć oddzielny katalog z pakietami sans tcltk. R nie może załadować czegoś, czego tam nie ma. –

+0

Wierzę, że tcltk jest wbudowanym pakietem. Przypuszczam, że mógłbym skompilować R bez wsparcia tcltk, ale to wydaje się nieco ekstremalne. –

+0

Również ekstremalne (ale być może lepsze?) Byłoby stworzenie fałszywego pakietu, zwanego również 'tcltk', i umieszczenie go w oddzielnym katalogu. Następnie tak długo, jak twoje 'libPaths' jest ustawione tak, aby wyglądało najpierw w tym katalogu, zawsze będzie ładowało fałszywą paczkę. Możesz także użyć polecenia set tak, aby błąd był generowany za każdym razem, gdy pakiet próbuje załadować 'tcltk':' setHook (hookName = packageEvent ("tcltk", "onLoad"), value = function (...) stop ("Ostrzeżenie: próbowałem załadować tcltk")) '. (Należy pamiętać, że pakiet nadal będzie ładowany mimo błędu). Wygląda jednak na to, że musi istnieć czystsze rozwiązanie. –

Odpowiedz

3

Jeśli natychmiast odłączeniu pakietu po to został dołączony jest wystarczająco dobre rozwiązanie, a następnie spróbuj coś jak następuje:

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"  

Jeśli (co wydaje się prawdopodobne) sam akt załadunku & mocowania pakietu jest przyczyną problemu, możesz również zastosować strategię podobną do tej opisanej w komentarzach do twojego pytania. Mianowicie:

  1. Tworzenie nieszkodliwy pakiet atrapa, również o nazwie tcltk
  2. umieścić go w katalogu o nazwie, np "C:/R/Library/dummy/".
  3. Przed uruchomieniem jakichkolwiek innych poleceń, prześlij ten katalog do .libPaths, wykonując .libPaths(c("C:/R/Library/dummy/", .libPaths())).

Następnie, jeśli dowolny pakiet próbuje załadować tcltk, to najpierw poszuka pakietów w "C:/R/Library/dummy/", a znalezienie jednego z tą nazwą, będzie załadować go na chwilę (zanim zostanie natychmiast usuniety przez hak opisanej powyżej).

1

Innym sposobem, aby uniknąć ładowania konkretny pakiet jako zależność jest oparta na założeniu, że żadna z funkcji potrzebne zależy od tego pakietu, byłoby odwołać funkcje potrzebne przy użyciu ich nazw:

lattice::xyplot(1~1) 

W ten sposób nie trzeba ładować pakietu z funkcją i nie przypadkowo załadować pakiet problemów.

Powiązane problemy