magrittr. It does not,
and has not since the base pipe migration. Its Imports field is data.table
and ggplot2.magrittr. Every %>% is now the base pipe |>, and
magrittr is gone from DESCRIPTION.%>% 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..Rbuildignore excludes .github. The workflow directory shipped inside the
tarball, and R CMD check --as-cran reported 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.2026.8.6 was already
published from an earlier tree, and one version number must not name two.DESCRIPTION Authors@R now declares that holder with role = "cph".
It declared no copyright holder at all, and neither did any other package
in the fleet. Nothing in R CMD check reports that.CLAUDE.md now carries a Licensing section, so the year gets checked
rather than silently ageing.The startup message printed cstil, not csutil. It has said so since the
message was added. This is the only executable line this release changes.
The csutil vignette now opens with a get-started overview. pkgdown promotes vignettes/csutil.Rmd to "Get started", and that page previously began at ## Splitting with 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: csdb imports csutil, and csutil imports no cs* package.
The overview demonstrates two behaviours that surprise people, both with executed output. apply_fn_via_hash_table() calls fn once on the whole vector of unique values, so a scalar-only fn errors. 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.md and NEWS.md to the house standard: ASD-STE100 (Simplified Technical English), adapted. Split the long sentences, removed the em dashes, and capitalised the RFC-2119 keywords.
R/: 6 to 0.vignettes/csutil.Rmd: 2 to 1.NEWS.md: 3 to 0.README.md and index.md: 0 before and after.vignettes/csutil.Rmd stays over the limit, in the section "Applying a function via hash table". It says fn runs "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.README.md and vignettes/csutil.Rmd.man/ from the edited roxygen. NAMESPACE is unchanged, and all 7 help pages remain.No code, documented function behaviour or documented number changed in this version.
.Rbuildignore now excludes index.md and Rplots.pdf. The pkgdown home page body therefore no longer ships in the source tarball, and no longer raises a top-level-file NOTE.README.md with installation, a quick start, and a table naming which function to reach for.@seealso pointing at the csutil vignette. All seven appear in a vignette code chunk.apply_fn_via_hash_table(): the documentation said fn was called once per unique value. It is called exactly once, on the whole vector of unique values, so fn must be vectorised.easy_split(): the documentation promised "equally sized vectors". Every group has the same length except the last, which may be shorter. number_of_groups is also a request rather than a guarantee: easy_split(1:4, number_of_groups = 3) returns two groups, not three.unnest_dfs_within_list_of_fully_named_lists(): it returns NULL when x is not a list, which the @return section did not say. Documented both branches and the sorted-union naming of the result.is_fully_named_list(list()) returns FALSE..Rbuildignore now excludes the rendered pkgdown site (docs/, pkgdown/) so it is not included in the source tarball.is_* list predicates now cross-reference each other via @family list predicates.testthat (edition 3) test suite covering all seven exported functions. The suite pins the shipped behaviour, including the deliberate asymmetry where is_fully_named_list(list()) returns FALSE while the three is_all_list_elements_null_or_*() predicates return TRUE.apply_fn_via_hash_table extracts 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.