【问题标题】:R help page as objectR帮助页面作为对象
【发布时间】:2012-01-18 22:57:54
【问题描述】:

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

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

【问题讨论】:

    标签: r cran


    【解决方案1】:

    根据哈德利的建议编辑

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

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

    【讨论】:

    • 但是有没有办法获取非 html 化的对象?
    • 应该在您的问题中指定。当您解析 Rd 时,我认为这就是您想要的。使用 Rd2txt 会给你纯文本。只需获取文件(无需任何解析)即可为您提供原始 Rd 格式。如果要将其转换为列表,则必须编写自己的函数。
    • 我真的很讨厌match.call 的使用和随后的调用操作。我认为只使用字符串会更好。
    • @hadley 我猜是风格问题。这就是 lm 和许多其他功能的工作方式。另外,例如,如果 R 核心决定更改目录结构,它应该仍然可以工作。使用字符串操作会有点棘手。
    • 我的意思是你可以把你的函数写成getHTMLHelp &lt;- function(topic, ...) thefile &lt;- help(...)。使用match.call 并没有带来任何好处,只是让函数变得更复杂。
    【解决方案2】:

    所以下面是我一起破解的。但是,我还需要在许多帮助文件上对其进行测试,看看它是否能正常工作。

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

    【讨论】:

    • 一个提示:去掉分号。说真的,放下它们。那是C代码,不是R代码。在 R 中,除非您想将两个命令放在一行中,否则您不需要它们,我强烈建议您不要这样做。
    • 我喜欢他们。当我忘记右括号时,它们经常帮助我调试。
    猜你喜欢
    • 2011-03-13
    • 2014-01-27
    • 1970-01-01
    • 2016-10-21
    • 2014-12-27
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多