2012-01-18 7 views
5

¿Hay alguna manera de extraer la página de ayuda de R de un paquete instalado en forma de un objeto R (por ejemplo, una lista)? Me gustaría exponer las páginas de ayuda en forma de esquemas estandarizados JSON o XML. Sin embargo, obtener la información de ayuda de R de la base de datos es más difícil de lo que pensaba.R página de ayuda como objeto

Hackeé hace un tiempo para obtener el HTML de una página del manual de ayuda de R. Sin embargo, preferiría tener un objeto R general que contenga esta información, que pueda representar en JSON/XML/HTML, etc. Miré en el paquete helpr de Hadley, pero esto parece ser un poco exagerado para mi propósito.

Respuesta

1

Así que a continuación lo que han pirateado juntos. Sin embargo, todavía tengo que probarlo en muchos archivos de ayuda para ver si generalmente funciona.

Rd2list <- function(Rd){ 
    names(Rd) <- substring(sapply(Rd, attr, "Rd_tag"),2); 
    temp_args <- Rd$arguments; 

    Rd$arguments <- NULL; 
    myrd <- lapply(Rd, unlist); 
    myrd <- lapply(myrd, paste, collapse=""); 

    temp_args <- temp_args[sapply(temp_args , attr, "Rd_tag") == "\\item"]; 
    temp_args <- lapply(temp_args, lapply, paste, collapse=""); 
    temp_args <- lapply(temp_args, "names<-", c("arg", "description")); 
    myrd$arguments <- temp_args; 
    return(myrd); 
} 

getHelpList <- function(...){ 
    thefile <- help(...) 
    myrd <- utils:::.getHelpFile(thefile); 
    Rd2list(myrd); 
} 

Y entonces usted haría algo como:

library(RJSONIO); 
myhelp <- getHelpList("qplot", package="ggplot2"); 
cat(toJSON(myhelp)); 
+0

Un consejo: suelte el punto y coma. En serio, soltarlos. Ese es el código C, no el código R. En R no los necesitas a menos que quieras poner dos comandos en una línea, y te recomiendo encarecidamente que no lo hagas. –

+0

Me gustan. A menudo me ayudan a depurar cuando olvido cerrar los corchetes. – Jeroen

5

editadas con la sugerencia de Hadley

Usted puede hacer esto un poco más fácil por:

getHTMLhelp <- function(...){ 
    thefile <- help(...) 
    capture.output(
     tools:::Rd2HTML(utils:::.getHelpFile(thefile)) 
    ) 
} 

Usando tools:::Rd2txt en lugar de tools:::Rd2HTML le dará texto plano. El simple hecho de obtener el archivo (sin ningún análisis sintáctico) le da el formato Rd original, por lo que puede escribir su función de análisis personalizada para analizarlo en un objeto (consulte la solución de @Jeroen, que hace un buen trabajo extrayendo toda la información en una lista)

Esta función tiene exactamente los mismos argumentos que help() y devuelve un vector con cada elemento una línea en el archivo, por ejemplo:

> head(HelpAnova) 
[1] "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"  
[2] "<html><head><title>R: Anova Tables</title>"        
[3] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">" 
[4] "<link rel=\"stylesheet\" type=\"text/css\" href=\"R.css\">"    
[5] "</head><body>"               
[6] ""   

O:

> HelpGam <- getHTMLhelp(gamm,package=mgcv) 
> head(HelpGam) 
[1] "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"  
[2] "<html><head><title>R: Generalized Additive Mixed Models</title>"   
[3] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">" 
[4] "<link rel=\"stylesheet\" type=\"text/css\" href=\"R.css\">"    
[5] "</head><body>"               
[6] ""   
+0

pero hay una manera de conseguir un objeto no htmlified? – Jeroen

+0

Debería haber especificado eso en su pregunta. Mientras analizas la Rd, pensé que eso era lo que querías. Use Rd2txt le dará texto sin formato. Solo obtener el archivo (sin ningún análisis sintáctico) le da el formato Rd original. Si desea transformar esto en una lista, tendrá que escribir su propia función. –

+0

Realmente odio el uso de 'match.call' y la posterior manipulación de llamadas. Creo que es mucho mejor simplemente trabajar con cadenas. – hadley

Cuestiones relacionadas