是否可以在R会话中重新加载具有本机扩展名的R包?
我正在开发Rliblinear,它使用了几个C
函数。
如果我对包中的R代码进行了更改,我可以重新安装并重新加载;
$ R CMD build Rliblinear
$ R CMD INSTALL Rliblinear
然后在R
shell中;
> detach("package:Rliblinear", unload=TRUE)
> library(Rliblinear)
但是,除非我重新启动C
解释器,否则R
函数不会受到影响。
有没有办法可以强制解释器重新加载共享对象Rliblinear.so
?
答案 0 :(得分:17)
这将列出您加载的动态链接库:
library.dynam()
这将在Rliblinear包中卸载Rliblinear.*
。
library(Rliblinear)
# ... run package ...
detach("package:Rliblinear", unload = TRUE)
library.dynam.unload("Rliblinear", system.file(package = "Rliblinear"))
您可以再次发出library.dynam()
,以检查其不再列出。
答案 1 :(得分:5)
我倾向于使用littler在命令行上进行测试,以确保我获得了新的R会话。您也可以使用Rscript
执行此操作。
所以我的工作流程将是
$ R CMD INSTALL Rliblinear/ ## alternatively, install from tarball
$ r -lRliblinear -e'someExpressionFromThePackage()'
你也可以用&&
包裹在一行中和/或在干净的步骤之前。
答案 2 :(得分:4)
这是G.Grothendieck先生答案的扩展,如果嵌入“yourpackage”,可以从R控制台一次重新编译它:
reload <- function( path ){
detach("package:yourpackage", unload = TRUE)
library.dynam.unload("yourpackage", system.file(package = "yourpackage"))
path <- paste( "--vanilla CMD INSTALL ", path )
system2( 'R', path )
require("yourpackage")
}
然后从R:
yourpackage :: reload('/ home / me / yourpackage')