我有一个名为“ 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)}这里...
这里的答案是将要执行的功能分配给全局名称空间。因此,我们这样做:
execute_query = function(arg1,symbol_list){eval(.Call("run_query",arg1),
envir = .GlobalEnv)}
assign("execute_query", execute_query, envir = .GlobalEnv)