Qt4, QProcess, R: мусор в стандартном выводе с более длинными строками - PullRequest
1 голос
/ 03 апреля 2011

Я работаю над еще одним GUI-интерфейсом для R (главным образом для изучения Qt4 на более или менее актуальном материале), и я наткнулся на необычное поведение задействованных компонентов.Если я пытаюсь записать строку из 76 символов или более в стандартный вывод R через QProcess, вывод (эхо команды) возвращается с включениями мусора и повторением частей строки.Например:

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 голосов
/ 03 апреля 2011

Боюсь, что в долгосрочной перспективе вам может показаться затруднительным чтение канала R и чтение стандартного вывода.Я предлагаю несколько альтернатив, на которые вы могли бы обратить внимание:

  • Rserve предоставляет безголовый R-сервер, к которому вы подключаетесь через tcp / ip;существует пример клиента C ++

  • Прямое встраивание R согласно руководству `Writing R Extensions '(но вы бы вернулись к большому количеству довольно чистого кода C)

  • RInside оборачивает R API для встраивания в гораздо более высокую абстракцию C ++ с использованием пакета sibbling Rcpp .Кроме того, я недавно добавил подробный пример того, как это сделать, из Qt , который сейчас находится в SVN (но еще не в CRAN);Об этом также есть подробное сообщение в блоге .

...