¿Cómo depurar (colocar puntos de interrupción, etc.) un paquete R instalado en RStudio?
-
20-12-2019 - |
Pregunta
Necesito ejecutar una función línea por línea para entender cómo funciona.Pero la función es parte de un paquete instalado y no sé dónde almacena R la fuente de los paquetes instalados (por ejemplo, MultiPhen).Estoy usando RStudio 0.98.501 y R 3.0.2 en Ubuntu 12 (64it).Aparentemente el código fuente de los paquetes instalados no se almacena, ¿verdad?Lo siento si es una pregunta ingenua, soy nuevo en R.Si las fuentes no están almacenadas, ¿hay alguna forma de reinstalar un paquete con la fuente y depurarlo (básicamente colocar un punto de interrupción)?
Gracias,
kayhan
Solución
Mira a trace
.Aquí hay un ejemplo que agrega un punto de interrupción en la cuarta declaración en la función del paquete base. var
.aquí preguntamos trace
para invocar la función browser
en la sexta declaración:
> trace(var, browser, at=6)
Tracing function "var" in package "stats"
[1] "var"
> var(1:10)
Tracing var(1:10) step 6
Called from: eval(expr, envir, enclos)
Browse[1]> n
debug: if (is.data.frame(y)) y <- as.matrix(y) else stopifnot(is.atomic(y))
Browse[2]> n
debug: stopifnot(is.atomic(y))
Browse[2]> n
debug: .Call(C_cov, x, y, na.method, FALSE)
Browse[2]> n
[1] 9.166667
Recuerda untrace
cuando termines.Puedes hacer cosas bastante complejas con trace
, aunque en la mayoría de los casos trace(fun.name, browser)
probablemente sea suficiente.
Alternativamente, puedes simplemente cargar el paquete y escribir el nombre de la función en la línea de comando así:
> var
function (x, y = NULL, na.rm = FALSE, use)
{
if (missing(use))
use <- if (na.rm)
"na.or.complete"
else "everything"
na.method <- pmatch(use, c("all.obs", "complete.obs", "pairwise.complete.obs",
"everything", "na.or.complete"))
if (is.na(na.method))
stop("invalid 'use' argument")
if (is.data.frame(x))
x <- as.matrix(x)
else stopifnot(is.atomic(x))
if (is.data.frame(y))
y <- as.matrix(y)
else stopifnot(is.atomic(y))
.Call(C_cov, x, y, na.method, FALSE)
}
<bytecode: 0x000000000928ad30>
<environment: namespace:stats>
Luego puedes copiarlo en tu editor y jugar con él, agregar tu browser
declaración y recorra los resultados.
Otros consejos
-
Creo que cuando cuando escribe
install.packages('MultiPhen')
, obtienes una versión binaria del paquete. Creo que no hay manera de establecer un punto de interrupción y un código a través de esa versión del paquete. -
Todos los paquetes son de código abierto, y la fuente está disponible en la página de crane para el paquete. Por ejemplo, esta es la página de crane para multiphen. Si hace clic en el enlace junto al texto "Fuente del paquete:" descargará la fuente.
-
En términos de qué hacer cuando tiene la fuente: todos los paquetes R tienen la misma estructura de directorio. Lo que importa para su situación es que todo el código R para el paquete está en el directorio llamado "R".
Recomiendo desinstalar el paquete de RSTUDIO y obtener el código en el directorio "R", configurar los puntos de interrupción y pisar el código a través de su forma.
Por favor, háganoslo saber si esto resuelve su problema.
Encontré una manera fácil de hacer esto.Primero, escriba un script para recuperar la función y luego configurar un punto de interrupción.Ejecute el guión, y se detiene en el punto de interrupción.Luego, puede ver que hay diferentes opciones para ejecutar el código.Siguiente línea, ingrese a la función, continúe, deténgase ... y ahora puede ejecutar la línea de código por línea y ejecutarse a su función.