我想构建一个通过标准输入/输出流与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的输入流?
答案 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);
}
}
}