必须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'
警告都与alike
function有关。 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。