1

首先,我知道我的痛苦完全是自己造成的。

在将某些软件包移动到该选项时,我首先使用而不是软件包作者在此处推荐的方式external.packages从 packrat 中卸载了它们。remove.packages()packrat::clean()

项目中的代码工作得很好(因为在会话中正确加载了外部包),但从那时起就无法更新库。如果我尝试执行快照,我会收到以下错误

Error: Unable to retrieve package records for the following packages:
- "knitr", "rmarkdown"

我尝试重新安装软件包,但 Packrat 对我大喊大叫

Warning in install.packages :
  packages ‘knitr’, ‘rmarkdown’ are in use and will not be installed

因此,当我收到此消息时,我尝试调用正确的函数, clean(c('knitr', 'rmarkdown'), force = TRUE)但仍然没有出路

Error in find.package(pkgs, lib) : 
  there are no packages called ‘knitr’, ‘rmarkdown’

我试图检查包是否实际存在于 packrat 库中,它们确实存在!

> .libPaths()
[1] "C:/Users/Admn/Documents/.../cct/packrat/lib/x86_64-w64-mingw32/3.5.1"    
[2] "C:/Users/Admn/Documents/.../cct/packrat/lib-ext/x86_64-w64-mingw32/3.5.1"
[3] "C:/Users/Admn/Documents/.../cct/packrat/lib-R/x86_64-w64-mingw32/3.5.1"  

> c('knitr', 'rmarkdown') %in% .packages(all.available = TRUE)
[1] TRUE TRUE
> c('knitr', 'rmarkdown') %in% 
      list.dirs(.libPaths()[2], full.names = FALSE, recursive = FALSE)
[1] TRUE TRUE

我很想用 手动从库目录中拉出这两个文件夹unlink(),但我怀疑我最终可能会产生更多问题。

如果可以避免,我不想最终重新安装整个 Packrat 库——全部 500MB——因为我可以访问缓慢而昂贵的互联网。有谁知道摆脱这个烂摊子的出路吗?

4

1 回答 1

1

在这里似乎是同样的问题。您可能有一个依赖于knitr和/或rmarkdown. 在使用外部软件包的情况下,似乎没有解决此问题的方法。

我尝试重新安装软件包,但 Packrat 对我大喊大叫...

你是在你有 packrat 的同一个会话中做的packrat::on()吗?在这种情况下,您.libPaths()已更改并且外部包是

...进入packrat模式时从用户库加载

之前.libPaths()被改变了。例如,我在我拥有的项目中得到以下信息

packrat::get_opts("external.packages")
#R [1] "BH"
"BH" %in% .packages(all.available = TRUE)
#R [1] TRUE
"BH" %in% list.dirs(.libPaths()[1], # notice the one
                    full.names = FALSE, recursive = FALSE)
#R [1] FALSE
.libPaths()
#R [1] "/My/Path/To/My-project/packrat/lib/x86_64-w64-mingw32/3.5.1"    
#R [2] "/My/Path/To/My-project/packrat/lib-ext/x86_64-w64-mingw32/3.5.1"
#R [3] "/My/Path/To/My-project/packrat/lib-R/x86_64-w64-mingw32/3.5.1"  
packrat::off()
.libPaths()
#R [1] "/My/Path/To/R/win-library/3.5"
#R [2] "C:/Program Files/R/R-3.5.1/library"  
"BH" %in% list.dirs(.libPaths()[1], # notice the one
                    full.names = FALSE, recursive = FALSE)
#R [1] TRUE

我关闭 packrat 以返回我的用户库,我可以BHremove.packages那里卸载help("remove-packages")

lib一个字符向量,给出要从中删除包的库目录。如果缺少,则默认为.libPaths().

我不能这样做,packrat::clean因为参数的默认值lib.loc

packrat:::libDir(NULL)
#R [1] "/My/Path/To/My-project/packrat/lib/x86_64-w64-mingw32/3.5.1"

更新

这个问题可以通过infer.dependencies参数来解决,如我在开始时链接到packrat::snapshot的 Github 问题中所示。

于 2019-01-03T11:54:17.453 回答