1

私は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() シグナルで発生します。

私の質問がこのサイトの承認された基準に準拠していない場合は、あらかじめお詫び申し上げます。ありがとうございました。

4

1 に答える 1

0

長い目で見れば、R へのパイプと標準出力の読み取りがかなり面倒であることがわかるかもしれません。検討できるいくつかの代替案を提案します。

  • Rserveは、tcp/ip 経由で接続するヘッドレス R サーバーを提供します。サンプル C++ クライアントが存在します

  • `Writing R Extensions' マニュアルに従って直接 R を埋め込む (ただし、多くのかなりベアメタルな C コードに落とし込むことになります)

  • RInsideは、兄弟パッケージRcppを使用して、より高度な抽象化 C++ に埋め込むために R API をラップします。さらに、私は最近、現在SVNにあるQtからそれを行う方法の詳細な例を追加しました(ただし、まだCRANにはありません)。それに関する詳細なブログ投稿もあり ます。

于 2011-04-03T13:58:24.487 に答える