从文档中获取函数的标题

时间:2011-12-04 23:50:33

标签: r documentation

我想在我的一个脚本中获得基本函数的标题(例如:rnorm)。这包含在文档中,但我不知道如何“抓住”它。

我的意思是 RD 文件中给出的行\title{}或文档中的顶行。

有没有简单的方法可以做到这一点没有Rd_db调用tools函数并解析所有RD文件 - 因为这个简单的东西有很大的开销?其他的事情:我也试过了parse_Rd,但是:

  • 我不知道哪个 Rd 文件包含我的功能
  • 我的系统上没有 Rd 文件(只是 rdb rdx rds )。

因此解析(离线)文档的函数将是最好的:)


POC演示:

> get.title("rnorm")
[1] "The Normal Distribution"

2 个答案:

答案 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), ]
}