从 R 问题调用 Julia

Mik*_*ike 5 r julia

我正在使用 Julia 1.0.0 和 R 3.5.1,我在使用JuliaCall和调用 R/RStudio 中的 Julia 时遇到问题XRJulia

当我尝试:

library(JuliaCall)
julia <- julia_setup(JULIA_HOME = "C:\\Program Files\\Julia-1.0.0\\bin")
Run Code Online (Sandbox Code Playgroud)

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

当我尝试:

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

测试返回 false。

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

从 R/RStuio 调用 Julia 的正确方法是什么?

在这里寻找解决方案,但无法使其正常工作。

更新 - 我尝试了这个解决方案,以便 R 可以识别 Julia 文件所在的位置。当我重新启动我的会话并设置新的 env 然后尝试运行我的 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")
Run Code Online (Sandbox Code Playgroud)

phy*_*att 1

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

\n\n

WindowsSetDllDirectory问题

\n\n

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

\n\n

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

\n\n

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

\n\n

为了解决这个问题,我只需要告诉 python 重置SetDllDirectoryNULL. 我不完全确定 R 中的等效项。

\n\n

SysInternals 列表DLL

\n\n

在调试加载的 dll 时,我非常喜欢 SysInternals 提供的这个工具。ListDlls.exe julia下载它,并在或运行ListDlls.exe R时使用julia或运行它R

\n\n

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

\n\n

Rdyn.load文档

\n\n

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

\n\n

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

\n\n
\n

用于加载 DLL 的 \xe2\x80\x98 标准机制\xe2\x80\x99 包括找到 DLL 的搜索顺序(如果未以绝对路径给出,这是首选),以及其依赖的位置将找到 DLL。此搜索路径取决于 Windows 版本及其安全设置,但对于自 Windows XP SP1 以来的版本,它是

\n\n
    \n
  • 启动应用程序的目录。

  • \n
  • 各种系统目录,例如c:/Windows/system32,\n c:/Windows/systemc:/Windows.

  • \n
  • 当前目录。

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

  • \n
\n\n

包通常希望在其libs目录中提供依赖的 DLL,并通过设置PATH变量来完成此操作(library.dynam在最新版本的 R 中会自动执行此操作),但 DLL 搜索顺序意味着启动目录和系统中的 DLL目录将是首选。在 Windows XP SP1 及更高版本上,有一种方法可以修改\n 搜索顺序。DLLpath如果向 提供参数dyn.load,则后者利用 Windows 系统调用SetDllDirectory将 的值插入DLLpath到第二位,并在调用期间删除当前目录dyn.load。(注意这种方式只能插入一个目录\n。)

\n\n

用户对诸如此类的消息感到困惑

\n\n
error: unable to load shared object \n\'.../library/rJava/libs/x64/rJava.dll\':  \nLoadLibrary failure:  The specified module could not be found. \n
Run Code Online (Sandbox Code Playgroud)\n\n

最后一行是 Windows(不是 R)诊断:无法找到的 \xe2\x80\x98module\xe2\x80\x99 不是 \n,rJava.dll而是 Windows 正在寻找的其他内容(这里很可能是 Java\n DLL):如果幸运的话,将会出现一个包含更多详细信息的对话框。

\n
\n\n

Julia 如何加载 Sys.dll

\n\n

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

\n\n

希望有帮助。

\n