在R中的全局环境中使用来自软件包功能的动态加载的dll

问题描述 投票:0回答:1

我有一个名为“ aaa”的软件包,其功能类似于:

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

这里run_query部分由已在函数.onLoad函数中加载到全局环境中的dll提供。

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

这是成功的,当我使用getLoadedDLLs()函数时,我会列出该dll。

如果我将功能复制粘贴到包的外部,则所有功能均按预期工作。但是,在尝试从包中执行execute_query时,我得到了错误消息:

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

我猜想eval在引用链接的dll时不起作用。如何在全局名称空间的包函数中运行dll函数?

我已经尝试使用library.dynam注册该程序包,但是鉴于dll都是大型外部应用程序的一部分,因此我无法将其直接放入程序包中,因此将无法使用。我可以硬编码包的dll路径,所以我可以选择一个粗糙的解决方案,例如在全局名称空间中执行所有操作,以解决问题。

我有一个名为“ aaa”的程序包,其功能类似于:execute_query = function(arg1,symbol_list){eval(.Call(“ run_query”,arg1),envir = .GlobalEnv)}这里...

r dll namespaces
1个回答
0
投票

这里的答案是将要执行的功能分配给全局名称空间。因此,我们这样做:

execute_query = function(arg1,symbol_list){eval(.Call("run_query",arg1),
                                           envir = .GlobalEnv)}
assign("execute_query", execute_query, envir = .GlobalEnv)
© www.soinside.com 2019 - 2024. All rights reserved.