Version 2026.8.22
- The “Where csutil sits” section said csutil imports
magrittr. It does not, and has not since the base pipe migration. ItsImportsfield isdata.tableandggplot2.
Version 2026.8.21
- The package drops
magrittr. Every%>%is now the base pipe|>, andmagrittris gone fromDESCRIPTION. - The rewrite is a relocation, not an edit. Each
%>%call was transformed the way R’s parser transforms|>, and the resulting tree was required to match the tree parsed from the rewritten file. A file whose trees disagreed was left untouched and converted by hand instead.
Version 2026.8.20
-
.Rbuildignoreexcludes.github. The workflow directory shipped inside the tarball, andR CMD check --as-cranreported it as a hidden file for as long as the directory has existed. The shared CI workflow does not fail on a note, so the check stayed green and the note went unread. - The version is bumped because the tarball changed.
2026.8.6was already published from an earlier tree, and one version number must not name two.
Version 2026.8.6
Licensing
- The copyright holder is now Folkehelseinstituttet. It read “Core Surveillance”, which names the package family rather than a legal entity.
-
DESCRIPTIONAuthors@Rnow declares that holder withrole = "cph". It declared no copyright holder at all, and neither did any other package in the fleet. Nothing inR CMD checkreports that. - The copyright year is now 2026. It read 2023.
-
CLAUDE.mdnow carries a Licensing section, so the year gets checked rather than silently ageing.
Bug fix
The startup message printed
cstil, notcsutil. It has said so since the message was added. This is the only executable line this release changes.The
csutilvignette now opens with a get-started overview. pkgdown promotesvignettes/csutil.Rmdto “Get started”, and that page previously began at## Splittingwith no statement of what the package is for.The overview states what csutil is for, and groups all seven exports by the question they answer. It also records where csutil sits:
csdbimportscsutil, andcsutilimports no cs* package.The overview demonstrates two behaviours that surprise people, both with executed output.
apply_fn_via_hash_table()callsfnonce on the whole vector of unique values, so a scalar-onlyfnerrors.easy_split()can return fewer groups than requested:easy_split(1:4, number_of_groups = 3)returns two.No existing vignette section was changed or reordered.
-
Brought the prose in
R/,vignettes/,README.md,index.mdandNEWS.mdto the house standard: ASD-STE100 (Simplified Technical English), adapted. Split the long sentences, removed the em dashes, and capitalised the RFC-2119 keywords.- Sentences over 25 words, measured per authored unit, before and after:
-
R/: 6 to 0. -
vignettes/csutil.Rmd: 2 to 1. -
NEWS.md: 3 to 0. -
README.mdandindex.md: 0 before and after.
-
- One sentence in
vignettes/csutil.Rmdstays over the limit, in the section “Applying a function via hash table”. It saysfnruns “once per unique value”, which contradicts both the code and the same vignette’s own section “Two things that surprise people”. That sentence needs a correction, not a split, so this pass left it alone. - Settled on one term for one concept: “unique values”, not “distinct values”, in
README.mdandvignettes/csutil.Rmd. - Regenerated
man/from the edited roxygen.NAMESPACEis unchanged, and all 7 help pages remain.
- Sentences over 25 words, measured per authored unit, before and after:
No code, documented function behaviour or documented number changed in this version.
Version 2026.8.4
-
.Rbuildignorenow excludesindex.mdandRplots.pdf. The pkgdown home page body therefore no longer ships in the source tarball, and no longer raises a top-level-fileNOTE. - Expanded
README.mdwith installation, a quick start, and a table naming which function to reach for. - Every exported function now carries an
@seealsopointing at thecsutilvignette. All seven appear in a vignette code chunk. - Corrected
apply_fn_via_hash_table(): the documentation saidfnwas called once per unique value. It is called exactly once, on the whole vector of unique values, sofnmust be vectorised. - Corrected
easy_split(): the documentation promised “equally sized vectors”. Every group has the same length except the last, which may be shorter.number_of_groupsis also a request rather than a guarantee:easy_split(1:4, number_of_groups = 3)returns two groups, not three. - Corrected
unnest_dfs_within_list_of_fully_named_lists(): it returnsNULLwhenxis not a list, which the@returnsection did not say. Documented both branches and the sorted-union naming of the result. - Documented that
is_fully_named_list(list())returnsFALSE.
Version 2026.7.27
-
.Rbuildignorenow excludes the rendered pkgdown site (docs/,pkgdown/) so it is not included in the source tarball. - The four
is_*list predicates now cross-reference each other via@family list predicates. - Added a
testthat(edition 3) test suite covering all seven exported functions. The suite pins the shipped behaviour, including the deliberate asymmetry whereis_fully_named_list(list())returnsFALSEwhile the threeis_all_list_elements_null_or_*()predicates returnTRUE.
Version 2023.4.25
CRAN release: 2023-04-25
-
apply_fn_via_hash_tableextracts the unique input values. It applies the given function to those values to create a hash table of unique input/output combinations. It then matches the original input to the hash table to obtain the desired output. This can dramatically speed up computation if there is a lot of data and a limited amount of unique values. - Submitted to CRAN
Version 2022.6.8
- Submitted to CRAN
- all_list_elements_null_or_df renamed to is_all_list_elements_null_or_df
- all_list_elements_null_or_list renamed to is_all_list_elements_null_or_list
- all_list_elements_null_or_fully_named_list renamed to is_all_list_elements_null_or_fully_named_list
- split_equal renamed to easy_split
Version 2022.4.28
- split_equal (Split a vector into a list with equal sized elements)
- is_fully_named_list (Is this a fully named list?)
- all_list_elements_null_or_df (Are all elements in a list null or data.frames?)
- all_list_elements_null_or_list (Are all elements in a list null or lists?)
- all_list_elements_null_or_fully_named_list (Are all elements in a list null or fully named lists?)
- unnest_dfs_within_fully_named_list (Unnest data.frames within fully named list)
