Обновить пакет R с скомпилированными расширениями
Можно ли перезагрузить пакет R с помощью собственных расширений в сеансе R?
Я разрабатываю Rliblinear, который использует несколько функций C
.
Если я внес изменения в R-код в пакете, я могу просто переустановить и перезагрузить;
$ R CMD build Rliblinear
$ R CMD INSTALL Rliblinear
а затем в оболочке R
;
> detach("package:Rliblinear", unload=TRUE)
> library(Rliblinear)
Однако функции C
не затрагиваются, если я не перезапущу интерпретатор R
.
Есть ли способ заставить интерпретатора перезагрузить общий объект, Rliblinear.so
?
Ответы
Ответ 1
Здесь перечислены ваши загруженные библиотеки динамических ссылок:
library.dynam()
и это выгрузит Rliblinear.*
в пакет Rliblinear.
library(Rliblinear)
# ... run package ...
detach("package:Rliblinear", unload = TRUE)
library.dynam.unload("Rliblinear", system.file(package = "Rliblinear"))
Вы снова можете отправить library.dynam()
, чтобы проверить, что его больше не указана.
Ответ 2
Я стараюсь выполнять свои тесты в командной строке с littler, чтобы убедиться, что получаю свежий сеанс R. Вы можете сделать это и с помощью Rscript
.
Итак, мой рабочий поток будет
$ R CMD INSTALL Rliblinear/ ## alternatively, install from tarball
$ r -lRliblinear -e'someExpressionFromThePackage()'
который вы также можете обернуть в одну строку с помощью &&
и/или предварять чистым шагом.
Ответ 3
вот расширение для г-на Г. Гротендика ответ, если он встроен в "ваш пакет", можно перекомпилировать его одним выстрелом из консоли 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')