必须R软件包卸载时卸载dynamic库?

从哈德利的C最佳实践

与C ++一样,只要在程序包中使用C代码,卸载程序包时应该卸载DLL:

.onUnload <- function (libpath) { library.dynam.unload("mypackage", libpath) } 

写R扩展另一方面甚至没有提到这一点。 我可以看到卸载dll会有礼貌,但是这样做对于装载/卸载/重装的软件包似乎会造成一些奇怪的问题(请参阅下面的示例)。 此外,还有一些提到,build议可能卸货不是必需的。 从?library.dynam

请注意,是否可以卸载DLL,然后重新加载相同文件的修订版本取决于操作系统:请参阅dyn.unload帮助的“值”部分。

尽pipe这不应该影响没有修改的对象。 接下来是R-devel的Brian Ripley的评论:

说了这么多,我的经验是,卸载DLL往往没有帮助,如果你需要再次加载(这就是为什么例如tcltk不卸载其DLL)。

那么离开C库加载是否可以接受? 我宁愿不去挖掘为什么像下面这样的事情发生(没有发生之前,我开始卸载图书馆)。

 R version 3.1.1 (2014-07-10) Platform: x86_64-apple-darwin13.1.0 (64-bit) > library(alike) # install_github("brodieg/alike", ref="fdaa578e"), if you're curious > library(data.table) data.table 1.9.2 For help type: help("data.table") > detach("package:data.table", unload=T) > detach("package:alike", unload=T) > library(alike) > library(data.table) Error : .onLoad failed in loadNamespace() for 'data.table', details: call: address(x) error: object 'Caddress' not found In addition: Warning messages: 1: In FUN(X[[9L]], ...) : failed to assign RegisteredNativeSymbol for alike to alike since alike is already defined in the 'data.table' namespace 2: In FUN(X[[9L]], ...) : failed to assign RegisteredNativeSymbol for typeof to typeof since typeof is already defined in the 'data.table' namespace 3: In FUN(X[[9L]], ...) : failed to assign RegisteredNativeSymbol for type_alike to type_alike since type_alike is already defined in the 'data.table' namespace Error: package or namespace load failed for 'data.table' 

警告都与alikefunction有关。 alike没有使用卸载它的dynamic库,并且上述错误没有发生。 我执行卸载后,错误开始发生。 请注意, data.table 1.9.2并没有卸载它的DLL,虽然其他包也不卸载DLL的包不会导致这个问题。 data.table 1.9.4正常工作。

通常卸载DLL将是一个好主意。 它所拥有的资源将被完全释放,重新加载将不成问题。

在R中有R环境的复杂性,因为即使卸载了一个DLL,也可能在R运行时留下一些知识。 在这种情况下,结果可能是重新加载的DLL库不能与想要了解DLL状态的Rvariables共享相同的推断状态,从而出现错误。

我认为可以安全地卸载一个R包(DLL和R代码),但是除非您发现特别繁重的资源使用情况,否则将更容易让您加载DLL。