Выгрузить скомпилированный код пакета R, чтобы избежать утечек памяти?
У меня есть большая программа на C (я не могу поделиться воспроизводимым кодом), которую я хотел бы включить в пакет R, чтобы пользователям не приходилось самим компилировать ее и она была автономной. Таким образом, часть скомпилированного кода используется только одной функцией пакета, что-то вроде
wrapperfoo <- function(config_file_path, output_file_path) {
#stuff
#...
.C("myprogram", config_file_path, output_file_path)
#...
}
Проблема с кодом C в том, что он использует сканер Flex/Bison, который не сбрасывается. Код не мой, и я хочу избежать переписывания сканера (и простые исправления в C не сработали, включая некоторые темы о SO, например: yylex_destroy()
Я новичок в C, поэтому отладка сложна).
Это нормально, если в R I выгрузить пакет после вызова моей программы и загрузить его снова. (И он отлично работает, если скомпилирован и запускается за пределами R.)
Так что это работает:
library(mypackage)
wrapperfunction()
unloadNamespace("mypackage") #invokes library.dynam.unload()
library(mypackage)
wrapperfunction()
Но это не будет
library(mypackage)
wrapperfunction()
wrapperfunction() #parser crashes and with it R
Это нормально, чтобы загрузить и выгрузить DLL в моем wrapperfunction()
? Сдается мне, что это против хорошей практики написания пакетов R, и я даже не знаю, возможно ли это? Или есть другая функция, которая будет очищать после.C? Будет ли использование.Call помочь? gc()
не помогает