- No longer check the type of the sides of the formula.
Lazyeval has a new system for lazy-eval based on formulas, described in depth in the new lazyeval vignette. This system is still a little experimental - it hasn't seen much use outside of the vignette, so it certainly may change a little in the future. However, long-term goal is to use these tools across all of my packages (ggplot2, tidyr, dplyr, etc), and I am fairly confident that this is a robust system that won't need major changes.
There are three key components:
-
f_eval()evaluates a formula in the environment where it was defined. If supplied, values are first looked for in an optionaldataargument. Pronouns.dataand.envcan be used to resolve ambiguity in this case. (#43). Longer formsf_eval_rhs()andf_eval_lhs()emphasise the side of the formula that you want to evaluate (#64). -
f_interp()provides a full quasiquoting system usinguq()for unquote anduqs()for unquote-splice (#36). -
f_capture()anddots_capture()make it easy to turn promises and...into explicit formulas. These should be used sparingly, as generally lazy-eval is preferred to non-standard eval. -
For functions that work with
...,f_list()andas_f_list()make it possible to use the evaluated LHS of a formula to name the elements of a list (#59).
The core components are accompanied by a number of helper functions:
-
Identify a formula with
is_formula(). -
Create a formula from a quoted call and an environment with
f_new(). -
"Unwrap" a formula removing one level from the stack of parent environments with
f_unwrap(). -
Get or set either side of a formula with
f_rhs()orf_lhs(), and the environment withf_env(). -
Convert to text/label with
f_text()andf_label().
I've also added expr_find(), expr_text() and expr_label() explicitly to find the expression associated with a function argument, and label it for output (#58). This is one of the primary uses cases for NSE. expr_env() is a similar helper that returns the environment associated with a promise (#67).
-
lazy_dots()gains.ignore_emptyargument to drop extra arguments (#32). -
interp.formula()only accepts single-sided formulas (#37). -
interp()accepts an environment in.values(#35). -
interp.character()always produes a single string, regardless of input length (#27). -
Fixed an infinite loop in
lazy_dots(.follow_symbols = TRUE)(#22, #24) -
lazy()now fails with an informative error when it is applied on an object that has already been evaluated (#23, @lionel-). -
lazy()no longer follows the expressions of lazily loaded objects (#18, @lionel-).
-
as.lazy_dots()gains a method for NULL, returning a zero-length list. -
auto_names()no longer truncates symbols (#19, #20)