Обновление пакетов в R - влияние checkBuilt = TRUE или FALSE - PullRequest
8 голосов
/ 12 января 2012

Я посмотрел на справку для update.packages(..., checkBuilt = TRUE), и мне неясно, почему не стоит иметь TRUE в качестве значения по умолчанию. По умолчанию FALSE.

Этот вопрос состоит из двух частей. (1) Может ли кто-то дать четкое объяснение использования этого аргумента и обоснования для FALSE или TRUE?

Насколько я понимаю, если кто-то обновляет R, то это может привести к другим результатам - если пакеты не были обновлены, то FALSE не приведет к изменению локальных библиотек с помощью обновленных пакетов, тогда как TRUE приведет к обновлению большего количества (всех?) пакетов. Опция по умолчанию (FALSE) может дать выигрыш в скорости - будет обновлено меньше пакетов. Стабильность неясна - новая версия R может лучше работать с новым пакетом, а может и нет (например, если в новом пакете имеются регрессии / ошибки), и она может работать или не работать с более ранней версией пакета ( обратная совместимость не гарантируется). Другие плюсы и минусы не очевидны для меня. (И я могу быть совершенно ошибочным здесь - вот почему я прошу разъяснения в части 1.)

(2) Однако, если кто-то не изменил установленную версию R, разве они не должны иметь такой же результат? См. этот пост для примера, где кажется, что простой вызов update.packages() создал проблемы, хотя версия R не изменилась.

1 Ответ

7 голосов
/ 13 января 2012

CheckBuilt = TRUE особенно полезен для крупных обновлений, таких как 2.14.0, которые принесли большие изменения в пространствах имен.Пакеты без пространства имен, созданного с помощью предыдущей версии R, необходимо перекомпилировать, иначе они вообще не будут загружаться.Поэтому, если у вас есть такой пакет (например, ICE ), установленный в R 2.13, и вы обновляетесь до R 2.14, вы больше не сможете его загрузить:

> library(ICE)
Error in library(ICE) : 
  package ‘ICE’ does not have a NAMESPACE and should be re-installed

Поскольку более новой версии с пространством имен не существует, update.packages () не обновит ее без CheckBuilt = TRUE.Поэтому, сказав update.packages(checkBuilt = TRUE), вы четко скажете, обновите все пакеты, если либо:

  • На CRAN установлена ​​более поздняя версия
  • ИЛИ переустановите пакет, если онбыл построен с более старой версией R.

Это не будет изменять пакеты, которые были скомпилированы в той же версии R и без обновления, доступного в CRAN.CheckBuilt действительно означает «переустановить, если скомпилировано в более старой версии», а не «переустановить все пакеты».

Почему по умолчанию FALSE?Я предполагаю, что это создает огромную нагрузку на CRAN, и большую часть времени в этом нет необходимости: я никогда не видел проблемы после незначительного обновления (то есть R 2.13.0 до 2.13.1).Я определенно рекомендую делать это после любого серьезного обновления, такого как 2.13.1 до 2.14.0.

Я считаю, что конкретный случай, который вы упомянули в (2), является исключением.Он включает в себя обновление пакетов, установленных с помощью apt, а не из R. Вы не можете сделать вывод о такой ошибке в segfault.И вообще, если CheckBuilt = TRUE обновил его, это означает, что он был построен в предыдущей версии R.

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