是否有一種很好的方法可以從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