如何将通过 R.NET 生成的图保存到磁盘上的文件中?

How to save a plot generated via R.NET to a file on disk?

我正在使用 R.NET 生成图表(使用 ggplot),我想将这些图表以 PNG 格式保存在磁盘上。每当我调用 engine.Evaluate("ggsave('C:\path\to\file.png', myPlot)") 时,程序会突然中止,退出代码为 2,而不会向磁盘写入任何内容;发生这种情况时不会显示错误。也不可能使用 png()pdf() 将绘图写入文件。这个问题不是 ggplot 特有的,但是 - 我也无法存储通过本机 plot 函数生成的图。

我可以将问题缩小到包含 ggsave()png()/pdf() 的行:执行此行时,程序中止。由于我实际上可以看到 ggplot()plot() 生成的图,因此绘图本身似乎不是问题。

您应该能够使用以下 C# 代码重新创建我所描述的内容:

using RDotNet;

namespace Test {
  class Program {
    static void Main(string[] args) {
      REngine.SetEnvironmentVariables();
      REngine engine = REngine.GetInstance();

      engine.Evaluate("png('D:\Test.png')");
      engine.Evaluate("plot(rnorm(1000))");
      engine.Evaluate("dev.off()");  
    }
  }
}

Apparently, this code should work without any issues.

当运行

png('D:\Test.png')
plot(rnorm(1000))
dev.off()

在 R 中,生成绘图并成功保存到 Test.png。

我正在使用 .NET Framework 4.6.1、R.NET 1.7.0 和 R 3.4.2。我的计算机上没有安装 R,也没有为 R 创建注册表项 - 我只是按照 here.

所述使用 R DLL

事实证明,图像文件路径中不能有反斜杠。如果要将图像写入磁盘上的文件,则必须使用正斜杠,例如而不是

engine.Evaluate("png('D:\Test.png')");

使用

engine.Evaluate("png('D:/Test.png')");

也许这对其他人仍然有帮助。

这并不是说您在回答中提到的不能使用反斜杠。虽然正斜杠也可以解决您的问题,但我认为如果我解释其他解决方案,将来可能会有所帮助。

你必须转义你的反斜杠两次。

一次用于 C#,一次用于 R。

像这样调用Evaluate

engine.Evaluate("png('D:\Test.png')");

将使用字符串调用 R 引擎:"png('D:\Test.png')",如果您对其求值,则它只是:png('D:\Test.png').如果你在 R 中输入它,你也会得到一个错误。

如果你想运行 R 命令png('D:\Test.png')你必须转义那个字符串,它在转义后有两个反斜杠[=28] =]变成:"png('D:\\Test.png')".