1

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

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() 信号上。

如果我的问题不符合本网站公认的标准,我提前道歉。谢谢你。

4

1 回答 1

0

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

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

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

  • RInside使用 sibbling 包Rcpp包装了 R API 以嵌入到更高抽象的 C++ 中。另外,我最近添加了一个详细的示例,说明如何从现在在 SVN 中(但还没有在 CRAN 中)的Qt做到这一点;还有 一篇关于它的详细博客文章

于 2011-04-03T13:58:24.487 回答