2012-01-18 15 views
5

C'è un modo carino per estrarre la pagina R-help da un pacchetto installato sotto forma di un oggetto R (ad esempio un elenco). Vorrei esporre le pagine di aiuto sotto forma di schemi JSON o XML standardizzati. Tuttavia ottenere le informazioni R-help dal DB è più difficile di quanto pensassi.R pagina di aiuto come oggetto

Ho eseguito l'hacking un po 'di tempo fa per ottenere l'HTML di una pagina del manuale di aiuto R. Comunque preferirei avere un oggetto R generale che contenga queste informazioni, che io possa rendere a JSON/XML/HTML, ecc. Ho esaminato il pacchetto helpr di Hadley, ma questo sembra essere un po 'eccessivo per il mio scopo.

risposta

1

Quindi sotto di quello che ho inciso insieme. Tuttavia, devo ancora testarlo su molti file di aiuto per vedere se generalmente funziona.

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

E poi si farebbe qualcosa di simile:

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

Un consiglio: rilasciare il punto e virgola. Seriamente, lasciateli cadere. Quello è il codice C, non il codice R. In R non ne hai bisogno a meno che tu non voglia mettere due comandi su una riga, e ti consiglio vivamente di non farlo. –

+0

Mi piace em. Spesso mi aiutano a eseguire il debug quando dimentico le parentesi di chiusura. – Jeroen

5

modificati con suggerimento di Hadley

È possibile farlo un po 'più facile:

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

Utilizzando tools:::Rd2txt invece di tools:::Rd2HTML vi darà testo normale. Il solo recupero del file (senza alcuna analisi) fornisce il formato Rd originale, quindi puoi scrivere la tua funzione di analisi personalizzata per analizzarla in un oggetto (vedi la soluzione di @Jeroen, che fa un buon lavoro nell'estrarre tutte le informazioni in un elenco).

Questa funzione prende esattamente gli stessi argomenti help() e restituisce un vettore con ogni elemento essendo una riga nel file, ad esempio:

> 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] ""   

Oppure:

> 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

Ma c'è un modo per ottenere un oggetto non htmlified? – Jeroen

+0

Dovrebbe averlo specificato nella tua domanda. Mentre analizzi la Rd ho pensato che fosse quello che volevi. Usa Rd2txt ti darà testo semplice. Il solo recupero del file (senza analisi) fornisce il formato Rd originale. Se vuoi trasformarlo in una lista, dovrai scrivere la tua funzione. –

+0

Odio davvero l'uso di 'match.call' e la conseguente manipolazione delle chiamate. Penso che sia meglio lavorare solo con le stringhe. – hadley

Problemi correlati