有没有一种好方法可以从已安装的软件包中提取R-help页面,以R对象的形式(例如列表)。我想将帮助页面暴露为标准化的JSON或XML模式。然而,从数据库中获取R-help信息比我想象的要困难得多。
我曾经破解过获取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);
}
然后你可以像这样做:
myhelp <- getHelpList("qplot", package="ggplot2");
cat(jsonlite::toJSON(myhelp));
在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] ""
match.call
和随后的调用操作。我认为只与字符串一起工作要好得多。 - hadleygetHTMLHelp <- function(topic, ...) thefile <- help(...)
。使用 match.call
只会让函数变得更加复杂,而没有任何好处。 - hadley