Qt4,QProcess,R:标准输出中的垃圾,线路较长

时间:2011-04-03 03:14:00

标签: r qt4 qprocess

我正在研究另一个用于R的GUI前端(主要用于研究或多或少相关材料上的Qt4),我偶然发现了所涉及组件的异常行为。 如果我尝试通过QProcess将一行76个字符或更长的行写入R的stdin,则输出(命令的回显)将返回垃圾包含并且部分行重复。例如:

freq.some <- recode(freq, "'some' = 'no'; 'all or most' = 'yes'; else = NA");

被回复为

freq.some <- recode(freq, "'some' = 'no'; 'all or most' = 'yes'; else = NA"
< "'some' = 'no'; 'all or most' = 'yes'; else = 
NA")                         ;

我尝试在QByteArray级别上使用输出,但异常已经存在。

我的Qt版本是4.6.3,R v 2.11.1,Debian Squeeze。相关的代码段如下:

这就是我开始R的过程:

arrr = new QProcess(this);
QString program = "R --interactive --no-readline";
arrr->start(program, QProcess::Unbuffered | QProcess::ReadWrite);

这是我将命令写入R的过程的方法:

QString cmd = ui->lineEdit->displayText();
QString tmp = cmd + "\n";
arrr->write(tmp.toUtf8().data());

这是我阅读过程输出的方式:

QByteArray output;
QTextStream *ts = new QTextStream(&output);
output = arrr->readAllStandardOutput();
QString r_output = ts->readAll();

从readyRead()信号开始读取进程。

如果我的问题不符合本网站的公认标准,我会事先道歉。谢谢。

1 个答案:

答案 0 :(得分:0)

我担心从长远来看,你可能会发现R管道并读取标准输出相当麻烦。我建议你可以考虑一些替代方案:

  • Rserve提供通过tcp / ip连接的无头R服务器;存在示例C ++客户端

  • 根据`Writing R Extensions'手册直接嵌入R(但你可以下载到很多相当裸机的C代码中)

  • RInside使用sibbling包Rcpp包装R API以嵌入更高的抽象C ++。另外,我最近添加了一个详细的示例,说明如何从Qt进行此操作,现在在SVN中(但尚未在CRAN上);还有一个 detailed blog post关于它。