在 C# 控制台应用程序中加载 rdotnet 在 macOS 上失败并出现未知错误

Loading rdotnet in C# console application fails with an unknown error on macOS

我在 macOS 上有一个非常基本的 C# 控制台应用程序,下面粘贴了代码。当我尝试 运行 此代码时,对 REngine.GetInstance() 的调用失败并出现以下异常:

Unhandled exception. System.ArgumentException: This 64-bit process failed to load the library libR.dylib. No further error message from the dynamic library loader
   at DynamicInterop.UnmanagedDll.ThrowFailedLibraryLoad(String dllFullName, String nativeError)
   at DynamicInterop.UnmanagedDll.ReportLoadLibError(String dllName, String nativeError)
   at DynamicInterop.UnmanagedDll..ctor(String dllName)
   at RDotNet.REngine..ctor(String id, String dll)
   at RDotNet.REngine.CreateInstance(String id, String dll)
   at RDotNet.REngine.GetInstance(String dll, Boolean initialize, StartupParameter parameter, ICharacterDevice device)
   at RTest.Program.Main(String[] args) in /Users/.../Projects/RTest/RTest/Program.cs:line 14

我已经确定系统上没有安装多个 R。此外,尝试在 M1 机器和基于 Intel 的 Mac.

上执行相同的代码

代码如下:

using System;
using RDotNet;

namespace RTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var e = REngine.GetInstance();
            e.Initialize();

        }
    }
}

我还尝试使用 REngine.SetEnvironmentVariables(rPath: "/usr/local/Cellar/r/4.1.2_1/[=25= 明确指定 R_HOME 和 R_PATH ]", rHome: "/usr/local/Cellar/r/4.1.2_1");但无济于事。

任何帮助将不胜感激。

谢谢

您是否确认设置了两个环境变量。通过终端还是通过您的 IDE 环境变量设置机制?

根据记忆,你需要的两个是:

export LD_LIBRARY_PATH=/Library/Frameworks/R.framework/Libraries/:$LD_LIBRARY_PATH

export PATH=/Library/Frameworks/R.framework/Libraries/:$PATH

可以从这里 https://cran.r-project.org/bin/macosx/ 或使用 brew 从 CRAN(综合 R 存档网络)为 macOS 安装 R - 也可以进行混合安装。

我还添加了行

Console.WriteLine($"is running: {e.IsRunning}");

将成功案例的命令行输出到您的 C# 测试程序。

要获取相关的 R 主目录,您可以执行以下操作:

  • 在命令行输入R
  • 输入R.home(component = "home")

CRAN 安装

通过 CRAN 安装,它会给你 /Library/Frameworks/R.framework/Resources

检查ls /Library/Frameworks/R.framework/Resources/lib(注意附加的路径部分lib)里面是否有libR.dylib

然后在命令行输入:

export DYLD_LIBRARY_PATH=/Library/Frameworks/R.framework/Resources/lib

并再次尝试在命令行上启动您的 .NET 应用程序。现在大概会显示:

Fatal error: R home directory is not defined

但是我们从上面的 R 命令中知道主目录。所以下一个命令是:

export R_HOME=/Library/Frameworks/R.framework/Resources

现在当你尝试在命令行启动C#测试程序时,应该会出现is running: True的信息,这意味着这次成功了。

brew 安装

R 命令 R.home(component = "home") 在我的机器上用 brew 输出:/usr/local/Cellar/r/4.1.3/lib/R.

有趣的是,在那台机器上我最初得到了一个不同的错误:DirectoryNotFoundException: Directory '/Library/Frameworks/R.framework/Resources'。所以我尝试只使用

export R_HOME=/usr/local/Cellar/r/4.1.3/lib/R

随后在命令行上调用 C# 测试程序 - 它成功了。

CRAN 安装截图

brew 安装截图

一个显着的区别是我必须在 CRAN 安装中显式设置 DYLD_LIBRARY_PATH,而 brew 安装则不需要。

REngine.SetEnvironmentVariables 也不适合我。所以我使用命令行来设置环境变量。

但是,正如您在屏幕截图中所见,这两种安装类型都可以 运行 成功。