Используйте динамически загруженные библиотеки DLL из функции пакета в глобальной среде в R - PullRequest
0 голосов
/ 23 октября 2019

У меня есть пакет с именем "aaa", который имеет такую ​​функцию:

execute_query = function(arg1,symbol_list){eval(.Call("run_query",arg1),
                                           envir = .GlobalEnv)}

Здесь часть run_query предоставляется библиотекой DLL, которая была загружена в глобальную среду в функции .onLoad функции:

eval(dyn.load(file.path(dll_path,"liblib.dll")),envir = .GlobalEnv)

Это успешно, и я получаю этот dll в списке, когда я использую функцию getLoadedDLLs().

Если я копирую функцию за пределы пакета, все этоработает как задумано. Однако при попытке выполнить execute_query из пакета я получаю сообщение об ошибке:

 Error in .Call("run_query", arg1) : 
  "run_query" not resolved from current namespace (aaa) 

Я предполагаю, что eval не работает, когда речь идет о ссылках на связанные библиотеки. Как запустить функцию dll из функции пакета в глобальном пространстве имен?

Я уже пытался зарегистрировать пакет, используя library.dynam, но учитывая, что все dll являются частью большого внешнего приложения, и я не могуположить его в пакет напрямую, это не будет работать. Я в порядке с жестким кодированием пути DLL к пакету, поэтому я бы предпочел грубые решения, такие как выполнение всего в глобальном пространстве имен, если это работает для решения проблемы.

1 Ответ

0 голосов
/ 26 октября 2019

Ответ здесь состоял в том, чтобы назначить функцию, которую вы хотите выполнить, в глобальном пространстве имен. Таким образом, мы делаем:

execute_query = function(arg1,symbol_list){eval(.Call("run_query",arg1),
                                           envir = .GlobalEnv)}
assign("execute_query", execute_query, envir = .GlobalEnv)

Затем этот execute_query может быть вызван из функции пакета или любой другой функции.

Это не блестяще и никогда не полетит на CRAN, но работаетиспользовать внешние библиотеки в пакете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...