更新R中的包 - checkBuilt的影响= TRUE或FALSE

时间:2012-01-11 23:42:12

标签: r installation

我查看了update.packages(..., checkBuilt = TRUE)的帮助,我不清楚为什么不希望TRUE作为默认值。默认值为FALSE

这个问题有两个部分。 (1)有人可以明确解释FALSETRUE使用此论点和理由吗?

据我了解,如果有人更新R,那么这可能有不同的结果 - 如果包尚未更新,那么FALSE将不会导致使用更新的包修改本地库,而{ {1}}会导致更新(所有?)包更新。默认选项(TRUE)可以提供速度优势 - 将更新更少的包。稳定性是不确定的 - 新版本的R可能在新软件包中运行得更好,或者可能没有(例如,如果新软件包中存在回归/错误),并且它可能适用于或不适用于早期版本的软件包(不保证向后兼容性)。其他利弊对我来说并不明显。 (我可能在这里错了 - 这就是为什么我要求澄清作为第1部分。)

(2)但是,如果没有更改R的安装版本,那么这些结果是否应该相同?请参阅this post以获取仅仅调用FALSE创建问题的示例,即使R的版本没有更改。

1 个答案:

答案 0 :(得分:7)

CheckBuilt = TRUE对主要升级特别有用,例如2.14.0,这会对名称空间带来重大变化。没有使用以前版本的R构建的命名空间的包必须重新编译,否则它们根本不会加载。因此,如果您在R 2.13中安装了这样的软件包(例如ICE),并且您更新到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安装的软件包。你无法真正得出这样一个段错误的结论。无论如何,如果CheckBuilt = TRUE升级它,则意味着它是在以前版本的R中构建的。