【问题标题】:Updating packages in R - impact of checkBuilt = TRUE or FALSE在 R 中更新包 - checkBuilt = TRUE 或 FALSE 的影响
【发布时间】:2012-01-11 23:42:11
【问题描述】:

我查看了update.packages(..., checkBuilt = TRUE) 的帮助,但我不清楚为什么不想将TRUE 作为默认设置。默认为FALSE

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

据我了解,如果更新 R,那么这可能会产生不同的结果 - 如果软件包尚未更新,那么 FALSE 不会导致本地库被更新的软件包修改,而 TRUE将导致更多(全部?)包被更新。默认选项 (FALSE) 可能会带来速度优势 - 将更新更少的包。稳定性是不确定的——新版本的 R 可能会更好地与新包一起使用,也可能不会(例如,如果新包中存在回归/错误),它可能会或可能不会与早期版本的包一起使用(不保证向后兼容性)。其他优点和缺点对我来说并不明显。 (我在这里可能完全误会了 - 这就是为什么我要求在第 1 部分进行澄清。)

(2) 但是,如果没有更改已安装的 R 版本,那么这些结果不应该相同吗?请参阅 this post 的示例,其中似乎只是调用 update.packages() 会产生问题,即使 R 的版本没有改变。

【问题讨论】:

  • 不是答案,但这是我的猜测:checkBuilt 参数是在 r31400 (2004) 中引入的,另请参见 cran.r-project.org/bin/windows/base/old/2.1.0/NEWS.rw2010 。当时,使用默认 FALSE 引入参数意味着默认行为没有改变,这对我来说似乎是最明智的。据我所知,默认值之后就再也没有改变过。另外,我猜 R 核心可能不愿意这样做,因为可能需要一个类似于宣布不推荐使用的功能的长公告(并且会引起毫无戒心的用户的数千个问题......)
  • @cbeleites 感谢您的回复!如您所知-您是我链接到的帖子的作者,所以我希望您能提供更多背景信息。 :) 我理解这种不愿改变的态度——这似乎是对原始默认值及其持久性的合理解释。所以,目前,我想知道用户是否应该覆盖默认值。
  • Sou,你可以很容易地覆盖默认值。虽然我认为update.packages 的努力不值得(我更经常地这样做是为了将print 包裹在基于网格的绘图周围——尽管Sweave 也不再需要这样做了(RweaveLatex ) 选项print = TRUE)。然后更新包比降级要容易得多。

标签: r installation


【解决方案1】:

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

由于没有带有命名空间的更新版本,如果没有CheckBuilt = TRUE,update.packages() 将不会升级它。所以说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 版本中构建的。

【讨论】:

  • 关于段错误的好点 - 这可能是一个红鲱鱼。
  • 我已经安装了 R 3.2.3 并且几乎我所有的包都是使用 R 3.2.1 或 3.2.2 安装和编译的(根据 installed.packages)。但是,如果我执行 update.packages( lib.loc=.libPaths(), checkBuilt=TRUE, ask = FALSE) 几乎没有重新安装.. 为什么?
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多