2012-01-18 72 views
5

是否有一種很好的方法可以從R對象(例如列表)的形式中從安裝的包中提取R幫助頁面。我想以標準化JSON或XML模式的形式公開幫助頁面。然而,從數據庫獲取R幫助信息比我想象的要困難。R幫助頁面作爲對象

前段時間我一起入侵獲取R幫助手冊頁的HTML。不過,我寧願有一個包含這些信息的普通R對象,我可以渲染爲JSON/XML/HTML等。我查看了Hadley的helpr包,但這對我的目的來說似乎有點矯枉過正。

回答

1

所以下面我砍死一起。不過,我仍然需要在很多幫助文件上測試它,看看它是否能正常工作。

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

然後你會做這樣的事情:

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

一個提示:放下分號。認真地,放下它們。這是C代碼,而不是R代碼。在R中,除非要在一行中放入兩個命令,否則不需要它們,我強烈建議您不要這樣做。 – 2012-02-08 12:57:38

+0

我喜歡他們。當我忘記右括號時,他們經常幫我調試。 – Jeroen 2012-02-08 17:34:27

5

編輯與哈德利

的建議,您可以通過這樣做更容易一點:

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

使用tools:::Rd2txt代替tools:::Rd2HTML會給你純文本。只需獲取文件(沒有任何解析)就可以爲您提供原始的Rd格式,因此您可以編寫自定義解析函數將其解析爲對象(請參閱@Jeroen的解決方案,該解決方案在將所有信息提取到列表中時做得很好)。

這個函數完全相同的參數作爲help()並返回一個向量與每一個元素是文件中的一條線,如:

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

或者:

> 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

但有一種方式來獲得一個非htmlified對象? – Jeroen 2012-01-19 22:50:54

+0

應該在你的問題中指定。當你解析Rd時,我認爲這就是你想要的。使用Rd2txt會給你純文本。只需獲取文件(不需要任何解析)即可獲得原始的Rd格式。如果您想將其轉換爲列表,您必須編寫自己的函數。 – 2012-01-20 07:56:03

+0

我真的很討厭使用'match.call'和後續的調用操作。我認爲只是使用字符串更好。 – hadley 2012-01-20 14:43:09