R帮助页面作为对象

9
有没有一种好方法可以从已安装的软件包中提取R-help页面,以R对象的形式(例如列表)。我想将帮助页面暴露为标准化的JSON或XML模式。然而,从数据库中获取R-help信息比我想象的要困难得多。 我曾经破解过获取R帮助手册页面的HTML。但是,我宁愿有一个包含此信息的通用R对象,可以呈现为JSON / XML / HTML等。我研究了来自Hadley的“ helpr”软件包,但对于我的目的来说似乎有点过头了。
2个回答

6

以下是我编写的代码。不过,我还需要在许多帮助文件上进行测试,以确定它是否通常有效。

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

1
一个提示:去掉分号。认真的,去掉它们。那是C代码,不是R代码。在R中,除非你想在一行上写两个命令,否则你不需要它们,我强烈建议你不要这样做。 - Joris Meys
1
我喜欢它们。当我忘记关闭括号时,它们经常帮助我调试。 - Jeroen Ooms

6

在Hadley的建议下进行了编辑

您可以通过以下方式更轻松地完成此操作:

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格式的对象? - Jeroen Ooms
你应该在问题中明确说明。当你解析Rd时,我认为那就是你想要的。使用Rd2txt将会给你纯文本。如果你只是获取文件(没有任何解析),那么你得到的就是原始的Rd格式。如果你想将其转换为列表,你需要编写自己的函数。 - Joris Meys
我真的很讨厌使用match.call和随后的调用操作。我认为只与字符串一起工作要好得多。 - hadley
@hadley 这只是一种风格问题。这就是lm和许多其他函数的工作方式。此外,如果R核心决定更改目录结构,它仍应该起作用。使用字符串操作会更棘手一些。 - Joris Meys
我的意思是你可以将函数写成 getHTMLHelp <- function(topic, ...) thefile <- help(...)。使用 match.call 只会让函数变得更加复杂,而没有任何好处。 - hadley
仅仅因为一些基本的R函数这样做,并不意味着这是一个好的实践方法。 - hadley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接