От Hadley C best practices:
Как и в случае с С++, всякий раз, когда вы используете код C в своем пакете, вы должны выгрузить DLL, когда пакет будет выгружен:
.onUnload <- function (libpath) {
library.dynam.unload("mypackage", libpath)
}
Написание R-расширений, с другой стороны, даже не упоминает об этом. Я вижу, как было бы вежливо выгружать DLL, но, похоже, для меня возникают некоторые странные проблемы с загруженными/разгруженными/перезагруженными пакетами (см. Пример ниже). Кроме того, есть некоторые упоминания, которые предполагают, что разгрузка не требуется. От ?library.dynam
:
Обратите внимание, что независимо от того, можно ли выгрузить DLL, а затем перезагрузить исправленную версию того же файла, зависит от ОС: см. раздел "Значение справки для dyn.unload.
хотя это не должно влиять на объекты, которые не изменены. Тогда есть этот комментарий от Брайан Рипли в R-devel:
Сказав все это, мой опыт в том, что разгрузка 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
. alike
не использовал для выгрузки своих динамических библиотек, и вышеуказанных ошибок не произошло. После того, как я выполнил разгрузку, начались ошибки. Обратите внимание, что data.table 1.9.2
не выгружает свои DLL, хотя другие пакеты, которые также не выгружают DLL, не вызвали таких проблем. data.table 1.9.4
отлично работает.