Включите "Все другие функции" в справочный файл ykl

У меня есть pkgdown сайт, в котором я группирую ряд функций по категориям в ссылке .yml файл. Мне интересно, есть ли способ поместить все функции, которые я явно не классифицировал, в их собственную категорию. Единственная мысль, которую я имел, состояла в том, чтобы использовать matches функционировать так:

reference:
- title: "someCategory"
  contents:
  - myFunction
- title: "other"
  contents:
  - matches(".*")

Но это ставит myFunction в категориях "someCategory" и "other". То, что я хотел бы сделать, это сопоставить все функции, которые не входят в категорию.

Спасибо!

3 ответа

Решение

Если вы не возражаете против запуска функции для обновления вашего yaml, запуск этого из корня вашего пакета должен работать (используйте "overwrite = FALSE" для тестирования: он создаст файл _pkgdown_new.yaml.):

update_yaml <- function(mypkg, overwrite = FALSE) {
  require(yaml)
  #   _____________________________________________________________________
  #   Find currently missing functions in yaml file                    ####
  curr_yaml     <- yaml.load_file("_pkgdown.yaml")
  curr_yaml_ref <- curr_yaml[["reference"]]
  curr_funcs <- unlist(lapply(curr_yaml_ref,
                              FUN = function(x) (x$contents))) %>%
    gsub('`', "", .)
  all_pkgfuncs <- ls(paste0("package:", mypkg))
  miss_funcs   <- setdiff(pkg_funcs, curr_funcs)

  if (length(miss_funcs) == 0) {
    message("All functions are already in _pkgdown.yaml")
  } else {

    #   _________________________________________________________________
    #   Look if an "Other" section already exists                     ####

    titles     <- unlist(lapply(curr_yaml_ref, FUN = function(x) (x$title)))
    other_sect <- which(titles == "Other")

    if (!length(other_sect) == 0) {
      #   _________________________________________________________________
      #   If the "Other" sect already exists, append missing functions ####

      message(strwrap(paste(
        "Adding ", paste0("`", miss_funcs, "` ", collapse = ""),
        "to _pkgdown.yaml")))
      curr_yaml_ref[[other_sect]] = list(
        title = "Other",
        desc  = "Other Functions",
        contents = c(curr_yaml_ref[[other_sect]]$contents,
                     paste0("`", miss_funcs, "`"))
      )

    } else {

      #   _____________________________________________________________
      #   Otherwise, create the "other" section and add            ####

      message("Creating the \"Others\" section")
      message(strwrap(paste(
        "Adding ", paste0("`", miss_funcs, "` ", collapse = ""),
        "to _pkgdown.yaml")))
      curr_yaml_ref[[length(curr_yaml_ref) + 1]] = list(
        title = "Other",
        desc  = "Other Functions",
        contents = paste0("`", miss_funcs, "`"))
    }
    curr_yaml[["reference"]] <- curr_yaml_ref
    if (overwrite) {
      write(as.yaml(curr_yaml), "_pkgdown.yaml")
    } else {
      write(as.yaml(curr_yaml), "_pkgdown_new.yaml")
    }
  }
}

> update_yaml("sprawl", overwrite = F)

Создание раздела "Другие"
Добавление er_crop_objecter_getbandser_pointser_polygonsreproj_rastsetClasses``setinfo_rastsprawl_scalebar в _pkgdown.yaml

Функция просматривает текущий файл.yaml и находит отсутствующие в данный момент функции. Если они найдены, они добавляются в раздел "Другие".yaml (который создается автоматически, если его еще нет).

Я сделал быстрый тест, и, кажется, работает правильно.

HTH!

В pkgdown уже есть функция, которая предупреждает вас о темах, которые отсутствуют в вашем файле yaml. Вы можете увидеть код, набрав pkgdown:::data_reference_index,

Таким образом, если вы просто немного измените этот код, вы можете вернуть имена функций, отсутствующих в индексе.

library(purrr)
data_reference_index_missing <- function(pkg = ".", depth = 1L) {
  pkg <- pkgdown:::as_pkgdown(pkg)

  meta <- pkg$meta[["reference"]] %||% default_reference_index(pkg)
  if (length(meta) == 0) {
    return(list())
  }

  # Cross-reference complete list of topics vs. topics found in index page
  all_topics <- meta %>%
    map(~ pkgdown:::select_topics(.$contents, pkg$topics)) %>%
    reduce(union)
  in_index <- seq_along(pkg$topics$name) %in% all_topics

  missing <- !in_index & !pkg$topics$internal
  pkg$topics$name[missing]
}

Я не знаком с pkgdown, но для ограниченного случая, как это может быть целесообразно использовать matches с регулярным выражением для не равен ни одному из этих

Отрицания в регулярных выражениях неэффективны, и вам придется перепечатывать имена ваших категоризированных функций, так что, опять же, это может сработать в вашем ограниченном случае, но это не лучшая практика.

Будет ли что-то вроде этой работы? ( тест здесь)

- title: "other"
  contents:
  - matches('^(?!.*(myFunction|myOtherFunction|yetAnotherFunction)).*$')
Другие вопросы по тегам