Включите "Все другие функции" в справочный файл 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_object
er_getbands
er_points
er_polygons
reproj_rast
setClasses``setinfo_rast
sprawl_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)).*$')