有没有一种方法可以使用标准的输入/输出流来通信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的输入流?
中的答案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);
}
}
}