@@ -175,38 +175,31 @@ ScalesList <- ggproto("ScalesList", NULL,
175
175
if (! is.null(scale $ palette )) {
176
176
next
177
177
}
178
- elem <- calc_element(paste0(
179
- " palette." , scale $ aesthetics [1 ], " ." ,
180
- if (scale $ is_discrete()) " discrete" else " continuous"
181
- ), theme )
182
-
183
- # TODO: ideally {scales} would have some sort of `as_palette()` function
184
- # String might be a name for a palette function
185
- if (is_bare_string(elem )) {
186
- elem <- get0(paste0(" pal_" , elem ), mode = " function" )
187
- if (is.function(elem )) {
188
- elem <- elem()
189
- }
190
- }
191
178
192
- if (is.atomic(elem ) && ! is.null(elem )) {
193
- if (scale $ is_discrete()) {
194
- elem <- pal_manual(elem )
195
- } else if (is.character(elem )) {
196
- elem <- pal_gradient_n(elem )
197
- } else {
198
- elem <- pal_rescale(range = rep(elem , length.out = 2 ))
199
- }
200
- }
179
+ # Resolve palette theme setting for this scale
180
+ type <- if (scale $ is_discrete()) " discrete" else " continuous"
181
+ elem <- paste0(" palette." , scale $ aesthetics [1 ], " ." , type )
182
+ elem <- calc_element(elem , theme )
201
183
184
+ # Resolve the palette itself
202
185
elem <- elem %|| % fallback_palette(scale )
203
-
204
- if (! is.function(elem )) {
186
+ palette <- switch (
187
+ type ,
188
+ discrete = as_discrete_pal(elem ),
189
+ continuous = as_continuous_pal(elem )
190
+ )
191
+ if (! is.function(palette )) {
205
192
cli :: cli_warn(
206
193
" Failed to find palette for {.field {scale$aesthetics[1]}} scale."
207
194
)
208
195
}
209
- scale $ palette <- elem
196
+
197
+ # Set palette to scale
198
+ # Note: while direct assignment is not ideal, we've already cloned the
199
+ # scale at the beginning of the plot build method, so it doesn't affect
200
+ # other plots
201
+ scale $ palette <- palette
202
+ invisible ()
210
203
}
211
204
}
212
205
)
0 commit comments