diff --git a/R/MsBackend.R b/R/MsBackend.R index 70cf211e..f1721a3e 100644 --- a/R/MsBackend.R +++ b/R/MsBackend.R @@ -1119,7 +1119,9 @@ setMethod("dropNaSpectraVariables", "MsBackend", function(object) { #' #' @export setMethod("extractByIndex", c("MsBackend", "ANY"), function(object, i) { - stop("'extractByIndex' not implemented for ", class(object), ".") + if (existsMethod("[", class(object)[1L])) + object[i = i] + else stop("'extractByIndex' not implemented for ", class(object)[1L], ".") }) #' @rdname MsBackend diff --git a/tests/testthat/test_MsBackend.R b/tests/testthat/test_MsBackend.R index f929451a..cea6af27 100644 --- a/tests/testthat/test_MsBackend.R +++ b/tests/testthat/test_MsBackend.R @@ -59,6 +59,30 @@ test_that("MsBackend methods throw errors", { expect_error(extractByIndex(dm, 1), "implemented for") }) +test_that("extractByIndex not implemented fallback", { + ## Backends that don't implement a dedicated `extractByIndex` method should + ## fall back to the [ method. + setClass("DummyBackend", + contains = "MsBackend", + slots = c(d = "integer")) + dm <- new("DummyBackend") + expect_error(extractByIndex(dm, 1L), "'extractByIndex' not implemented") + + dm@d <- 1:4 + + ## Have an implementation for [ but not extractByIndex: + setMethod("[", "DummyBackend", function(x, i, j, ..., drop = FALSE) { + x@d <- x@d[i] + x + }) + + res <- dm[c(3, 1)] + expect_equal(res@d, c(3L, 1L)) + + res <- extractByIndex(dm, c(3, 1)) + expect_equal(res@d, c(3L, 1L)) +}) + test_that("reset,MsBackend works", { res <- reset(sciex_mzr) expect_equal(res, sciex_mzr)