2012-01-18 69 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