从R Issue致电Julia

时间:2018-09-26 15:49:17

标签: r julia

我正在使用Julia 1.0.0和R 3.5.1,并且遇到一个问题,同时使用JuliaCallXRJulia从R / RStudio调用Julia。

当我尝试:

library(JuliaCall)
julia <- julia_setup(JULIA_HOME = "C:\\Program Files\\Julia-1.0.0\\bin")

找到Julia版本,但是弹出错误消息,提示“缺少libgcc_s_seh-1.dll”

当我尝试时:

library(XRJulia)
JULIA_BIN <- "C:\\Program Files\\Julia-1.0.0\\bin"
findJulia(test=TRUE)

测试返回false。

但是,当我使用RCall从Julia中调用R时,Julia可以找到并使用R(使用Atom / Juno IDE)。 Julia和R都位于C:\ Program Files路径中。

从R / RStuio呼叫Julia的正确方法是什么?

我向here寻找了解决方案,但无法使其正常工作。

更新-我尝试了此解决方案,以便R可以识别Julia文件的位置。当我重新启动会话并设置新的环境,然后尝试在我的R会话下面运行代码时,异常终止

Sys.setenv(PATH = paste(Sys.getenv("PATH"),"C:\\Program Files\\Julia-1.0.0\\bin",sep=";"))
library(JuliaCall)
julia <- julia_setup(JULIA_HOME = "C:\\Program Files\\Julia-1.0.0\\bin")

1 个答案:

答案 0 :(得分:1)

(这是有关Julia的dll问题的更一般性建议。如果安装了R,我将尝试确切的情况。)

Windows SetDllDirectory问题

我遇到了类似的问题,PyInstaller调用了另一种语言。最终与PyInstaller中对SetDllDirectory的调用有关,该调用以一种奇怪的方式修改了搜索路径。

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectorya

https://github.com/pyinstaller/pyinstaller/wiki/Recipe-subprocess#windows-dll-loading-order

要修复此问题,我只需要告诉python将SetDllDirectory重置回NULL。我不确定R中的等效项。

SysInternals ListDlls

调试正在加载的dll时,我非常喜欢SysInternals提供的此工具。下载它,然后在ListDlls.exe juliaListDlls.exe R运行时用juliaR运行它。

https://docs.microsoft.com/en-us/sysinternals/downloads/listdlls

R dyn.load文档

听起来,如果您加载了第三方dll,尤其是在Windows上,R会尝试做很多事情来查找dll。

https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/dyn.load

“用于加载DLL的标准机制”包括针对以下内容的搜索顺序: 找到DLL的位置(如果未提供绝对路径,则为 首选),以及将在哪里找到其依赖的DLL。此搜寻 路径取决于Windows的版本及其安全设置,但是 对于Windows XP SP1以后的版本,则为

  • 启动应用程序的目录。

  • 各种系统目录,例如c:/Windows/system32c:/Windows/systemc:/Windows

  • 当前目录。

  • 沿着环境给出的可执行文件的搜索路径 变量PATH

软件包通常希望在其libs目录中提供依赖的DLL, 然后通过设置PATH变量({{1} 在R的最新版本中自动生成),但DLL搜索顺序表示 启动目录和系统目录中的DLL将是 首选。在Windows XP SP1和更高版本上,有一种方法可以修改 搜索顺序。如果将参数library.dynam提供给DLLpath,则后者 利用Windows系统调用dyn.load插入 SetDllDirectory的值排在第二位,并删除当前目录, 在该DLLpath通话期间。 (请注意,只有一个目录 可以通过这种方式插入。)

用户对类似这样的消息感到困惑

dyn.load

最后一行是Windows(不是 R)诊断:找不到的“模块”不是error: unable to load shared object '.../library/rJava/libs/x64/rJava.dll': LoadLibrary failure: The specified module could not be found. 但是Windows正在寻找其他东西(这里很可能是Java DLL):如果幸运的话,将出现一个包含更多详细信息的对话框。

朱莉娅如何加载Sys.dll

Julia 1.x当前从exe所在的文件夹rJava.dll中加载一些dll,并且还从附近的文件夹bin/中加载sys.dll。您可以通过在调用julia时用../lib/julia/sys.dll参数指定sys.dll所在的位置来覆盖它。

希望有帮助。