@@ -88,95 +88,7 @@ Facet <- ggproto("Facet", NULL,
88
88
cli :: cli_abort(" Not implemented." )
89
89
},
90
90
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." )
180
92
},
181
93
init_scales = function (layout , x_scale = NULL , y_scale = NULL , params ) {
182
94
scales <- list ()
@@ -960,3 +872,95 @@ censor_labels <- function(ranges, layout, labels) {
960
872
}
961
873
ranges
962
874
}
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