我查看了update.packages(..., checkBuilt = TRUE)
的帮助,我不清楚为什么不希望TRUE
作为默认值。默认值为FALSE
。
这个问题有两个部分。 (1)有人可以明确解释FALSE
或TRUE
使用此论点和理由吗?
据我了解,如果有人更新R,那么这可能有不同的结果 - 如果包尚未更新,那么FALSE
将不会导致使用更新的包修改本地库,而{ {1}}会导致更新(所有?)包更新。默认选项(TRUE
)可以提供速度优势 - 将更新更少的包。稳定性是不确定的 - 新版本的R可能在新软件包中运行得更好,或者可能没有(例如,如果新软件包中存在回归/错误),并且它可能适用于或不适用于早期版本的软件包(不保证向后兼容性)。其他利弊对我来说并不明显。 (我可能在这里错了 - 这就是为什么我要求澄清作为第1部分。)
(2)但是,如果没有更改R的安装版本,那么这些结果是否应该相同?请参阅this post以获取仅仅调用FALSE
创建问题的示例,即使R的版本没有更改。
答案 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)
,你清楚地说,升级所有包,如果:
不会修改在相同版本的R中编译且在CRAN上没有升级的软件包。 CheckBuilt实际上意味着“如果在旧版本中编译则重新安装”,而不是“重新安装所有软件包”。
为什么默认为FALSE?我猜它给CRAN带来了巨大的负担,而且大部分时间都没有必要:我在一次小的升级之后从未见过问题(即R 2.13.0到2.13.1)。我肯定会建议在2.13.1到2.14.0等任何重大升级之后再进行此操作。
我相信你在(2)中提到的具体案例是一个例外。它涉及升级使用apt而不是R安装的软件包。你无法真正得出这样一个段错误的结论。无论如何,如果CheckBuilt = TRUE
升级它,则意味着它是在以前版本的R中构建的。