Skip to content

Commit 9714224

Browse files
committed
factor out .sync_tables_on_crop
1 parent 00782e7 commit 9714224

2 files changed

Lines changed: 39 additions & 30 deletions

File tree

R/crop.R

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -253,35 +253,8 @@ setMethod("crop", "SpatialData", \(x, y, j=1, ...) {
253253
z <- .lapplyElement(z, \(.) if (length(.) > 0) .)
254254
z <- do.call("SpatialData", z)
255255
tables(z) <- tables(x)
256-
# filter tables for remaining region(s)/instance(s)
257-
rs <- unlist(colnames(z))
258-
ts <- lapply(tables(z), \(t) {
259-
# filter for remaining element(s)
260-
t <- t[, regions(t) %in% rs]
261-
region(t) <- intersect(region(t), rs)
262-
# table's regions-instances
263-
df <- data.frame(
264-
r=regions(t),
265-
i=instances(t),
266-
keep=seq_len(ncol(t)))
267-
# for each annotated element
268-
rs <- intersect(region(t), unlist(colnames(z)))
269-
is <- lapply(rs, \(r) {
270-
# subset look-up
271-
df <- df[df$r == r, ]
272-
e <- element(z, r)
273-
if (is(e, "SpatialDataShape")) {
274-
# element's regions-instances
275-
ik <- instance_key(t)
276-
i <- if (ik %in% names(e)) e[[ik]] else seq_along(e)
277-
fd <- data.frame(r, i)
278-
# return table indices in element
279-
right_join(df, fd, names(fd))$keep
280-
} else df$keep
281-
})
282-
# subset table instances
283-
t <- t[, unlist(is)]
284-
})
285-
tables(z) <- ts
256+
# filter table instances
257+
z <- .sync_tables_on_crop(z)
286258
return(z)
287259
})
260+

R/utils.R

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,42 @@
120120
return(x)
121121
}
122122

123+
#' @importFrom dplyr right_join
124+
.sync_tables_on_crop <- \(x) {
125+
# filter tables for remaining region(s)/instance(s)
126+
rs <- unlist(colnames(x))
127+
ts <- lapply(tables(x), \(t) {
128+
# filter for remaining element(s)
129+
t <- t[, regions(t) %in% rs]
130+
region(t) <- intersect(region(t), rs)
131+
# table's regions-instances
132+
df <- data.frame(
133+
r=regions(t),
134+
i=instances(t),
135+
keep=seq_len(ncol(t)))
136+
# for each annotated element
137+
rs <- intersect(region(t), unlist(colnames(x)))
138+
is <- lapply(rs, \(r) {
139+
# subset look-up
140+
e <- element(x, r)
141+
df <- df[df$r == r, ]
142+
# keep all for labels
143+
lb <- is(e, "SpatialDataLabel")
144+
if (lb) return(df$keep)
145+
# element's regions-instances
146+
ik <- instance_key(t)
147+
i <- if (ik %in% names(e)) e[[ik]] else seq_along(e)
148+
fd <- data.frame(r, i)
149+
# return table indices in element
150+
right_join(df, fd, names(fd))$keep
151+
})
152+
# subset table instances
153+
t <- t[, unlist(is)]
154+
})
155+
tables(x) <- ts
156+
return(x)
157+
}
158+
123159
# internal helper to resolve spatial (XY) axis indices
124160
.get_xy_axes <- \(x) {
125161
nm <- axes(x, "name")

0 commit comments

Comments
 (0)