Чтение консоли R с помощью RInside

Я использую Rcpp и RInside для запуска некоторых команд в R. Я сделал персональный графический интерфейс (в Qt), который отправляет команды, и я хотел бы восстановить результат в формате std::string.

Пример :

$ 1 + 1

Результат:

[1] 2

И я хочу иметь эту строку:

[1] 2

Я уже проверяю приведение строк с помощью as и as_string, но приведение недопустимо из-за возвращаемого типа интерна в R.

Можно ли прочитать вывод консоли R или что-то еще?

РЕДАКТИРОВАТЬ:

void RppMainWindow::runLineOnScriptCursor() {
    std::string line = script->getCodeEditor()->lineOnCursor();
    if ( line.empty() || line == INVALID ) {
        return;
    }
    RCommand cmd (script->getConsoleViewer(), r);
    cmd.execute(line);
}

void RCommand::execute(std::string commande) {
    std::string res = executeOnR(commande);
    viewer->addEntry(commande, res);
}

void ConsoleViewer::addEntry(std::string command, std::string result) {
    this->moveCursor(QTextCursor::End);

    QTextCharFormat format;
    format.setFontWeight(QFont::DemiBold);
    format.setForeground(QBrush(QColor("red")));
    this->mergeCurrentCharFormat(format);
    std::string tmp = "> " + command + "\n";
    this->insertPlainText(QString(tmp.c_str()));


    this->moveCursor(QTextCursor::End);

    format.setFontWeight(QFont::Normal);
    format.setForeground(QBrush(QColor("blue")));
    this->mergeCurrentCharFormat(format);
    if ( ! result.empty() ) {
        result += "\n";
    }
    this->insertPlainText(QString(result.c_str()));
}

ConsoleViewer позволяет отображать базовую консоль R, подобную этой

$R-команда

вернуться, если нужно


person C. Dupont    schedule 01.04.2016    source источник
comment
Предположительно, ваш проект состоит из нескольких файлов, поскольку это приложение с графическим интерфейсом Qt, но не могли бы вы включить соответствующие разделы кода, которые обрабатывают эту команду ввода-вывода?   -  person nrussell    schedule 01.04.2016
comment
Я сделал это, спасибо за ваш ответ. Я надеюсь, что вы могли бы мне помочь :)   -  person C. Dupont    schedule 01.04.2016


Ответы (1)


Если хочешь

"[1] 2"

вам нужно настроить процедуру форматирования на вашем конце, которая получает 2 от RInside и добавляет [1] (и то же самое для других строк). Это как раз то, что print() делает в R:

edd@max:~$ R --slave -e 'print(1+1)'
[1] 2
edd@max:~$ R --slave -e 'cat(1+1, "\n")'
2 
edd@max:~$

На самом деле я предпочитаю cat() в своих результатах, но print() тоже можно эмулировать.

person Dirk Eddelbuettel    schedule 01.04.2016
comment
1+1 возвращает 2, но на консоли R отображается [1] 2, это правда? - person C. Dupont; 01.04.2016
comment
Из-за того, как R (как интерактивная среда) печатает. Если вы вызываете int R.parseEvalQ("1+1"), вы получаете int со значением 2. - person Dirk Eddelbuettel; 01.04.2016
comment
Поэтому мне нужны некоторые функции для обнаружения и приведения каждого типа! Спасибо :) - person C. Dupont; 01.04.2016
comment
Нет, не знаешь. Вам нужно сесть и прочитать, скомпилировать и поэкспериментировать с кучей существующих примеров. Вы запутались в абсолютных проблемах для начинающих, и я боюсь, что вы неэффективно используете свое время, а стреляете здесь остротами. Почитайте справочную информацию, узнайте о Rcpp, запустите примеры. - person Dirk Eddelbuettel; 01.04.2016