使用已编译的扩展重新加载R包

时间:2011-03-21 17:38:50

标签: r package

是否可以在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

3 个答案:

答案 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')