|
63 | 63 |
|
64 | 64 | # new ---- |
65 | 65 |
|
| 66 | +.new_sda <- \(type, data=list(), meta=SpatialDataAttrs(), metadata=list(), ...) { |
| 67 | + if (is.array(data)) data <- list(data) |
| 68 | + x <- new(type, data=data, meta=meta, ...) |
| 69 | + metadata(x) <- metadata |
| 70 | + return(x) |
| 71 | +} |
| 72 | + |
| 73 | +SpatialDataImage <- \(...) .new_sda("SpatialDataImage", ...) |
| 74 | +SpatialDataLabel <- \(...) .new_sda("SpatialDataLabel", ...) |
| 75 | + |
66 | 76 | #' @export |
67 | 77 | #' @rdname SpatialDataArray |
68 | 78 | #' @importFrom methods new |
@@ -160,46 +170,53 @@ setMethod("channels", "SpatialDataElement", \(x, ...) stop("only 'images' have c |
160 | 170 | ) |
161 | 171 | } |
162 | 172 |
|
| 173 | +# https://github.com/Huber-group-EMBL/Rarr/blob/1795c676e2ac81a9ba2a592c7210cc59036544b6/R/utils.R#L74-L79 |
| 174 | +.sub <- \(x, ix) rlang::inject(x[!!!ix, drop=FALSE]) |
| 175 | + |
163 | 176 | #' @exportMethod [ |
164 | 177 | #' @rdname SpatialDataArray |
165 | 178 | #' @importFrom utils head tail |
| 179 | +.sub_sda <- \(x, yx, z=list()) { |
| 180 | + #x <- label(sd); yx <- list(1:10, 1:10); z <- list() |
| 181 | + # yx: spatial; z: channels |
| 182 | + ls <- seq_along(data(x, NULL)) |
| 183 | + data(x) <- lapply(ls, \(l) { |
| 184 | + sf <- 2^(l-1) |
| 185 | + rc <- tail(dim(data(x, l)), 2) |
| 186 | + # get spatial indices |
| 187 | + .yx <- lapply(seq_along(yx), \(a) { |
| 188 | + ix <- yx[[a]] |
| 189 | + if (isTRUE(ix)) return(seq_len(rc[a])) |
| 190 | + if (is.numeric(ix)) { |
| 191 | + return(seq( |
| 192 | + floor(head(ix, 1)/sf), |
| 193 | + min(ceiling(tail(ix, 1)/sf), rc[a]))) |
| 194 | + } |
| 195 | + ix |
| 196 | + }) |
| 197 | + # combine leading & spatial indices |
| 198 | + ix <- c(z, .yx) |
| 199 | + # (optional) prepend additional indices |
| 200 | + nd <- length(dim(data(x))) |
| 201 | + na <- nd-length(ix) |
| 202 | + if (na > 0) { |
| 203 | + na <- !logical(na) |
| 204 | + ix <- c(as.list(na), ix) |
| 205 | + } |
| 206 | + .sub(data(x, l), ix) |
| 207 | + }) |
| 208 | + x |
| 209 | +} |
| 210 | + |
166 | 211 | setMethod("[", "SpatialDataImage", \(x, i, j, k, ..., drop=FALSE) { |
167 | 212 | if (missing(i)) i <- TRUE |
168 | 213 | if (missing(j)) j <- TRUE else if (isFALSE(j)) j <- 0 else .check_jk(j, "j") |
169 | 214 | if (missing(k)) k <- TRUE else if (isFALSE(k)) k <- 0 else .check_jk(k, "k") |
170 | | - ijk <- list(i, j, k) |
171 | | - n <- length(data(x, NULL)) |
172 | | - d <- dim(data(x)) |
173 | | - data(x) <- lapply(seq_len(n), \(.) { |
174 | | - j <- if (isTRUE(j)) seq_len(d[2]) else j |
175 | | - k <- if (isTRUE(k)) seq_len(d[3]) else k |
176 | | - jk <- lapply(list(j, k), \(jk) { |
177 | | - fac <- 2^(.-1) |
178 | | - seq(floor(head(jk, 1)/fac), |
179 | | - ceiling(tail(jk, 1)/fac)) |
180 | | - }) |
181 | | - data(x, .)[i, jk[[1]], jk[[2]], drop=FALSE] |
182 | | - }) |
183 | | - x |
| 215 | + .sub_sda(x, yx=list(j, k), z=list(i)) |
184 | 216 | }) |
185 | 217 |
|
186 | | -#' @exportMethod [ |
187 | | -#' @rdname SpatialDataArray |
188 | | -#' @importFrom utils head tail |
189 | 218 | setMethod("[", "SpatialDataLabel", \(x, i, j, ..., drop=FALSE) { |
190 | 219 | if (missing(i)) i <- TRUE else if (isFALSE(i)) i <- 0 else .check_jk(i, "i") |
191 | 220 | if (missing(j)) j <- TRUE else if (isFALSE(j)) j <- 0 else .check_jk(j, "j") |
192 | | - n <- length(data(x, NULL)) |
193 | | - d <- dim(data(x, 1)) |
194 | | - data(x) <- lapply(seq_len(n), \(.) { |
195 | | - i <- if (isTRUE(i)) seq_len(d[1]) else i |
196 | | - j <- if (isTRUE(j)) seq_len(d[2]) else j |
197 | | - ij <- lapply(list(i, j), \(ij) { |
198 | | - fac <- 2^(.-1) |
199 | | - seq(floor(head(ij, 1)/fac), |
200 | | - ceiling(tail(ij, 1)/fac)) |
201 | | - }) |
202 | | - data(x, .)[ij[[1]], ij[[2]], drop=FALSE] |
203 | | - }) |
204 | | - x |
| 221 | + .sub_sda(x, yx=list(i, j), z=list()) |
205 | 222 | }) |
0 commit comments