7
7
# ' @export
8
8
# ' @param layer Character string naming the ggplot2 layer function (e.g., 'geom_point')
9
9
# ' @param presets List of preset configurations
10
- # ' @param preset_default Character string naming the default preset
11
10
# ' @param value The value of the layer entity
12
11
# ' @param ... Additional parameters passed to entity constructor
13
12
# ' @return A layer_entity object
19
18
# ' default = list(color = 'red'),
20
19
# ' blue = list(color = 'blue')
21
20
# ' ),
22
- # ' preset_default = 'default',
23
21
# ' value = preset('default')
24
22
# ' )
25
23
# ' @rdname layer_entity
26
24
# ' @include entity_class.R struct_preset_class.R
27
- layer_entity = function (layer = ' geom_point' , presets = list (), preset_default = ' default ' , value = preset(' default' ), ... ) {
28
-
25
+ layer_entity = function (layer = ' geom_point' , presets = list (), value = preset(' default' ), ... ) {
26
+
29
27
# If value is a character string, convert it to a preset
30
28
if (is.character(value ) && length(value ) == 1 ) {
31
29
value = preset(value )
32
30
}
33
-
31
+
34
32
# NEW: If value is a direct ggplot2 layer object, create a custom preset
35
33
if (is(value , ' Layer' ) || is(value , ' theme' ) || is(value , ' Scale' ) || is(value , ' Facet' )) {
36
34
# Create a custom preset with the provided layer
37
35
custom_presets = list (custom = value )
38
36
presets = c(presets , custom_presets )
39
37
# Set the value to use the custom preset
40
38
value = preset(' custom' )
41
- # Update preset_default to use custom if no default specified
42
- if (preset_default == ' default' && ! ' default' %in% names(presets )) {
43
- preset_default = ' custom'
44
- }
45
39
}
46
-
40
+
47
41
# new object
48
42
out = .layer_entity(
49
43
layer = layer ,
50
44
presets = presets ,
51
- preset_default = preset_default ,
52
45
value = value ,
53
46
...
54
47
)
@@ -60,8 +53,7 @@ layer_entity = function(layer = 'geom_point', presets = list(), preset_default =
60
53
contains = ' entity' ,
61
54
slots = c(
62
55
layer = ' character' ,
63
- presets = ' list' ,
64
- preset_default = ' character'
56
+ presets = ' list'
65
57
),
66
58
prototype = list (
67
59
name = ' ggplot2 layer' ,
@@ -70,15 +62,9 @@ layer_entity = function(layer = 'geom_point', presets = list(), preset_default =
70
62
value = list (),
71
63
layer = ' geom_point' ,
72
64
presets = list (),
73
- preset_default = ' default' ,
74
65
.params = ' layer'
75
66
),
76
67
validity = function (object ) {
77
- # Check that preset_default exists in presets
78
- if (length(object @ preset_default ) > 0 &&
79
- ! object @ preset_default %in% c(names(object @ presets ), ' default' )) {
80
- return (" preset_default must be 'default' or a name in presets" )
81
- }
82
68
return (TRUE )
83
69
}
84
70
)
@@ -90,12 +76,12 @@ setGeneric("register_preset<-", function(obj, preset_name, value, force = TRUE)
90
76
setMethod(f = ' register_preset<-' ,
91
77
signature = c(' layer_entity' ,' character' ,' list' ),
92
78
definition = function (obj , preset_name , value , force = TRUE ) {
93
-
79
+
94
80
check = preset_name %in% c(names(obj @ presets ), ' default' )
95
81
if (check && ! force ) {
96
82
stop(' This preset already exists. To replace it use "force = TRUE".' )
97
83
}
98
-
84
+
99
85
obj @ presets [[preset_name ]] = value
100
86
return (obj )
101
87
}
@@ -117,12 +103,12 @@ setMethod(f = 'available_presets',
117
103
setMethod(f = " value<-" ,
118
104
signature = c(" layer_entity" ),
119
105
definition = function (obj , value ) {
120
-
106
+
121
107
# If value is a character string, convert it to a preset
122
108
if (is.character(value ) && length(value ) == 1 ) {
123
109
value = preset(value )
124
110
}
125
-
111
+
126
112
# If value is a direct ggplot2 layer object, create a custom preset
127
113
if (is(value , ' Layer' ) || is(value , ' theme' ) || is(value , ' Scale' ) || is(value , ' Facet' )) {
128
114
# Create a custom preset with the provided layer
@@ -131,25 +117,24 @@ setMethod(f = "value<-",
131
117
# Set the value to use the custom preset
132
118
value = preset(' custom' )
133
119
}
134
-
120
+
135
121
if (is(value , ' struct_preset' )) {
136
122
# check for valid preset (local only)
137
- local_check = value $ preset %in% c(names(obj @ presets ), ' default ' )
138
-
123
+ local_check = value $ preset %in% c(names(obj @ presets ))
124
+
139
125
if (! local_check ) {
140
126
available_local = names(obj @ presets )
141
- stop(' "' , value $ preset , ' " is not a valid preset for layer_entity "' ,
142
- obj @ layer , ' ". Choose one of: ' , paste(available_local , collapse = ' , ' ),
143
- ' . The default is "' , obj @ preset_default , ' "' )
127
+ stop(' "' , value $ preset , ' " is not a valid preset for layer_entity "' ,
128
+ obj @ layer , ' ". Choose one of: ' , paste(available_local , collapse = ' , ' ))
144
129
}
145
130
}
146
-
131
+
147
132
# standardise names
148
133
if (is.list(value )) {
149
134
names(value ) = ggplot2 :: standardise_aes_names(names(value ))
150
135
}
151
136
obj = callNextMethod(obj , value )
152
-
137
+
153
138
return (obj )
154
139
}
155
140
)
@@ -159,29 +144,28 @@ setMethod(f = "value<-",
159
144
setMethod(f = " $<-" ,
160
145
signature = c(" layer_entity" ),
161
146
definition = function (x , name , value ) {
162
-
147
+
163
148
# If value is a ggplot2 layer object, store it directly
164
149
if (is(value , ' Layer' ) || is(value , ' theme' ) || is(value , ' Scale' ) || is(value , ' Facet' )) {
165
150
name = ggplot2 :: standardise_aes_names(name )
166
151
x [[name ]] = value
167
152
return (x )
168
153
}
169
-
154
+
170
155
if (is(value , ' struct_preset' )) {
171
156
# check for valid preset (local only)
172
- local_check = value $ preset %in% c(names(x @ presets ), ' default ' )
173
-
157
+ local_check = value $ preset %in% c(names(x @ presets ))
158
+
174
159
if (! local_check ) {
175
160
available_local = names(x @ presets )
176
- stop(' "' , value $ preset , ' " is not a valid preset for layer_entity "' ,
177
- name , ' ". Choose one of: ' , paste(available_local , collapse = ' , ' ),
178
- ' . The default is "' , x @ preset_default , ' "' )
161
+ stop(' "' , value $ preset , ' " is not a valid preset for layer_entity "' ,
162
+ name , ' ". Choose one of: ' , paste(available_local , collapse = ' , ' ))
179
163
}
180
164
}
181
-
165
+
182
166
name = ggplot2 :: standardise_aes_names(name )
183
167
x [[name ]] = value
184
-
168
+
185
169
return (x )
186
170
}
187
171
)
@@ -193,7 +177,6 @@ setMethod(f = 'show',
193
177
definition = function (object ) {
194
178
callNextMethod() # force the default output
195
179
cat(' layer: ' , object @ layer , ' \n ' , sep = ' ' )
196
- cat(' preset default:' , object @ preset_default , ' \n ' , sep = ' ' )
197
180
cat(' available presets:' , paste(names(object @ presets ), collapse = ' , ' ), ' \n ' , sep = ' ' )
198
181
}
199
182
)
@@ -205,29 +188,25 @@ setGeneric("as_layer", function(obj, ...) standardGeneric("as_layer"))
205
188
setMethod (f = 'as_layer ',
206
189
signature = c(' layer_entity' ),
207
190
definition = function (obj ) {
208
-
191
+
209
192
# If the value is already a ggplot2 layer object, return it directly
210
193
if (is(obj @ value , ' Layer' ) || is(obj @ value , ' theme' ) || is(obj @ value , ' Scale' ) || is(obj @ value , ' Facet' )) {
211
194
return (obj @ value )
212
195
}
213
-
196
+
214
197
# If value is NULL, return NULL
215
198
if (is.null(obj @ value )) {
216
199
return (NULL )
217
200
}
218
-
201
+
219
202
# get preset
220
203
check = any(names(obj @ value ) == " preset" )
221
204
if (check ) {
222
- # substitute default
223
- if (obj @ value $ preset == ' default' ) {
224
- obj @ value $ preset = obj @ preset_default
225
- }
226
205
# get preset
227
206
P = get_preset(obj , obj @ value $ preset )
228
207
# remove preset label
229
208
obj @ value $ preset = NULL
230
-
209
+
231
210
if (! is.null(P )) {
232
211
# If P is already a ggplot2 layer object, return it directly
233
212
if (is(P , ' Layer' ) || is(P , ' theme' ) || is(P , ' Scale' ) || is(P , ' Facet' )) {
@@ -239,16 +218,16 @@ setMethod(f = 'as_layer',
239
218
obj @ value = NULL
240
219
}
241
220
}
242
-
221
+
243
222
# return NULL if specified; this layer not to be plotted
244
223
if (is.null(obj @ value )) {
245
224
return (NULL )
246
225
}
247
-
226
+
248
227
if (length(obj @ value ) > 0 ) {
249
-
228
+
250
229
L = obj @ value
251
-
230
+
252
231
# get mappings
253
232
z = which(unlist(lapply(L , is , class2 = ' uneval' )))
254
233
# join all mappings
@@ -279,19 +258,18 @@ setMethod(f = "value",
279
258
setMethod (f = "get_preset ",
280
259
signature = c(' layer_entity' ,' character' ,' missing' ),
281
260
definition = function (obj , preset_name , slot_name ) {
282
-
261
+
283
262
# Check local presets only
284
- check = preset_name %in% c(names(obj @ presets ), ' default ' )
263
+ check = preset_name %in% c(names(obj @ presets ))
285
264
if (check ) {
286
265
return (obj @ presets [[preset_name ]])
287
266
}
288
-
267
+
289
268
# If we get here, the preset doesn't exist
290
269
available_local = names(obj @ presets )
291
-
292
- stop(' "' , preset_name , ' " is not a valid preset for layer_entity "' ,
293
- obj @ layer , ' ". Choose one of: ' , paste(available_local , collapse = ' , ' ),
294
- ' . The default is "' , obj @ preset_default , ' "' )
270
+
271
+ stop(' "' , preset_name , ' " is not a valid preset for layer_entity "' ,
272
+ obj @ layer , ' ". Choose one of: ' , paste(available_local , collapse = ' , ' ))
295
273
}
296
274
)
297
275
@@ -300,4 +278,4 @@ setMethod(f = "get_preset",
300
278
# This is a simplified version - in practice, this would properly merge ggplot2 aesthetics
301
279
# For now, just return the first argument
302
280
return (a )
303
- }
281
+ }
0 commit comments