我想在我的一个脚本中获得基本函数的标题(例如:rnorm
)。这包含在文档中,但我不知道如何“抓住”它。
我的意思是 RD 文件中给出的行\title{}
或文档中的顶行。
有没有简单的方法可以做到这一点没有从Rd_db
调用tools
函数并解析所有RD文件 - 因为这个简单的东西有很大的开销?其他的事情:我也试过了parse_Rd
,但是:
因此解析(离线)文档的函数将是最好的:)
POC演示:
> get.title("rnorm")
[1] "The Normal Distribution"
答案 0 :(得分:4)
如果查看help,
的代码,您会发现函数index.search
似乎是帮助文件的位置,并且是相关find.packages的默认值( )函数为NULL。事实证明,对于这个功能既没有帮助也没有暴露,所以我测试了它所在的常用嫌疑人(基础,工具,工具),最后得到了“utils:
utils:::index.search("+", find.package())
#[1] "/Library/Frameworks/R.framework/Resources/library/base/help/Arithmetic"
所以:
ghelp <- utils:::index.search("+", find.package())
gsub("^.+/", "", ghelp)
#[1] "Arithmetic"
ghelp <- utils:::index.search("rnorm", find.package())
gsub("^.+/", "", ghelp)
#[1] "Normal"
您要求的是\title{Title}
,但是我在这里向您展示了如何找到要解析的特定Rd文件,听起来好像您已经知道如何做到这一点。
编辑:@Hadley提供了一种获取所有帮助文本的方法,一旦知道了包名,那么将其应用于上面的index.search()值:
target <- gsub("^.+/library/(.+)/help.+$", "\\1", utils:::index.search("rnorm",
find.package()))
doc.txt <- pkg_topic(target, "rnorm") # assuming both of Hadley's functions are here
print(doc.txt[[1]][[1]][1])
#[1] "The Normal Distribution"
答案 1 :(得分:3)
您想要的并不完全明显,但下面的代码将获得与您感兴趣的主题相对应的Rd数据结构 - 然后您可以操纵它以提取您想要的任何内容。
可能有更简单的方法,但遗憾的是,很少需要的编码被导出和记录。我真的希望有一个基础help
包。
pkg_topic <- function(package, topic, file = NULL) {
# Find "file" name given topic name/alias
if (is.null(file)) {
topics <- pkg_topics_index(package)
topic_page <- subset(topics, alias == topic, select = file)$file
if(length(topic_page) < 1)
topic_page <- subset(topics, file == topic, select = file)$file
stopifnot(length(topic_page) >= 1)
file <- topic_page[1]
}
rdb_path <- file.path(system.file("help", package = package), package)
tools:::fetchRdDB(rdb_path, file)
}
pkg_topics_index <- function(package) {
help_path <- system.file("help", package = package)
file_path <- file.path(help_path, "AnIndex")
if (length(readLines(file_path, n = 1)) < 1) {
return(NULL)
}
topics <- read.table(file_path, sep = "\t",
stringsAsFactors = FALSE, comment.char = "", quote = "", header = FALSE)
names(topics) <- c("alias", "file")
topics[complete.cases(topics), ]
}