@@ -108,22 +108,29 @@ Facet <- ggproto("Facet", NULL,
108
108
return (data )
109
109
}
110
110
111
+ # Compute faceting values
111
112
facet_vals <- eval_facets(vars , data , params $ .possible_columns )
112
113
113
114
include_margins <- ! isFALSE(params $ margin %|| % FALSE ) &&
114
115
nrow(facet_vals ) == nrow(data ) &&
115
116
all(c(" rows" , " cols" ) %in% names(params ))
116
117
if (include_margins ) {
118
+ # Margins are computed on evaluated faceting values (#1864).
117
119
facet_vals <- reshape_add_margins(
118
120
vec_cbind(facet_vals , .index = seq_len(nrow(facet_vals ))),
119
121
list (intersect(names(params $ rows ), names(facet_vals )),
120
122
intersect(names(params $ cols ), names(facet_vals ))),
121
123
params $ margins %|| % FALSE
122
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
123
128
data <- data [facet_vals $ .index , , drop = FALSE ]
124
129
facet_vals $ .index <- NULL
125
130
}
126
131
132
+ # If any faceting variables are missing, add them in by
133
+ # duplicating the data
127
134
missing_facets <- setdiff(names(vars ), names(facet_vals ))
128
135
if (length(missing_facets ) > 0 ) {
129
136
@@ -140,6 +147,7 @@ Facet <- ggproto("Facet", NULL,
140
147
}
141
148
142
149
if (nrow(facet_vals ) < 1 ) {
150
+ # Add PANEL variable
143
151
data $ PANEL <- NO_PANEL
144
152
return (data )
145
153
}
@@ -148,6 +156,7 @@ Facet <- ggproto("Facet", NULL,
148
156
facet_vals [] <- lapply(facet_vals , addNA , ifany = TRUE )
149
157
layout [] <- lapply(layout , as_unordered_factor )
150
158
159
+ # Add PANEL variable
151
160
keys <- join_keys(facet_vals , layout , by = names(vars ))
152
161
data $ PANEL <- layout $ PANEL [match(keys $ x , keys $ y )]
153
162
data
0 commit comments