是否有一种很好的方法可以从R对象(例如列表)的形式中从安装的包中提取R帮助页面。我想以标准化JSON或XML模式的形式公开帮助页面。然而,从数据库获取R帮助信息比我想象的要困难。R帮助页面作为对象
前段时间我一起入侵获取R帮助手册页的HTML。不过,我宁愿有一个包含这些信息的普通R对象,我可以渲染为JSON/XML/HTML等。我查看了Hadley的helpr
包,但这对我的目的来说似乎有点矫枉过正。
是否有一种很好的方法可以从R对象(例如列表)的形式中从安装的包中提取R帮助页面。我想以标准化JSON或XML模式的形式公开帮助页面。然而,从数据库获取R帮助信息比我想象的要困难。R帮助页面作为对象
前段时间我一起入侵获取R帮助手册页的HTML。不过,我宁愿有一个包含这些信息的普通R对象,我可以渲染为JSON/XML/HTML等。我查看了Hadley的helpr
包,但这对我的目的来说似乎有点矫枉过正。
所以下面我砍死一起。不过,我仍然需要在很多帮助文件上测试它,看看它是否能正常工作。
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));
编辑与哈德利
的建议,您可以通过这样做更容易一点:
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] ""
一个提示:放下分号。认真地,放下它们。这是C代码,而不是R代码。在R中,除非要在一行中放入两个命令,否则不需要它们,我强烈建议您不要这样做。 – 2012-02-08 12:57:38
我喜欢他们。当我忘记右括号时,他们经常帮我调试。 – Jeroen 2012-02-08 17:34:27