2012-01-18 10 views
5

Czy istnieje dobry sposób na wyodrębnienie Uzyskaj stronę pomocy R z zainstalowanego pakietu w postaci obiektu R (np. Listy). Chciałbym udostępnić strony pomocy w postaci znormalizowanych schematów JSON lub XML. Jednak uzyskanie informacji R-help z DB jest trudniejsze, niż myślałem.R pomoc strona jako obiekt

Zhakowałem razem jakiś czas temu, aby uzyskać kod HTML strony pomocy R. Jednak wolałbym mieć ogólny obiekt R, który zawiera te informacje, które mogę renderować do JSON/XML/HTML, itp. Zajrzałem do pakietu helpr Hadleya, ale wydaje mi się, że jest to trochę przesadzone.

Odpowiedz

1

więc poniżej tego, co ja hacked razem. Jednak muszę jeszcze przetestować go w wielu plikach pomocy, aby sprawdzić, czy to na ogół działa.

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

I wtedy można zrobić coś takiego:

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

Jedna wskazówka: upuść średniki. Poważnie, upuść je. To jest kod C, nie kod R. W R nie potrzebujesz ich, chyba że chcesz umieścić dwa polecenia w jednym wierszu i zdecydowanie nie rób tego. –

+0

Lubię je. Często pomagają mi w debugowaniu, gdy zapominam o zamknięciu nawiasów. – Jeroen

5

Zmieniano z sugestią Hadley

Można zrobić to nieco łatwiej przez:

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

Korzystanie tools:::Rd2txt zamiast tools:::Rd2HTML daje zwykły tekst. Po prostu pobranie pliku (bez żadnego parsowania) daje oryginalny format Rd, dzięki czemu możesz napisać własną funkcję parsowania, aby sparsować ją w obiekt (zobacz rozwiązanie @Jeroena, które wykonuje dobrą robotę w wyodrębnianiu wszystkich informacji do listy).

Funkcja ta wykonuje dokładnie te same argumenty jak help() i zwraca wektor z każdym elementem jest linia w pliku, np:

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

Lub:

> 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

Ale czy istnieje sposób, aby uzyskać zakaz htmlified obiekt? – Jeroen

+0

Powinien był to określić w pytaniu. Kiedy parsujesz Rd, myślałem, że tego właśnie chcesz. Użyj Rd2txt da ci zwykły tekst. Po prostu pobranie pliku (bez parsowania) daje oryginalny format Rd. Jeśli chcesz przekształcić to w listę, musisz napisać własną funkcję. –

+0

Naprawdę nienawidzę używania 'match.call' i późniejszej manipulacji telefonicznej. Myślę, że lepiej jest pracować z ciągami. – hadley