@@ -210,7 +210,6 @@ setValidity2("TileDBRealizationSink", function(object) {
210210# ' @importFrom SparseArray nzwhich nzvals
211211# ' @importFrom DelayedArray start width
212212setMethod ("write_block ", "TileDBRealizationSink", function(sink, viewport, block) {
213- starts <- start(viewport ) - 1L
214213 obj <- tiledb_array(sink @ path , attrs = sink @ attr , query_type = " WRITE" )
215214 on.exit(tiledb_array_close(obj ))
216215
@@ -220,24 +219,27 @@ setMethod("write_block", "TileDBRealizationSink", function(sink, viewport, block
220219
221220 ndim <- ncol(idx )
222221 store <- vector(" list" , ndim + 1L )
222+ starts <- start(viewport )
223223 for (i in seq_len(ndim )) {
224- store [[i ]] <- idx [,i ] + starts [i ] + sink @ offset [i ] - 1L
224+ store [[i ]] <- idx [,i ] + ( starts [i ] - 1L ) + ( sink @ offset [i ] - 1L )
225225 }
226226 store [[ndim + 1 ]] <- vals
227227
228228 names(store ) <- c(sprintf(" d%i" , seq_len(ndim )), sink @ attr )
229229 obj [] <- data.frame (store )
230230
231231 } else {
232- args <- lapply(width(viewport ), seq_len )
233- for (i in seq_along(args )) {
234- args [[i ]] <- args [[i ]] + starts [i ] + sink @ offset [i ] - 1L
235- }
232+ starts <- start(viewport )
233+ widths <- width(viewport )
234+ ndim <- length(starts )
236235
237- # Need to coerce the block, because it could be a SparseArray
238- # derivative.
239- args <- c(list (sink = obj ), args , list (value = as.array(block )))
240- do.call(" [<-" , args )
236+ ranges <- vector(" list" , ndim )
237+ for (i in seq_len(ndim )) {
238+ actual.start <- starts [i ] + (sink @ offset [i ] - 1L )
239+ ranges [[i ]] <- cbind(actual.start , actual.start + widths [i ] - 1L )
240+ }
241+ selected_ranges(obj ) <- ranges
242+ obj [] <- as.array(block ) # Need to coerce the block, because it could be a SparseArray derivative.
241243 }
242244
243245 sink
0 commit comments