取消安装软件包后,无法快照Packrat库

时间:2018-07-22 13:23:02

标签: r packrat

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

在将某些软件包移至external.packages选项时,我首先使用remove.packages()而不是按照建议 here packrat::clean()从packrat卸载它们包作者。

项目中的代码工作正常(因为在会话中正确加载了外部程序包),但是从那时起就无法更新库了。如果尝试执行快照,则会出现以下错误

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-鉴于我可以使用痛苦缓慢且昂贵的互联网。有谁知道摆脱困境的方法吗?

1 个答案:

答案 0 :(得分:1)

似乎是同一问题here。您可能拥有依赖于knitr和/或rmarkdown的软件包。使用外部程序包似乎无法解决此问题。

  

我尝试重新安装软件包,然后Packrat at绕着我……

您是否在有packrat packrat::on()的同一会话中执行此操作?在这种情况下,您的.libPaths()已更改,而external packages are

  

...进入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"

更新

如Github问题I link to at the start所示,可以通过infer.dependencies的{​​{1}}参数来解决此问题。