Кажется, я делюсь большим количеством кода с соавторами в эти дни. Многие из них являются новичками / пользователями среднего уровня и не понимают, что им нужно устанавливать пакеты, которых у них еще нет.
Есть ли элегантный способ вызова installed.packages()
, сравните его с теми, которые я загружаю и устанавливаю, если отсутствует?
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
.base
Ответы:
Да. Если у вас есть список пакетов, сравните его с выходными данными
installed.packages()[,"Package"]
и установите недостающие пакеты. Что-то вроде этого:В противном случае:
Если вы поместите свой код в пакет и сделаете их зависимостями, они будут автоматически установлены при установке пакета.
источник
if(length(new.packages)>0) {install.packages(new.packages)}
new.packages <- c(1,2)
length(new.packages)
if(length(new.packages)){print("hello!")}else{print("oh no!")}
require
проверкаinstalled.packages
packrat
был сделан для этого. Это воспроизводимая система управления пакетами. Этот путь идет по этому пути неправильно и портит чужую среду и не воспроизводится. У Packrat есть собственная папка и среда для общих библиотек. rstudio.github.io/packratУ Дэйсона К. и у меня есть пакет pacman , который может сделать это красиво. Функция
p_load
в пакете делает это. Первая строка просто для того, чтобы убедиться, что pacman установлен.источник
/
и, если он был найден, автоматически установил / загрузил с github.if (!require("pacman")) install.packages("pacman")
, что в pacman есть функция,p_boot()
которая автоматически выбирает эту строку и копирует ее в буфер обмена.Вы можете просто использовать возвращаемое значение
require
:Я использую
library
после установки, потому что он выдаст исключение, если установка не удалась или пакет не может быть загружен по какой-либо другой причине. Вы делаете это более надежным и многократно используемым:Недостатком этого метода является то, что вы должны передавать имя пакета в кавычках, что вы не делаете на самом деле
require
.источник
character.only = TRUE
inrequire
, но тогда, я думаю, нет ничего, что отличало бы ваш ответ от моего."ggplot2" - это пакет. Он проверяет, установлен ли пакет, если он не установлен, то устанавливает его. Затем он загружает пакет независимо от того, какую ветку он принял.
источник
Это решение будет использовать символьный вектор имен пакетов и попытаться загрузить их или установить их, если загрузка не удалась. Это зависит от поведения возврата,
require
чтобы сделать это, потому что ...Поэтому мы можем просто увидеть, смогли ли мы загрузить требуемый пакет, а если нет, установить его с зависимостями. Итак, учитывая символьный вектор пакетов, которые вы хотите загрузить ...
источник
require
снова после установки?if
оператор был оценен, он должен сначала оценитьrequire
, побочным эффектом которого является загрузка пакета, если он доступен!install.packages
, поскольку это фактически не будет загружать этот пакет. Но (к @krlmlr) я подозреваю, что намерение состоит в том, что этот фрагмент кода будет вызываться только один раз; Вы не будете писать это каждый раз, когда вам потребуется пакет. Вместо этого вы запускаете его один раз заранее, а затем звоните,require
как обычно, по мере необходимости.require
вызовlibrary
так, чтобы он шумно завершился неудачей, если по какой-то причине он все еще не может присоединить пакет?Многие из приведенных выше ответов (и дубликатов этого вопроса) полагаются на то,
installed.packages
что это дурной тон. Из документации:Таким образом, лучший подход - попытаться загрузить пакет с помощью
require
и и установить, если загрузка не удалась (require
вернется,FALSE
если он не найден). Я предпочитаю эту реализацию:который можно использовать так:
Таким образом, он загружает все пакеты, затем возвращается и устанавливает все отсутствующие пакеты (что, если хотите, является удобным местом для вставки подсказки с вопросом, хочет ли пользователь установить пакеты). Вместо того, чтобы вызывать
install.packages
отдельно для каждого пакета, он пропускает весь вектор неустановленных пакетов только один раз.Вот та же самая функция, но с диалоговым окном, которое спрашивает, хочет ли пользователь установить отсутствующие пакеты
источник
Хотя ответ Шейн действительно хорош, для одного моего проекта мне нужно удалить Ouput сообщение, предупреждение и установку пакетов автоматически . Мне наконец удалось получить этот скрипт:
Использование:
источник
источник
Это цель пакета rbundler : предоставить способ управления пакетами, установленными для конкретного проекта. Прямо сейчас пакет работает с функциональностью devtools для установки пакетов в каталог вашего проекта. Функциональность похожа на пакет Ruby .
Если ваш проект представляет собой пакет (рекомендуется), тогда все, что вам нужно сделать, это загрузить rbundler и связать пакеты.
bundle
Функция будет выглядеть в вашем пакетеDESCRIPTION
файл , чтобы определить , какие пакеты для объединения.Теперь пакеты будут установлены в каталог .Rbundle.
Если ваш проект не является пакетом, то вы можете подделать его, создав
DESCRIPTION
файл в корневом каталоге вашего проекта с полем Depends, в котором перечислены пакеты, которые вы хотите установить (с дополнительной информацией о версии):Вот репозиторий Github для проекта, если вы заинтересованы в участии: rbundler .
источник
Конечно.
Вам нужно сравнить «установленные пакеты» с «желаемыми пакетами». Это очень близко к тому, что я делаю с CRANberries, так как мне нужно сравнить «сохраненные известные пакеты» с «известными на данный момент пакетами», чтобы определить новые и / или обновленные пакеты.
Так что-то вроде
чтобы получить все известные пакеты, выполните симуляцию вызова установленных в данный момент пакетов и сравните их с заданным набором целевых пакетов.
источник
Используйте
packrat
так, чтобы разделяемые библиотеки были точно такими же и не меняли окружение других.С точки зрения элегантности и лучшей практики, я думаю, что вы в корне ошибаетесь. Пакет
packrat
был разработан для этих проблем. Он разработан RStudio Хэдли Уикхем. Вместо этого им приходится устанавливать зависимости и, возможно, портить чью-то систему окружения,packrat
использовать свой собственный каталог и устанавливать там все зависимости для ваших программ и не затрагивать чью-то среду.https://rstudio.github.io/packrat/
источник
Следующая простая функция работает как брелок:
(Не мой, нашел это в Интернете некоторое время назад и использовал его с тех пор. Не уверен в первоначальном источнике)
источник
Я использую следующую функцию, чтобы установить пакет, если
require("<package>")
выход с ошибкой пакета не найден. Он запросит оба хранилища - CRAN и Bioconductor на предмет отсутствия пакета.Адаптировано из оригинальной работы Джошуа Уайли, http://r.789695.n4.nabble.com/Install-package-automatics-if-not-there-td2267532.html
Пример:
PS:
update.packages(ask = FALSE)
&biocLite(character(), ask=FALSE)
обновит все установленные пакеты в системе. Это может занять много времени и рассматривать его как полное обновление R, которое не может быть гарантировано все время!источник
loadpack()
на raw.githubusercontent.com/holgerbrandl/datautils/master/R/…Вы можете просто использовать
setdiff
функцию, чтобы получить пакеты, которые не установлены, а затем установить их. В приведенном ниже примере мы проверяем , еслиggplot2
иRcpp
пакеты установлены перед их установкой.В одну строку вышеприведенное можно записать так:
источник
installed.packages()[,'Package']
вместоrownames(installed.packages())
.Я реализовал функцию для установки и загрузки необходимых пакетов R в автоматическом режиме. Надежда может помочь. Вот код:
источник
Предстоящая версия RStudio (1.2), уже доступная в качестве предварительного просмотра, будет включать функцию обнаружения пропущенных пакетов
library()
иrequire()
вызовов и подсказки пользователю для их установки:Похоже, это особенно хорошо отвечает первоначальной проблеме ОП:
источник
Относительно вашей главной цели «установить библиотеки, которых у них еще нет.» И независимо от использования «instllaed.packages ()». Следующая функция маскирует исходную функцию require. Он пытается загрузить и проверить указанный пакет «x», если он не установлен, установить его напрямую, включая зависимости; и наконец загрузите это обычно. вы переименовываете имя функции из 'require' в 'library', чтобы сохранить целостность. Единственное ограничение - имена пакетов должны быть в кавычках.
Таким образом, вы можете загрузить и установить пакет старым способом R. require ("ggplot2") require ("Rcpp")
источник
delete
ссылку над этими комментариями. Если вы этого не сделаете и хотите удалить, используйтеflag
ссылку, выберите «другое» и объясните модератору, что вы хотите удалить ответ.Довольно простой.
источник
Думаю, я внесу тот, который я использую:
источник
источник
Используя семейный подход и анонимную функцию, вы можете:
||
ленивую оценку).Напечатайте окончательную загрузку каждого пакета (
TRUE
/FALSE
).источник
Я использую следующее, которое проверит, установлен ли пакет и обновлены ли зависимости, затем загружает пакет.
источник
Вот мой код для этого:
источник
источник
Это работает с именами пакетов без кавычек и довольно элегантно (см. Ответ GeoObserver)
источник
В моем случае я хотел один лайнер, который мог бы запускаться из командной строки (на самом деле через Makefile). Вот пример установки «VGAM» и «Перо», если они еще не установлены:
Изнутри R это будет просто:
Здесь нет ничего кроме предыдущих решений, кроме того, что:
repos
параметр (чтобы избежать всплывающих окон, спрашивающих о том, какое зеркало использовать)Также обратите внимание на важное
character.only=TRUE
(без негоrequire
будет пытаться загрузить пакетp
).источник
источник
Позвольте мне поделиться немного безумия:
источник