Подтвердить что ты не робот

Должны ли R-пакеты выгружать динамические библиотеки при их разгрузке?

От 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 отлично работает.

4b9b3361

Ответ 1

Нормальная разгрузка DLL была бы хорошей идеей. Ресурсы, которыми он владеет, будут полностью освобождены, а перезагрузка не будет проблемой.

В R есть усложнение среды R, потому что даже если DLL выгружается, в R-среде могут остаться некоторые знания. В этом случае результатом может быть то, что повторно загруженная библиотека DLL не использует одно и то же предполагаемое состояние в качестве R-переменных, которые предназначены для понимания состояния DLL, и, следовательно, возникают ошибки.

Я думаю, что можно было бы безопасно выгрузить пакет R (DLL и R-код), но вам было бы легче оставить загруженные библиотеки DLL, если вы не найдете особого использования ресурсов.