Gestalt now depends on a stable release of rlang, version 1.0.0 and above. (A minor internal fix was made to address a change in the behavior of rlang::is_expression().) There are no user-facing changes.
%>>>% chain (e.g., the base-3 logarithm in abs %>>>% log(base = 3)) is now properly captured. Previously, it was erroneously matched to an rlang data mask, due to an internal call to rlang::eval_tidy() using positional arguments.%>>>% chain, a point (.) is now only matched as an argument value when it is a symbol, not a character (".") (#27).This is a maintenance release to fix test failures caused by changes in the rlang package.
The (minimum) required rlang version has been increased to 0.3.1. This version fixed a bug which prevented certain operator “sections” from being expressed. A chain like `/`(2) %>>>% sin (halve and apply sine) now works as expected.
Formals of primitive functions now agree with those of base::args() (#18, #24). This means you can use args() to determine the names of arguments when using partial(). Thus, partial(`/`, e2 = 3) is the same as partial(`/`, , 3) is the same as division-by-3. Moreover, %>>>% chains are verified against the argument names given by args(). Thus, `/`(e2 = 2) %>>>% sin is valid, but `/`(y = 2) %>>>% sin is invalid—`/`() viewed as a closure has no argument called y.
Support for R 3.1 has been dropped.
Fixed a segfault caused by leakage of rlang internals (thanks @lionel-).
names() now gets the names of bindings in a context (as made by let()).
posure() is a means of creating efficient variable (i.e., parameterized) composite functions.
In particular, this addresses a shortcoming of the use of the magrittr %>% in functions. Instead of writing
function(..., b = 2, n) {
sample(...) %>% log(base = b) %>% rep(n)
}
which is inefficient because the function chain is created anew with each call, you can more directly curry it by writing
posure(b = 2, n ~ {
sample %>>>% log(base = b) %>>>% rep(n)
})
Not only is the posure() version more succinct, it is robuster and faster than the version with %>%, thanks to the non-standard mechanism of a closure that is “partially dynamically scoped.” (Whence the portmanteau “posure,” due to @henryaj; see the package documentation for details.)
let() enables you to create contexts: composable local environments in which named expressions are lazily resolved in a given order. Tidyverse quasiquotation of expressions is supported, allowing you to exercise fine-grained control over the evaluation of subexpressions.
As a companion to let(), run() evaluates an expression relative to a context. Unlike base::with(), run() supports quasiquotation and provides a means of overriding bindings in a given context.
When calling a composite function, the point (.) in an implicitly curried function may now assume any name (#10). This is useful when you want to call the argument assumed by the point by its original name, e.g., in a do.call() or lapply() invocation.
partial() is now literally interpreted by %>>>% (#11). For instance, you you can succinctly write abs %>>>% partial(log, base = 2) instead of abs %>>>% !!partial(log, base = 2).
In a composite function, default argument values following ... are no longer absorbed by ... (#6).
Improvements to the documentation throughout.
Initial release.
fn() is extracted from nofrills 0.3.0.