8

有没有一种很好的方法可以从已安装的包中以 R 对象(例如列表)的形式提取 R 帮助页面。我想以标准化 JSON 或 XML 模式的形式公开帮助页面。然而,从数据库中获取 R-help 信息比我想象的要难。

不久前,我一起破解了 R 帮助手册页的 HTML。但是,我宁愿拥有一个包含此信息的通用 R 对象,我可以将其渲染为 JSON/XML/HTML 等。我查看了helprHadley 的包,但这对于我的目的来说似乎有点矫枉过正。

4

2 回答 2

7

编辑哈德利的建议

您可以通过以下方式更轻松地做到这一点:

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] ""           
于 2012-01-19T15:41:35.640 回答
4

所以低于我一起破解的内容。但是,我还必须在许多帮助文件上对其进行测试,以查看它是否通常有效。

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

然后你会做类似的事情:

myhelp <- getHelpList("qplot", package="ggplot2");
cat(jsonlite::toJSON(myhelp));
于 2012-01-24T07:31:11.440 回答