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:
- Tworzenie nieszkodliwy pakiet atrapa, również o nazwie tcltk
- umieścić go w katalogu o nazwie, np
"C:/R/Library/dummy/"
.
- 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).
Być może mógłbyś mieć oddzielny katalog z pakietami sans tcltk. R nie może załadować czegoś, czego tam nie ma. –
Wierzę, że tcltk jest wbudowanym pakietem. Przypuszczam, że mógłbym skompilować R bez wsparcia tcltk, ale to wydaje się nieco ekstremalne. –
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. –