2017-08-25 1 views
4

J'ai un site pkgdown dans lequel je regroupe un certain nombre de fonctions dans les catégories dans le fichier de référence .yml. Je me demande s'il existe un moyen de classer toutes les fonctions que je n'ai pas catégorisées explicitement dans leur propre catégorie. La seule pensée que je devais était d'utiliser la fonction matches comme ceci:Inclure "Toutes les autres fonctions" dans une référence pkgdown yaml

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

Mais cela met myFunction dans la « someCategory » et « autres » catégories. Ce que je voudrais faire est de faire correspondre toutes les fonctions qui ne sont pas dans une catégorie.

Merci!

Répondre

1

Si vous ne me dérange pas en cours d'exécution d'une fonction pour mettre à jour votre YAML, l'exécution de ce à partir de la racine de votre colis devrait fonctionner (utilisation « Écraser = FALSE » pour le test: il va créer un _pkgdown_new. fichier 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) 

Création la section "Autres"
Ajout er_crop_objecter_getbandser_pointser_polygons reproj_rastsetClasses``setinfo_rastsprawl_scalebar à _pkgdown.yaml

La fonction broute le fichier .yaml actuel et trouve les fonctions actuellement manquantes. S'il en existe, ils sont ajoutés à la section "Autres" du fichier .yaml (qui est automatiquement créé s'il n'est pas déjà présent). J'ai fait un test rapide et il semble fonctionner correctement.

HTH!

0

Je ne suis pas familier avec pkgdown, mais pour un cas limité comme cela, il pourrait être possible d'utiliser matches avec regex pour ne correspond à aucune de ces

négations Regex ne sont pas efficaces, et vous vous devez retaper les noms de vos fonctions catégorisées, donc cela pourrait fonctionner dans votre cas limité mais ce n'est pas une bonne pratique.

Un truc pareil devrait-il fonctionner? (test here)

- title: "other" 
    contents: 
    - matches('^(?!.*(myFunction|myOtherFunction|yetAnotherFunction)).*$') 
+0

Pour un peu Tricker et cas d'utilisation moins efficace, voir [regex pour chaîne ne contenant ** ** plusieurs mots spécifiques] (https://stackoverflow.com/questions/7801581/regex-for-string- pas-contenant-multiple-specific-words) – C8H10N4O2

+0

C'est une bonne idée, mais je ne pense pas que ce soit faisable pour beaucoup de fonctions (disons que vous aviez une centaine de fonctions dans le paquet. quelqu'un ajoute une nouvelle fonction mais oublie de mettre à jour le 'yml' – Shorpy

2

Dans pkgdown, il existe déjà une fonctionnalité pour vous avertir des sujets qui manquent dans votre fichier yaml. Vous pouvez voir le code en tapant pkgdown:::data_reference_index. Donc, en gros, si vous modifiez un peu ce code, vous pouvez retourner les noms des fonctions manquantes dans l'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] 
}