2011-02-12 13 views
13

Actualmente estoy escribiendo un paquete R y utilizando el código compilado de C++ a través del paquete Rcpp en R (Rcpp hace que la interacción del código R y C++ sea más fácil para un programador no profesional como yo, en mi humilde opinión).Cómo depurar un paquete R (con código C) en Emacs usando GDB?

Quiero depurar algunos errores en mi programa C++ usando gdb. Busqué en Google y encontré principalmente algunos recursos para depurar R dentro de emacs, R-FAQ, algunos correos electrónicos here y, definitivamente, el Manual de extensiones R's Writing R.

Sin embargo, estoy haciendo esto por primera vez, no pude ir demasiado lejos. ¿Podría alguien darme algunos consejos sobre cómo depurar paquetes R (o extensiones con código C++/C) dentro de emacs? Específicamente, quiero aprovechar las ventajas de usar ESS con R y gdb con Emacs (como se refiere a las R-FAQ).

Tenga en cuenta que estoy de acuerdo con el uso de gdb usando solo programas en C o C++. Pero no pude traducir este conocimiento al uso de gdb con R y extensiones.

Respuesta

1

No es tan fácil, desafortunadamente. Debes saltar entre ESS, gdb (es decir, gud en Emacs) y R. La mejor descripción es, probablemente, todavía ganar las Extensiones de Escritura R, sin embargo hubo un recent thread en el ESS mailing list que discute esto también (y ten en cuenta que algunas respuestas entraron fuera del hilo así que mira el archivo de la lista de correo también).

+1

Gracias. Desafortunadamente, yo era el novato que hacía la pregunta en el hilo (pregunta del profesor Bates y respondida por el profesor Maechler) que usted mencionó. :-(. – suncoolsu

+1

Mi uso es 'R -d gdb' de la línea de comandos, luego' r' para decirle a gdb que (r) un R, 'biblioteca (pkg)' luego ctrl-c para entrar en gdb, establecer puntos de interrupción , etc., es decir, sin emacs. Mantener en mi cabeza los nombres de los símbolos y la lógica del programa es lo suficientemente desafiante para mí, sin tener que recordar la capa emacs/ESS. –

+0

Creo que ese es el enfoque que está en * Writing R Extensions *, isn 't? –

6

Puede aprovechar su conocimiento existente sobre depuración de programas C++ convirtiendo el problema en una tarea de depuración y desarrollo de C++ pura utilizando RInside (un gran complemento de Rcpp).

Escriba una main() función C++ que crea una instancia R utilizando RInside, ejecuta el código R (o crea un script R) que configura el caso de prueba y luego llama a la función bajo prueba desde main(), p.

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

A continuación, proceder como de costumbre cuando la depuración de un programa en C++ con GDB por los puntos de interrupción de ajuste en function_under_test() etc.

esta manera se evita el cambio entre R y entornos de desarrollo C++ y tener que volver a instalar el paquete R.

+0

@ user39275: C++ 11 admite cadenas sin formato (indicadas por la R "extraña"), que son útiles para encapsular enunciados R multilínea. Esto evita tener que escapar saltos de línea manualmente. –