Как управлять несколькими местами (папками) пакетов в R?
Прежде чем перейти на R-2.14, я хочу воспользоваться возможностью для оптимизации структуры папок моих установленных пакетов.
В настоящий момент я использую R по умолчанию, то есть все новые установленные пакеты отправляются в R_LIBS_USER. Тем не менее, я действительно различаю два класса пакета:
- Пакеты, которые я использую повторно для выполнения своей работы, например.
plyr
, data.table
и т.д.
- Пакеты, которые я устанавливаю, просто для экспериментов (часто для репликации вопроса или ответа на StackOverflow)
Так как install.packages
предлагает один вариант указать аргумент lib
, это, безусловно, возможно.
Есть ли простой способ управления расположениями пакетов, например. создав некоторые разумные параметры настройки/обертки в .RProfile
или RProfile.Site
?
Ответы
Ответ 1
Отличный пакет Hadley devtools
предоставляет функцию dev_mode
.
http://www.inside-r.org/packages/cran/devtools/docs/dev_mode
Здесь вы можете найти пример использования: https://gist.github.com/1150934
В принципе,
dev_mode(TRUE, path = "anywhere-you-want-to-install")
install.packages("anything-that-you-want-to-install")
является мощным способом.
Ответ 2
Есть много вариантов для этого. Первое, что я сделал, - это адаптировать мой Rprofile.site, чтобы он содержал следующую строку, в результате чего мой путь по умолчанию стал каталогом, не включенным в мою установку R.
.libPaths(c("D:/R/Library",.libPaths()))
Это делает D:/R/Library
мой путь по умолчанию, не теряя других путей. Вы можете добавить два пути к этому, например D:/R/Library/Work
и D:/R/Library/Test
. Тот, который помещается в первую позицию, используется по умолчанию, если вы не укажете lib в install.packages()
.
Затем вы можете назначить две переменные в вашем .Rprofile.site. Они назначаются в базовом пространстве имен и, следовательно, всегда доступны и не удаляются с помощью ls(). Что-то вроде
.libwork <- 'D:/R/Library/Work'
.libtest <- 'D:/R/Library/Test'
который позволяет устанавливать такие пакеты, как:
install.packages('aPackage',lib=.libwork)
Есть и другие варианты, я думаю, но это то, как я бы рулон.
Ответ 3
Предполагается, что вы можете указать несколько путей/деревьев библиотек через список путей, разделенных двоеточиями, в переменной среды R_LIBS. Я не мог заставить это работать надежно на R 2.13.1-исправленный - он только когда-либо берет первую запись. Я получил R_LIBS
и R_LIBS_USER
для надежной работы в своей системе - я обычно устанавливаю только первый.
.libPaths()
может добавлять новые пути к набору деревьев библиотек. Я бы просто добавил соответствующие вызовы .libPaths(new)
в мой .Rprofile
, чтобы добавить соответствующие деревья для каждого сеанса. Затем вы можете выбрать, где устанавливать пакеты во время установки - то есть какое дерево использовать.
Ответ 4
Чтобы ответить, я должен дать немного контекста.
В целях воспроизводимости я стараюсь script вещи, включая всю мою настройку R. У меня есть script "initializeR.r", который, помимо прочего, устанавливает пакеты, и я организовал пакеты в пакетах, например, связанные с кэшированием, те, которые связаны с визуализацией, выборкой, пространственной статистикой и т.д. - мой если вы захотите.
Например, здесь приведен фрагмент:
# Profiling & testing
Packages$CodingTools = c("codetools","debug", "profr","proftools","RUnit")
Я объединяю некоторые из пакетов в список "Major" (или первичный), а другие переходят в "Вторичный" список. Я уверен, что все устанавливаю в основном списке - для этого требуется наличие разумной среды R, использование моих собственных скриптов, функций и пакетов и т.д. (Btw, некоторые пакеты назначаются нескольким пучкам, но только несколько; Я де-dupe перед обработкой агрегированного списка.)
Затем я указываю конкретную библиотеку по умолчанию для платформы и устанавливаю туда. Однако эта возможность расширяема, и эту идею можно расширить, включив в нее необязательные места для каждого пакета (или пакета): просто карту из имени пакета, например. "CodingTools" в уникальный каталог (путь к библиотеке), например "D:/R/Library/CodingTools". Это можно сделать при инициализации script, с соответствующими списками и параметрами по умолчанию, или места могут быть сохранены в другом месте, например хэш-таблица, JSON или база данных.
Как говорили другие, путь к библиотеке по умолчанию должен быть передан R. Это можно сделать в .RProfile.site. В моем случае у меня есть еще один script, который используется для инициализации экземпляра R, как мне хотелось бы. Я пытаюсь избежать внешних файлов параметров, которые читаются R (например, Rprofile), и вместо этого выполняет все инициализации через вызовы функций в моем собственном пакете (хотя параметры по-прежнему являются внешними). Это, как правило, облегчает мне отладку и воспроизведение моей работы. Таким образом, мои пути к библиотеке могут быть включены в один и тот же тип JSON, где указаны местоположения файлов данных.
Лично я хочу уйти от определения пакетов внутри script и вместо этого использовать JSON, так как я могу более легко создавать разные файлы JSON для разных конфигураций настроек. Я уже делаю это для большинства других целей воспроизводимой работы.