首先,我知道我的痛苦完全是自我造成的。
在将某些软件包移至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-鉴于我可以使用痛苦缓慢且昂贵的互联网。有谁知道摆脱困境的方法吗?
答案 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以返回我的用户库,在那里我可以使用BH
从remove.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}}参数来解决此问题。