Allow expressions in facet specs even when some variables are not available on some layers #3757
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
(Cherry-picked version of #3735 for v3.3.0-rc branch)
Fix #2963
Background
Not all variables in a facet spec are available on all the layers. A solution suggested on r-lib/rlang#888 (comment) is:
Main change
This PR injects such an active bindings on the column names of all the plot data so that we can let
eval_facet()
fail gracefully.eval_facet()
evaluates facet specs in these two steps:NULL
. In this case, no error happens even if the symbol is not available on all the layers.This PR changes only step 2, so I expect this doesn't affect most of the existing code. Note that, while step 2 can also handle symbols, we still need step 1 to issue a friendly error ("At least one layer must contain all faceting variables") when no layer contain the variable.
Created on 2020-01-23 by the reprex package (v0.3.0)
Minor change
env
argument ofeval_facet()
. This is not necessary, but done in order to avoid confusion. I believe all facet specs are converted to quosures and bare expressions are not allowed, which meansenv
is always ignored oneval_tidy()
.