有没有办法使用标准输入/输出流来传递C#和R?

时间:2014-09-26 06:25:22

标签: c# r stdio

我想构建一个通过标准输入/输出流与R(rscript.exe)通信所需的C#程序。但我找不到在rscript的输入流中写任何东西的方法。

这是使用其流被重定向的进程的C#程序。

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace test1
{
    class Program
    {        
        static void Main(string[] args)
        {
            var proc = new Process();
            proc.StartInfo = new ProcessStartInfo("rscript", "script.R") 
            {
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                UseShellExecute = false
            };

            proc.Start();            

            var str = proc.StandardOutput.ReadLine();

            proc.StandardInput.WriteLine("hello2");

            var str2 = proc.StandardOutput.ReadToEnd();

        }
    }
}

以下是script.R

cat("hello\n")

input <- readline()

cat("input is:",input, "\n")

str能够捕获"hello",但"hello2"无法写入R的流,因此str2始终会获得"\r\ninput is: \r\n"

有没有办法以这种方式将文本写入R的输入流?

1 个答案:

答案 0 :(得分:2)

https://stackoverflow.com/a/9370949/2906900中的答案适用于此问题。

这是C#和rscript.exe通过stdio进行交互的最小例子。

在R脚本中,stdin连接必须明确打开。

R代码:

f <- file("stdin")
open(f)
input <- readLines(f, n = 1L)
cat("input is:", input)

在这种情况下,可以访问rscript的输入流。

C#代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace test1
{
    class Program
    {        
        static void Main(string[] args)
        {
            var proc = new Process();
            proc.StartInfo = new ProcessStartInfo("rscript")
            {
                Arguments = "script.R",
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false
            };

            proc.Start();
            proc.StandardInput.WriteLine("Hello");
            var output = proc.StandardOutput.ReadLine();
            Console.WriteLine(output);
        }
    }
}