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

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


我可以将问题缩小到包含ggsave()or 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()");  

    }

  }

}

显然,这段代码应该没有任何问题。


跑步时


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 创建注册表项 - 我只是按照此处所述使用 R DLL 。


翻过高山走不出你
浏览 80回答 2
2回答

芜湖不芜

这并不是说你不能像你在回答中提到的那样使用反斜杠。尽管正斜杠也可以解决您的问题,但我认为如果我解释其他解决方案,将来可能会有所帮助。您必须两次转义反斜杠。一次用于 C#,一次用于 R。像这样调用 Evaluateengine.Evaluate("png('D:\\Test.png')");将使用字符串调用R引擎:"png('D:\\Test.png')",如果您评估它只是:png('D:\Test.png')。如果你在 R 中输入它,你也会得到一个错误。如果你想运行 R 命令png('D:\\Test.png'),你必须转义那个字符串,在转义后它有两个反斜杠变成:"png('D:\\\\Test.png')"。

12345678_0001

事实证明,图像文件的路径中不能有反斜杠。如果你想将图像写入磁盘上的文件,你必须使用正斜杠,例如而不是engine.Evaluate("png('D:\\Test.png')");利用engine.Evaluate("png('D:/Test.png')");也许这对其他人仍然有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP