@@ -88,95 +88,7 @@ Facet <- ggproto("Facet", NULL,
8888 cli :: cli_abort(" Not implemented." )
8989 },
9090 map_data = function (data , layout , params ) {
91-
92- if (empty(data )) {
93- return (vec_cbind(data %| W | % NULL , PANEL = integer(0 )))
94- }
95-
96- vars <- params $ facet %|| % c(params $ rows , params $ cols )
97-
98- if (length(vars ) == 0 ) {
99- data $ PANEL <- layout $ PANEL
100- return (data )
101- }
102-
103- grid_layout <- all(c(" rows" , " cols" ) %in% names(params ))
104- layer_layout <- attr(data , " layout" )
105- if (identical(layer_layout , " fixed" )) {
106- n <- vec_size(data )
107- data <- vec_rep(data , vec_size(layout ))
108- data $ PANEL <- vec_rep_each(layout $ PANEL , n )
109- return (data )
110- }
111-
112- # Compute faceting values
113- facet_vals <- eval_facets(vars , data , params $ .possible_columns )
114-
115- include_margins <- ! isFALSE(params $ margin %|| % FALSE ) &&
116- nrow(facet_vals ) == nrow(data ) && grid_layout
117- if (include_margins ) {
118- # Margins are computed on evaluated faceting values (#1864).
119- facet_vals <- reshape_add_margins(
120- vec_cbind(facet_vals , .index = seq_len(nrow(facet_vals ))),
121- list (intersect(names(params $ rows ), names(facet_vals )),
122- intersect(names(params $ cols ), names(facet_vals ))),
123- params $ margins %|| % FALSE
124- )
125- # Apply recycling on original data to fit margins
126- # We're using base subsetting here because `data` might have a superclass
127- # that isn't handled well by vctrs::vec_slice
128- data <- data [facet_vals $ .index , , drop = FALSE ]
129- facet_vals $ .index <- NULL
130- }
131-
132- # If we need to fix rows or columns, we make the corresponding faceting
133- # variables missing on purpose
134- if (grid_layout ) {
135- if (identical(layer_layout , " fixed_rows" )) {
136- facet_vals <- facet_vals [setdiff(names(facet_vals ), names(params $ cols ))]
137- }
138- if (identical(layer_layout , " fixed_cols" )) {
139- facet_vals <- facet_vals [setdiff(names(facet_vals ), names(params $ rows ))]
140- }
141- }
142-
143- # If any faceting variables are missing, add them in by
144- # duplicating the data
145- missing_facets <- setdiff(names(vars ), names(facet_vals ))
146- if (length(missing_facets ) > 0 ) {
147-
148- to_add <- unique0(layout [missing_facets ])
149-
150- data_rep <- rep.int(seq_len(nrow(data )), nrow(to_add ))
151- facet_rep <- rep(seq_len(nrow(to_add )), each = nrow(data ))
152-
153- data <- unrowname(data [data_rep , , drop = FALSE ])
154- facet_vals <- unrowname(vec_cbind(
155- unrowname(facet_vals [data_rep , , drop = FALSE ]),
156- unrowname(to_add [facet_rep , , drop = FALSE ])
157- ))
158- }
159-
160- if (nrow(facet_vals ) < 1 ) {
161- # Add PANEL variable
162- data $ PANEL <- NO_PANEL
163- return (data )
164- }
165-
166- facet_vals [] <- lapply(facet_vals , as_unordered_factor )
167- facet_vals [] <- lapply(facet_vals , addNA , ifany = TRUE )
168- layout [] <- lapply(layout , as_unordered_factor )
169-
170- # Add PANEL variable
171- keys <- join_keys(facet_vals , layout , by = names(vars ))
172- data $ PANEL <- layout $ PANEL [match(keys $ x , keys $ y )]
173-
174- # Filter panels when layer_layout is an integer
175- if (is_integerish(layer_layout )) {
176- data <- vec_slice(data , data $ PANEL %in% layer_layout )
177- }
178-
179- data
91+ cli :: cli_abort(" Not implemented." )
18092 },
18193 init_scales = function (layout , x_scale = NULL , y_scale = NULL , params ) {
18294 scales <- list ()
@@ -960,3 +872,95 @@ censor_labels <- function(ranges, layout, labels) {
960872 }
961873 ranges
962874}
875+
876+ map_facet_data <- function (data , layout , params ) {
877+
878+ if (empty(data )) {
879+ return (vec_cbind(data %| W | % NULL , PANEL = integer(0 )))
880+ }
881+
882+ vars <- params $ facet %|| % c(params $ rows , params $ cols )
883+
884+ if (length(vars ) == 0 ) {
885+ data $ PANEL <- layout $ PANEL
886+ return (data )
887+ }
888+
889+ grid_layout <- all(c(" rows" , " cols" ) %in% names(params ))
890+ layer_layout <- attr(data , " layout" )
891+ if (identical(layer_layout , " fixed" )) {
892+ n <- vec_size(data )
893+ data <- vec_rep(data , vec_size(layout ))
894+ data $ PANEL <- vec_rep_each(layout $ PANEL , n )
895+ return (data )
896+ }
897+
898+ # Compute faceting values
899+ facet_vals <- eval_facets(vars , data , params $ .possible_columns )
900+
901+ include_margins <- ! isFALSE(params $ margin %|| % FALSE ) &&
902+ nrow(facet_vals ) == nrow(data ) && grid_layout
903+ if (include_margins ) {
904+ # Margins are computed on evaluated faceting values (#1864).
905+ facet_vals <- reshape_add_margins(
906+ vec_cbind(facet_vals , .index = seq_len(nrow(facet_vals ))),
907+ list (intersect(names(params $ rows ), names(facet_vals )),
908+ intersect(names(params $ cols ), names(facet_vals ))),
909+ params $ margins %|| % FALSE
910+ )
911+ # Apply recycling on original data to fit margins
912+ # We're using base subsetting here because `data` might have a superclass
913+ # that isn't handled well by vctrs::vec_slice
914+ data <- data [facet_vals $ .index , , drop = FALSE ]
915+ facet_vals $ .index <- NULL
916+ }
917+
918+ # If we need to fix rows or columns, we make the corresponding faceting
919+ # variables missing on purpose
920+ if (grid_layout ) {
921+ if (identical(layer_layout , " fixed_rows" )) {
922+ facet_vals <- facet_vals [setdiff(names(facet_vals ), names(params $ cols ))]
923+ }
924+ if (identical(layer_layout , " fixed_cols" )) {
925+ facet_vals <- facet_vals [setdiff(names(facet_vals ), names(params $ rows ))]
926+ }
927+ }
928+
929+ # If any faceting variables are missing, add them in by
930+ # duplicating the data
931+ missing_facets <- setdiff(names(vars ), names(facet_vals ))
932+ if (length(missing_facets ) > 0 ) {
933+
934+ to_add <- unique0(layout [missing_facets ])
935+
936+ data_rep <- rep.int(seq_len(nrow(data )), nrow(to_add ))
937+ facet_rep <- rep(seq_len(nrow(to_add )), each = nrow(data ))
938+
939+ data <- unrowname(data [data_rep , , drop = FALSE ])
940+ facet_vals <- unrowname(vec_cbind(
941+ unrowname(facet_vals [data_rep , , drop = FALSE ]),
942+ unrowname(to_add [facet_rep , , drop = FALSE ])
943+ ))
944+ }
945+
946+ if (nrow(facet_vals ) < 1 ) {
947+ # Add PANEL variable
948+ data $ PANEL <- NO_PANEL
949+ return (data )
950+ }
951+
952+ facet_vals [] <- lapply(facet_vals , as_unordered_factor )
953+ facet_vals [] <- lapply(facet_vals , addNA , ifany = TRUE )
954+ layout [] <- lapply(layout , as_unordered_factor )
955+
956+ # Add PANEL variable
957+ keys <- join_keys(facet_vals , layout , by = names(vars ))
958+ data $ PANEL <- layout $ PANEL [match(keys $ x , keys $ y )]
959+
960+ # Filter panels when layer_layout is an integer
961+ if (is_integerish(layer_layout )) {
962+ data <- vec_slice(data , data $ PANEL %in% layer_layout )
963+ }
964+
965+ data
966+ }
0 commit comments