有没有一种方法可以使用标准的输入/输出流来通信C#和R

本文关键字:输出流 输入 通信 标准 一种 可以使 方法 有没有 | 更新日期: 2023-09-27 18:24:29

我想构建一个C#程序,该程序需要通过标准输入/输出流与R(rscript.exe)进行通信。但是我找不到在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的输入流?

有没有一种方法可以使用标准的输入/输出流来通信C#和R

中的答案https://stackoverflow.com/a/9370949/2906900对这个问题有效。

下面是一个C#和rsccript.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);
        }
    }
}