【问题标题】:Get function's title from documentation从文档中获取函数的标题
【发布时间】:2012-01-12 20:30:15
【问题描述】:

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

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

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

  • 我不知道哪个 Rd 文件保存了我的函数,
  • 我的系统上没有 Rd 文件(只有 rdbrdxrds)。李>

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


POC 演示:

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

【问题讨论】:

  • fgui:::parseHelp("rnorm") 应该这样做,但它似乎已经过时了。浏览它的源代码并修改它以使用最新版本的工具包和 R 或联系作者,看看他们是否已经这样做了。
  • 感谢@G.Grothendieck 指出我对该功能的关注,我尝试将其更新为适用于当前的 R 系统,但 DWin 更快:)

标签: r documentation


【解决方案1】:

如果您查看 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"

【讨论】:

  • 除了那些不是真正的文件——它们实际上是一些不透明的指针,指向存储在 r 对象数据库中的对象。
  • @hadley :您采取了进一步的步骤,但我们还需要提取包名称,然后如上图所示从 pkg_topic 值中提取第一行以完成任务。
  • 我以为他知道这个包:base。无论如何,这个问题令人困惑。很难知道实际需要什么。
  • 你也不能真的假设标题总是在那个位置。但我发现我可以使用 index.search。很好的发现!
  • 感谢@DWin 提供更新的答案,正是我想要的!
【解决方案2】:

您想要什么并不完全清楚,但下面的代码将获得与您感兴趣的主题相对应的 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), ]
}

【讨论】:

  • 也感谢@hadley 提供了这套漂亮的代码,并帮助我们得到了一个很好的答案。
猜你喜欢
  • 2014-02-23
  • 2010-09-21
  • 2011-06-17
  • 2010-10-17
  • 2016-12-12
  • 2023-03-20
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多