Как я могу предотвратить загрузку пакета R? - PullRequest
7 голосов
/ 03 апреля 2012

Я использую многоядерный пакет в R для распараллеливания моего кода. Однако, если пакет tcltk загружен, разветвление процессов с помощью многоядерного пакета приведет к зависанию R на неопределенное время. Поэтому я хочу предотвратить загрузку tcltk. Я хочу немедленную ошибку, если какой-либо пакет пытается загрузить его как зависимость. Возможно ли это?

Или я могу выгрузить пакет после его загрузки?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Если немедленно отсоединение пакета после его установки является достаточно хорошим решением, попробуйте что-то вроде следующего:

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"     

Если (как представляется вероятным) сам актпроблема заключается в загрузке и прикреплении пакета, вы можете также придерживаться стратегии, подобной той, которая описана в комментариях к вашему вопросу.А именно:

  1. Создать безвредный фиктивный пакет, также называемый tcltk
  2. Поместить его в каталог с именем, например, "C:/R/Library/dummy/".
  3. Перед выполнением любых других команд добавьте к этому каталогу .libPaths, выполнив .libPaths(c("C:/R/Library/dummy/", .libPaths())).

Затем, если какой-либо пакет попытается загрузить tcltk , он сначала будет искатьпакеты в "C:/R/Library/dummy/" и, найдя одно из этих имен, на мгновение загрузят его (прежде чем он будет немедленно отсоединен описанным выше хуком).

1 голос
/ 04 апреля 2012

Еще один способ избежать загрузки конкретного пакета в качестве зависимости, основанный на предположении, что ни одна из функций, которые вам требуются, не зависят от этого пакета, будет ссылаться на функции, которые вам нужны, используя их пространство имен:

lattice::xyplot(1~1)

Таким образом, вам не нужно загружать пакет с вашей функцией, и вы случайно не загрузите проблемный пакет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...