16

私は現在、R パッケージを作成し、R のパッケージを介してコンパイル済みの C++ コードを使用していRcppます (Rcpp は、私のような非プログラマーにとって R と C++ コードの相互作用を容易にします)。

gdb を使用して C++ プログラムのいくつかのエラーをデバッグしたいと考えています。私はググって、主に emacs 内での R のデバッグに関するいくつかのリソース、R-FAQ、いくつかのメールhere、そして間違いなく R の Writing R Extension Manual を見つけました。

しかし、私はこれが初めてで、あまり遠くまで行くことができませんでした。emacs 内で R パッケージ (または C++/C コードを使用した拡張機能) をデバッグする方法について、誰かが私にいくつかの指針を与えることができますか? 具体的には、R で ESS を使用し、Emacs で gdb を使用することを利用したいと考えています (R-FAQ で説明されているように)。

CまたはC++プログラムのみを使用してgdbを使用する方法については問題ありません。しかし、この知識を R と拡張機能を備えた gdb の使用に変換することはできませんでした。

4

2 に答える 2

7

RInside (Rcpp の優れたコンパニオン) を使用して、問題を純粋な C++ 開発およびデバッグ タスクに変換することで、C++ プログラムのデバッグに関する既存の知識を活用できます。

RInsidemain()を使用して R インスタンスを作成し、テスト ケースを設定する R コードを実行 (または R スクリプトをソース) し、main() からテスト対象の関数を呼び出す C++ 関数を記述します。

#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;
}

function_under_test()次に、ブレークポイントなどを設定して gdb を使用して C++ プログラムをデバッグするときは、通常どおり続行します。

これにより、R と C++ の開発環境を切り替えたり、R パッケージを再インストールしたりする必要がなくなります。

于 2012-11-07T09:32:33.763 に答える
1

It's not all that easy, unfortunately. You need to jump between ESS, gdb (ie gud in Emacs) and R. The best description is probably still win Writing R Extensions, however there was a recent thread on the ESS mailing list that discusses this too (and note that some replies came in outside the thread so do look at the mailing list archive too).

于 2011-02-12T23:03:46.163 に答える