这似乎可能是一个新手的错误,因为它可能是。我有一个我正在尝试安装的内置源包。这是一个本地文件,我只是想检查以确保它的工作原理。一切似乎都很顺利,没有错误......但也没有任何功能。
> dir.create("packageCheck")
> install.packages("Rpackages/saber_0.1.tar.gz",
lib = "packageCheck", repos = NULL)
# * installing *source* package ‘saber’ ...
# ** R
# ** inst
# ** preparing package for lazy loading
# ** help
# *** installing help indices
# ** building package indices
# ** testing if installed package can be loaded
# * DONE (saber)
> list.files("packageCheck")
# [1] "saber"
> list.files("packageCheck/saber")
# [1] "DESCRIPTION" "extdata" "help" "html"
# [5] "INDEX" "Meta" "NAMESPACE" "R"
> devtools::load_all("packageCheck/saber")
# Loading saber
> library("saber", lib.loc = "packageCheck/saber", logical.return = TRUE)
# [1] TRUE
> ls(2)
# character(0)
> ls("package:saber")
# character(0)
我在这里做错了什么?
注意:
> version[[1]]
# [1] "x86_64-pc-linux-gnu"
> getOption("pkgType")
# [1] "source"
答案 0 :(得分:1)
问题是devtools::load_all()
不适用于加载已安装的软件包。它旨在用于包的源代码树中。例如。如果您只是在程序包的源代码树中说load_all()
,那么它应该可以正常工作。
我猜想发生的是,load_all()
查找要在已安装的软件包中加载的.R
文件,但是已安装的软件包中没有.R
个文件,R函数已放入安装包时的数据库:
/tmp/saber (master)$ ls -l packageCheck/saber/R/
total 24
-rw-r--r-- 1 gaborcsardi wheel 1056 Jul 25 23:27 saber
-rw-r--r-- 1 gaborcsardi wheel 3317 Jul 25 23:27 saber.rdb
-rw-r--r-- 1 gaborcsardi wheel 246 Jul 25 23:27 saber.rdx
所以load_all()
找不到要加载的内容,但它创建了一个命名空间,名为saber
。然后,当您尝试使用library()
加载包时,该函数立即返回,因为它注意到saber
列表中存在search()
命名空间,因此它假定包是已经装好了。
解决方案要么
load_all()
然后使用reload()
,而无需实际安装它。 (您可能需要构建,我不确定。)这在大多数情况下都有效。或者只需使用library
加载已安装的软件包:
library("saber", lib.loc = "packageCheck", logical.return = TRUE)
这有点不太方便,因为你需要一直构建和安装,卸载/重新加载包可能会在R中失败。
只是不要在已安装的软件包上使用load_all()
。