r update.packages () не обновляет пакеты, импортированные другими пакетами - PullRequest
0 голосов
/ 24 августа 2018

Я недавно обновился до R 3.5.1 с 3.4.3. Я обновил свои пакеты следующим образом:

(a) скопировал пакеты из моей старой библиотеки в мою новую библиотеку (стараясь не перезаписывать базовые пакеты)

(б) бежал update.packages(ask = FALSE, dependencies = TRUE)

Я обнаружил, что ряд пакетов не устанавливался там, где они были указаны как импорт других пакетов, поскольку они «были созданы с версией r с различными внутренними компонентами и требуют переустановки».

Несколько разочаровывающе, это сообщение, казалось, перебирало некоторый скрытый список связанных или связанных пакетов, но только сообщало мне, что была проблема для одного пакета одновременно; Т.е. я установил бы пакет с неверной версией, а затем попытался бы переустановить пакет, заблокированный для установки, только чтобы повторить ошибку для другого пакета. Мне приходилось проходить это несколько раз, пока не осталось больше пакетов, связанных с неправильной версией, и, наконец, пакет, который мне нужно было использовать, можно было установить / обновить.

Также - я отмечаю, что некоторые пакеты были установлены из исходного кода (это были часто, но не исключительно те, которые вызывали ошибку «разные внутренние компоненты» для связанных пакетов выше). У меня действительно установлен Rtools, так что для меня это не проблема, а просто наблюдение, так как update.packages делал это каждый раз, когда сталкивался с исходной версией, которая была более актуальной, чем бинарный файл Windows (у меня Windows 10 PC).

Из всего этого я заключаю, что update.packages пропустил много пакетов и фактически не обновил их по какой-то причине? Я все еще нахожу пакеты, которые не обновлялись.

Например:

> DescTools::Gmean(x)
Error: package ‘expm’ was installed by an R version with different internals; it needs to be reinstalled for use with this R version

Просмотр записи CRAN для DescTools здесь указывает, что пакет expm не является зависимостью, но импортируется.

Однако ?import.packages говорит об аргументе dependencies:

зависимости:

логическое указание, устанавливать ли также деинсталлированное пакеты, от которых зависят эти пакеты / ссылка на / импорт / предложить (и так на рекурсивно). Не используется, если repos = NULL. Также может быть персонажем вектор, подмножество c («Зависит», «Импорт», «LinkingTo», «Предлагает», "Усиливает").

Поддерживается только если lib имеет длину один (или отсутствует), поэтому Однозначно, где устанавливать зависимые пакеты. Если это не случай игнорируется с предупреждением.

Значение по умолчанию NA означает c («Зависит», «Импорт», «LinkingTo»). ПРАВДА означает использовать c («Зависит», «Импорт», «LinkingTo», «Предлагает») для pkgs и c («Зависит», «Импорт», «LinkingTo») для добавленных зависимостей: это устанавливает все пакеты, необходимые для запуска pkgs, их примеры, тесты и виньетки (если автор пакета указал их правильно).

Во всех этих случаях «LinkingTo» опускается для бинарных пакетов.

Это означает, что update.packages(...dependencies = TRUE) должен также обновить и / или установить все пакеты, импортированные другими пакетами.

Что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

У меня была такая же проблема после обновления до R 3.6.0. В моем случае небольшая модификация решения Карлоса Сантиллана решила проблему:

for (i in 2:length(.libPaths())) {
  lib <- .libPaths()[i]
  install.packages( 
    lib  = .libPaths()[1] ,
    pkgs = as.data.frame(installed.packages(lib), stringsAsFactors=FALSE)$Package,
    type = 'source'
  )
}

В моей настройке .libPaths () повторяет следующее:

> .libPaths()
[1] "/home/wassermann/R/x86_64-pc-linux-gnu-library/3.6" "/usr/local/lib/R/site-library"                
[3] "/usr/lib/R/site-library"                            "/usr/lib/R/library"    

Первый каталог в .libPaths () доступен для записи на уровне пользователя, остальные три доступны только для чтения. Код перебирает все пакеты в папках, доступных только для чтения, и устанавливает их более новые версии в каталог, доступный для записи пользователем. Он не оптимален в том смысле, что он может перебирать некоторые пакеты более одного раза, но вам нужно запускать его только один раз, и после этого все пакеты будут установлены без повторной ошибки «разные внутренние компоненты».

0 голосов
/ 24 августа 2018

Это выглядит как зависимости = TRUE не является параметром для update.packages, вместо этого он передает этот параметр в install.packages

Документация

https://www.rdocumentation.org/packages/utils/versions/3.5.1/topics/update.packages

говорит

Будьте осторожны при использовании зависимостей (переданных в install.packages) с update.packages, так как неясно, где должны быть установлены новые зависимости.Текущая реализация разрешит это, только если все обновляемые пакеты находятся в одной библиотеке, когда эта библиотека будет использоваться.

Следующий скрипт переустановит все пакеты

lib <- .libPaths()[1]
install.packages( 
    lib  = lib ,
    pkgs = as.data.frame(installed.packages(lib), stringsAsFactors=FALSE)$Package,
    type = 'source'
)

Следующее будет обновлять, проверять, нужно ли обновлять все пакеты

lib <- .libPaths()[1]
update.packages( 
 oldPkgs = as.data.frame(installed.packages(lib), stringsAsFactors=FALSE)$Package,
  type = 'source',
  ask = FALSE
)

(выше было изменено с https://www.r -bloggers.com / update-all-user -установлено-r-пакетов-снова/ )

...