Как отладить пакет R (с кодом C) в Emacs, используя GDB? - PullRequest
15 голосов
/ 12 февраля 2011

В настоящее время я пишу пакет R и использую скомпилированный код C ++ через пакет Rcpp в R (Rcpp облегчает взаимодействие кода R и C ++ для непрограммиста, такого как я, ИМХО).

Я хочу отладить несколько ошибок в моей программе на C ++ с использованием gdb.Я погуглил и нашел в основном несколько ресурсов по отладке R в emacs, R-FAQ , несколько писем здесь и определенно Руководство по расширению R для записи R.

Однако я делаю это впервые, я не мог зайти слишком далеко.Может ли кто-нибудь дать мне несколько советов о том, как отлаживать пакеты R (или расширения с кодом C ++ / C) в emacs.В частности, я хочу воспользоваться преимуществами использования ESS с R и GDB с Emacs (о чем говорит R-FAQ).

Обратите внимание, я в порядке, как использовать GDB, используя только C или C ++ программы.Но я не смог перевести это знание на использование gdb с R и расширениями.

Ответы [ 2 ]

7 голосов
/ 07 ноября 2012

Вы можете использовать имеющиеся у вас знания по отладке программ на C ++, превратив проблему в чисто задачу разработки и отладки на C ++ с помощью RInside (отличный компаньон Rcpp).

Напишите функцию main() C ++, которая создает экземпляр R с использованием RInside, выполняет код R (или создает сценарий R), который устанавливает тестовый пример, а затем вызывает тестируемую функцию из main (), например,

#include <Rcpp.h>
#include <RInside.h>
#include "function_under_test.h"

int main(int argc, char *argv[]) 
{
    using namespace std;
    using namespace Rcpp;

    RInside R(argc, argv);

    string evalstr = R"(
        a <- matrix(c(1,1,1, 1,1,1, 1,1,1), nrow = 3, ncol=3)
    )";
    R.parseEvalQ(evalstr);

    SEXP a = R["a"];

    R["b"] = function_under_test(a);

    evalstr = R"(
        print(b)
    )";
    R.parseEvalQ(evalstr);

    return 0;
}

Затем выполните обычную процедуру отладки программы на C ++ с помощью gdb, установив точки останова в function_under_test() и т. Д.

Таким образом, вы избегаете переключения между средами разработки R и C ++ и необходимости переустанавливать пакет R.

1 голос
/ 13 февраля 2011

К сожалению, не все так просто. Вам нужно перейти между ESS, gdb (то есть gud в Emacs) и R. Лучшее описание, вероятно, все еще выигрывает Writing R Extensions, однако в списке рассылки ESS недавний поток * это также обсуждает это (и обратите внимание, что некоторые ответы поступили за пределы цепочки, поэтому посмотрите и на архив списка рассылки).

...