Получить название функции из документации - PullRequest
3 голосов
/ 05 декабря 2011

Я хотел бы получить название базовой функции (например, rnorm) в одном из моих сценариев. Это включено в документацию, но я понятия не имею, как его «схватить».

Я имею в виду строку, указанную в файлах RD как \title{} или верхнюю строку в документации.

Есть ли какой-нибудь простой способ сделать это без вызова Rd_db функции из tools и проанализировать все файлы RD - как с очень большими издержками для этой простой вещи? Другое дело: я тоже пробовал с parse_Rd, но:

  • Я не знаю, какой Rd файл содержит мою функцию,
  • В моей системе нет файлов Rd (только rdb , rdx и rds ).

Так что лучше всего подойдет функция для анализа (автономной) документации:)


POC demo:

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

Ответы [ 2 ]

4 голосов
/ 05 декабря 2011

Если вы посмотрите на код для help,, вы увидите, что функция index.search выглядит так, как будто она определяет местоположение файлов справки, и что для связанной функции find.packages () по умолчанию установлено значение NULL.,Оказывается, что эта функция не является ни справкой, ни уязвимостью, поэтому я проверил обычных подозреваемых, для какого пакета она была (base, tools, utils), и получил «utils:

utils:::index.search("+", find.package())
#[1] "/Library/Frameworks/R.framework/Resources/library/base/help/Arithmetic"
* 1005»* Итак:
 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"
3 голосов
/ 05 декабря 2011

Не совсем очевидно, что вы хотите, но приведенный ниже код получит структуру данных 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), ]
}
...