ExperimentSubset 1.23.50 (2026-11-10)
- The README and the vignette now install the development version with
BiocManager::install("campbio/ExperimentSubset@devel"). Before, BiocManager::install("campbio/ExperimentSubset") installed the default branch, which holds the release version. The README also links to the website and the workflow article, and shows Bioconductor build, years, downloads and pkgdown badges next to R-CMD-check. No change to the package
ExperimentSubset 1.23.49 (2026-11-09)
- The workflow article on the website now uses the 10x 5k PBMC CITE-seq data set (RNA and 32 antibodies) instead of PBMC 4k, and keeps Cell Ranger’s raw matrix whole: all 6,794,880 barcodes, with the antibodies in
altExp("ADT"). Next to the RNA workflow, the same object now holds an antibody workflow: decontPro and CLR on the high-quality cells, stored in the subset’s ADT while its counts stay linked to the main object; the RNA cell-type labels checked against CD3, CD4 and CD8a protein; and decontPro and CLR again on the T cells alone, stored with unlink = c("ADT/decontPro", "ADT/clr"). RNA decontamination now uses the decontX package rather than celda, and the article keeps cells with up to 15% mitochondrial counts rather than 10%, since this data set has more. No change to the package (#93)
ExperimentSubset 1.23.48 (2026-11-08)
- The package code, tests and vignette now pass
make lint with no findings: spacing, braces, quotes, assignment, indentation and line length follow the package’s lint settings, which now also accept the names of the exported constructors, the class generators and the use.names and deparse.level arguments that methods take from their generics. subsetSummary() loops with seq_along() and createSubset() drops an internal variable that always equalled parentAssay. No change in behavior (#37)
ExperimentSubset 1.23.47 (2026-11-08)
- New
subsetRowTree(x, subsetName) and subsetColTree(x, subsetName) return the row or column tree of a TreeSummarizedExperiment subset: its own, if it stores one; otherwise that of the nearest subset it was made from that stores one; otherwise the main object’s. whichTree picks one of several trees, as in rowTree(). New subsetRowTree(x, subsetName) <- value and subsetColTree<- store a phylo tree as the subset’s own, linking each row or column to the node labelled with its name in the subset, without changing the main object or other subsets; NULL removes it. Every row or column name of the subset must be a node label of the tree, or it’s an error such as “Every rowname of subset ‘s1’ must be a node label of ‘value’. Not found: t3.”; TreeSummarizedExperiment’s rowTree<- would instead drop those rows. Subsets made from a subset with its own tree use that tree, cut to their rows or columns, and getSubsetExperiment() returns it with its links. setSubsetExperiment() now stores a row or column tree that a tool changed in the object from getSubsetExperiment() as the subset’s own, with the message “Subset ‘s1’ now stores its own rowTree.”; before, a changed tree was dropped without a message. Unchanged trees aren’t stored, so the subset still follows the main object’s. A subset can store only one tree per dimension, with a node label for each row or column, so an object with two row trees, or with a label on more than one node of those its rows use, is an error; a removed tree isn’t stored, with the message “Subset ‘s1’ keeps its rowTree; a subset always uses its own tree, a parent’s or the main object’s.” rbind() and cbind() keep subsets’ own trees. Rows and columns are linked by node label, so each must label only one node of the tree, or it’s an error. This is a change: subsetRowLinks() and subsetColLinks() now default to parentRowLinkData = TRUE and parentColLinkData = TRUE, and return the links to the tree that subsetRowTree() or subsetColTree() returns. Before, they defaulted to FALSE and returned NULL, because subsets never had trees of their own; code that relied on NULL needs parentRowLinkData = FALSE, which now returns only links to a tree stored by the subset or one it was made from. Both arguments must now be TRUE or FALSE; before, NULL, NA or another value meant FALSE. (#35)
ExperimentSubset 1.23.46 (2026-11-08)
- New
subsetImgData(x, subsetName) returns the images of a SpatialExperiment subset: the rows of the main object’s imgData() for the samples of the subset’s spots, looked up on each read. Before, a subset’s images had to be filtered from the main object’s by sample_id by hand. New subsetSpatialCoords(x, subsetName) <- value stores a subset’s own spatial coordinates, such as after a transformation, without changing the main object’s; value is a numeric matrix with one row per spot and one or more columns, and NULL removes them. A subset with its own coordinates returns them from subsetSpatialCoords(), spatialCoords(x, subsetName =) and getSubsetExperiment(), and subsets made from it see them, cut to their spots. setSubsetExperiment() now stores coordinates that a tool changed in the object from getSubsetExperiment() as the subset’s own, with the message “Subset ‘s1’ now stores its own spatialCoords.”; unchanged coordinates aren’t stored, so the subset still follows the main object’s. Subsets without their own coordinates are unchanged (#72)
ExperimentSubset 1.23.45 (2026-11-08)
-
assay(x, "s1", subsetAssayName = "x") <- value now prints “Storing assay inside subset ‘s1’.” only after the assay is stored. Before, it printed the message first, so when value was rejected, for example because its column names were in another order or because subsetAssayName named an assay linked from the parent and unlink wasn’t set, the message announced a store that didn’t happen, followed by the error. Successful calls print the same message as before, now after any message about unlinking (#107)
-
setSubsetAssay() with a subsetName that isn’t a subset now gives the error “nope subset does not exist. ‘subsetName’ must be the name of a subset.”, the one most other functions already give, instead of “nope does not exist in the subsets slot of the object. You need to create a new subset with createSubset() function.” subsetParent() with a subsetName that is neither a subset nor a “subset/assay” now gives “nope subset does not exist. ‘subsetName’ must be the name of a subset or a”subset/assay”.”, instead of “nope does not exist in the subsets slot of the object.” createSubset(), and ExperimentSubset() with subset =, with a parentAssay that doesn’t exist now give “‘parentAssay’ must be NULL or name an assay, a subset or a”subset/assay”; ‘typo’ is none of these.”, instead of “Input parentAssay does not exist.” Code that matched the old text needs the new one (#107)
ExperimentSubset 1.23.44 (2026-11-08)
- The tests use testthat edition 3, so
testthat (>= 3.0.0) is now in Suggests. Five tests that unlink an assay, whose message edition 3 no longer hides, now check it, such as “Subset ‘s1’ now stores its own ‘counts’, unlinked from the main assay ‘counts’.” No change in behavior (#96)
ExperimentSubset 1.23.43 (2026-11-07)
- Errors from
createSubset(), and from ExperimentSubset() with subset =, are now one line, without the line breaks and runs of spaces they had before, and name the argument and the problem: a subsetName that is already a subset now gives “‘subsetName’ must differ from the names of existing subsets; ‘s1’ is already a subset name.” instead of “A subset with the specified ‘subsetName’ parameter already exists in the object. Subset names must be unique.”; a rows or cols that isn’t NULL, numeric or character gives “‘rows’ must be NULL, to include all rows, or a numeric or character vector of the rows to include.” or “‘cols’ must be NULL, to include all columns, or a numeric or character vector of the columns to include.” (before, the cols message said “all rows”); and a parentAssay that isn’t NULL or one character string gives “‘parentAssay’ must be NULL, to use the default assay, or a single character string naming the assay or subset to make the subset from.” setSubsetAssay() with a subsetName that isn’t a subset keeps its message, now on one line without trailing spaces (#96)
ExperimentSubset 1.23.42 (2026-11-07)
-
altExpNames<- with a value that isn’t a character vector, such as a factor, NULL or a number, now gives the error “‘value’ must be a character vector of altExp names.”, with subsetName = and on the main object. Before, both failed with “unable to find an inherited method for function ‘altExpNames<-’”. Character values are unchanged (#105)
ExperimentSubset 1.23.41 (2026-11-07)
-
colData(x, subsetName =) <- with a value that isn’t a DataFrame, a data.frame or NULL, such as a vector, now gives the error “‘value’ must be a DataFrame, a data.frame or NULL.”, as subsetColData<- and rowData<- with subsetName = already did. colData(x) <- on the main object with such a value now gives “‘value’ must be a DataFrame or NULL.”, as it already did for a data.frame. Before, both failed with “unable to find an inherited method for function ‘colData<-’”. Values that worked before are unchanged (#99)
ExperimentSubset 1.23.40 (2026-11-06)
-
subsetRowData<- and rowData(x, subsetName =) <- now stop when the rownames of value are not NULL and not the subset’s row names, in the same order, with the error “The rownames of ‘value’ must be NULL or the row names of subset ‘s1’, in the same order.”, as subsetColData<- and colData<- already did for column names. Before, those rownames were dropped without a message and the values were stored against the subset’s rows by position, so values meant for other rows, or for the same rows in another order, went to the wrong rows. This is a change: a table with other rownames, such as gene IDs for a subset whose rows are named by symbol, is now an error; put its rows in the subset’s order and set rownames(value) <- NULL first. A value with the wrong number of rows now gets the size error from rowData<- or colData<- even when it has rownames; before, subsetColData<- and colData<- with subsetName = said its rownames were wrong instead. The main object’s rowData<- is unchanged (#100)
ExperimentSubset 1.23.39 (2026-11-06)
- A
subsetName that isn’t a character string, such as NULL, NA or a number, now gives the error “‘subsetName’ must be one subset name, a single character string.” in setSubsetAssay(), getSubsetAssay(), getSubsetExperiment(), setSubsetExperiment(), subsetDim(), subsetColData(), subsetRowData(), subsetColnames(), subsetRownames() and their setters, subsetColLinks(), subsetRowLinks(), subsetSpatialCoords() and subsetSpatialData(). A subsetAssayName in setSubsetAssay() that isn’t a character string, such as NULL, now gives “‘subsetAssayName’ must be a single, non-empty character string.” Before, these failed with “unable to find an inherited method”, because the methods were chosen by the class of subsetName and subsetAssayName; now they are chosen by the class of x only. subsetColData<- and subsetRowData<- now take a data.frame, converted to a DataFrame, and NULL, which removes the subset’s own columns, as colData<- and rowData<- with subsetName = already did; before, these failed with the same error. Any other value in these and in rowData<- with subsetName = gives “‘value’ must be a DataFrame, a data.frame or NULL.” This is a change for rowData(x, subsetName =) <- with a vector, such as 1:10, which before stored it as a column named value; wrap it in a DataFrame or data.frame with a column name instead (#97)
ExperimentSubset 1.23.38 (2026-11-05)
- The older tests now check results instead of only running code: subset assay values for
SummarizedExperiment and RangedSummarizedExperiment objects, what setSubsetAssay() stores, the full subsetParent() list, the output of show() and subsetSummary(), and the reducedDims and altExps read back with subsetName =. They no longer read slots with @, and the commented-out tests run again or are removed. New tests check subsetParent() with an unknown subset name and ExperimentSubset() on a named list of assays. No change in behavior (#31)
ExperimentSubset 1.23.37 (2026-11-05)
- A subset now sees the main object’s alternative experiments (altExps), and those stored on the subsets it was made from, cut to its cells:
altExp(), altExps() and altExpNames() with subsetName =, subsetSummary() and getSubsetExperiment() include them. Before, a subset saw only the altExps stored on it, so, for example, the ADT counts of its cells weren’t available. An altExp keeps all of its features: a subset’s rows pick features of the main object only. These altExps are linked, as assays are: the subset sees their current values, and altExp<-, altExps<- and setSubsetExperiment() store only what differs from them. A new assay, such as decontPro added to ADT, is stored as the subset’s own while ADT’s counts stays linked; an assay with other values than the linked one needs unlink, which names it as "altExpName/assayName", such as unlink = "ADT/counts", with a message for each assay unlinked. setSubsetExperiment() checks assays and altExp assays together, with one error naming every one unlink doesn’t allow. A changed linked assay that the subset already stores, after an unlink, needs no unlink again. A subset can’t remove or rename a linked altExp: altExpNames(x, subsetName =) <- takes a different name for each altExp the subset sees and renames only its own, and an altExp missing from altExps(x, subsetName =) <- stays visible. Changes to a linked altExp carry along to the subsets below it: renaming it, with altExpNames<- on the main object or on the subset that stores it, renames what they store of it, and removing it, or storing it with other rows or another class, drops what they added to it, with a warning naming them; an altExp a subset stores whole is kept, and keeps replacing the linked one even if that later has the same rows. An unlink other than FALSE in altExp<- or altExps<- without subsetName is an error. A subset that stored an altExp under the name of one of the main object’s, with the same class and features, now also sees the main altExp’s assays that it doesn’t store (#58)
ExperimentSubset 1.23.36 (2026-11-04)
-
unlink in setSubsetExperiment(), setSubsetAssay() and assay<- can now name the assays to unlink, as well as being TRUE or FALSE. With unlink = "decontXcounts", setSubsetExperiment() stores a changed decontXcounts as the subset’s own, but stops with an error, storing nothing, if another linked assay such as counts was changed too. Before, the only choice was unlink = TRUE, which also unlinked an assay changed by mistake, without a message. Names of assays that are not linked, or not changed, are ignored. Each assay that is unlinked now gives a message such as “Subset ‘s1’ now stores its own ‘counts’, unlinked from the main assay ‘counts’.”, whether unlink is TRUE or a name. An unlink that is not TRUE, FALSE or a character vector of assay names, such as NA, now gives the error “‘unlink’ must be TRUE, FALSE or a character vector of assay names.”; before, it was taken as FALSE (#59)
ExperimentSubset 1.23.35 (2026-11-04)
-
ExperimentSubset() on an object that is already an ExperimentSubset now returns it as is, and subset = still creates a subset on it. Before, it failed with “no method or default for coercing ‘SubsetSingleCellExperiment’ to ‘SubsetSubsetSingleCellExperiment’”, so code that wraps an object without knowing whether it is already wrapped had to check first. ExperimentSubset() on an object of a subclass of a supported class, such as a class that contains SingleCellExperiment, now converts it as the class it extends, with a warning that the slots and methods the subclass adds are not kept; before, it failed with the same kind of error. Any other x that isn’t a list, such as a matrix, now gives the error “‘x’ must be a SummarizedExperiment, RangedSummarizedExperiment, SingleCellExperiment, TreeSummarizedExperiment or SpatialExperiment object, or a named list of assays”, instead of “unable to find an inherited method for function ‘assayNames’”. For an object of a subclass of a Subset* class, createSubset(), cbind(), rbind(), combineCols() and combineRows() now store each subset’s data as the class the object extends, such as SingleCellExperiment; before, they stored it as the subclass itself (#89)
ExperimentSubset 1.23.34 (2026-11-04)
- New exported virtual class
ExperimentSubset, which all five Subset* classes extend, so is(x, "ExperimentSubset") tests whether x is an ExperimentSubset object, whichever class it extends. Before, this took a list of the five classes or a check for the subsets slot: a SubsetSpatialExperiment, for example, is not a SubsetSingleCellExperiment, though both extend SingleCellExperiment. See ?"ExperimentSubset-class" (#5)
ExperimentSubset 1.23.33 (2026-11-03)
-
assay() and assay<- with an i that isn’t one name, such as several names or NA_character_, now give the error “‘i’ must be one name of an assay, a subset or a”subset/assay”, a single character string.” Before, they failed with base R errors that didn’t name the argument, such as “the condition has length > 1” or “‘length = 2’ in coercion to ‘logical(1)’”, or said that ‘NA’ is not the name of an assay. getSubsetAssay() without subsetAssayName now gives the same subsetName error as with it, instead of assay()‘s errors. assay(x, "subset", subsetAssayName = NA) now says that subsetAssayName must be a single character string, as assay<- already did, instead of that ’subset/NA’ is not the name of an assay. A numeric i is unchanged (#85)
ExperimentSubset 1.23.32 (2026-11-03)
- A
subsetName that isn’t one subset name, such as NULL, NA or several names, now gives the error “‘subsetName’ must be one subset name, a single character string.” in the methods that get or set a subset’s data with subsetName =: metadata(), altExp(), altExps(), altExpNames(), reducedDim(), reducedDims(), reducedDimNames(), rowData() and colData(), their setters, spatialCoords(), spatialData() and subsetParent(). Several names or NA_character_ give the same error in subsetAssayNames(), subsetDim(), subsetColnames(), subsetRownames() and their setters, subsetColData(), subsetRowData(), subsetSpatialCoords(), getSubsetExperiment(), setSubsetExperiment(), setSubsetAssay(), and getSubsetAssay() with subsetAssayName =. Before, these failed with base R errors that didn’t name the argument, such as “argument is of length zero” or “the condition has length > 1”, or with “NA subset does not exist” or “NA does not exist in the subsets slot”. subsetAssayNames(x, subsetName = NULL), the default, still lists every subset, and reducedDimNames() on an object without subsets, such as a plain SingleCellExperiment, still says first that it has no subsets (#83)
ExperimentSubset 1.23.31 (2026-11-03)
-
reducedDimNames() now takes only subsetName =, by name, besides x. Before, any other argument was dropped without a message, so reducedDimNames(x, "subset"), with the subset name by position, returned the main object’s names instead of the subset’s. That call now stops with an error saying to use subsetName =, and any other argument, or subsetName given twice, is an error too. Calls with subsetName =, or with no other arguments, are unchanged. reducedDimNames<- still takes the subset name by position. reducedDimNames() and reducedDimNames<- with subsetName = on an object that isn’t an ExperimentSubset, such as a plain SingleCellExperiment, now say that it has no subsets and to convert it with ExperimentSubset(). Before, they failed with “unable to find an inherited method for function ‘subsetNames’” (#82)
ExperimentSubset 1.23.30 (2026-11-02)
-
reducedDims<- no longer masks SingleCellExperiment’s while ExperimentSubset is attached, so withDimnames = and the method’s other arguments work again, for plain SingleCellExperiment objects as well as ExperimentSubset ones, with or without subsetName =. Before, reducedDims(x, withDimnames = FALSE) <- value failed with “unused argument”. subsetName = on an object that isn’t an ExperimentSubset is now ignored, as for altExps<-, instead of giving an error. Give the subset by name: reducedDims(x, "subset") <- value, which the old generic allowed, now stops with an error saying to use subsetName =, since the second argument is withDimnames. reducedDimNames<- with a subsetName that isn’t a subset now gives the same error as the other methods (#26)
ExperimentSubset 1.23.29 (2026-11-01)
-
combineCols() and combineRows() now keep the subsets of every object, with their own assays, rowData, colData, reducedDims and altExps. Before, they returned a plain object and dropped every subset without a message. Each subset’s rows (for combineCols()) or columns (for combineRows()) are matched by name to the result’s, or by position with use.names = FALSE; subset names repeated across the objects, or used as an assay name in another object, are an error. Where the method of the class the objects extend returns another class (combineCols() of a TreeSummarizedExperiment or SpatialExperiment gives a SingleCellExperiment; combineRows() of a SingleCellExperiment, TreeSummarizedExperiment or SpatialExperiment gives a RangedSummarizedExperiment), the result is the matching ExperimentSubset class, and each subset is converted to that class too. A plain first object still gives a plain result: convert it with ExperimentSubset() first (#73)
ExperimentSubset 1.23.28 (2026-11-01)
- New tests check that
reducedDim(x) and reducedDim(x) <- value without a type act on the first reducedDim of the main object, as ?"ExperimentSubset-reducedDim" says, for each class with reducedDims. No change in behavior (#77)
ExperimentSubset 1.23.27 (2026-11-01)
-
assay(x, i, subsetAssayName = ) with an i that isn’t a subset name now gives the same reason as assay<-: that i already names an assay as "subset/assay", that i has a / but isn’t "subset/assay" for an existing subset, or that i is not a subset. Before, it said that i was a subset that does not exist, and referred to a subsetName argument that assay() doesn’t have (#76)
ExperimentSubset 1.23.26 (2026-11-01)
- New help pages for the methods of Bioconductor generics that take
subsetName =: ?"ExperimentSubset-assay" (assay(), assay<-, which name the subset with i), ?"ExperimentSubset-rowData-colData", ?"ExperimentSubset-reducedDim", ?"ExperimentSubset-altExp" and ?"ExperimentSubset-metadata". spatialCoords(x, subsetName = ) and spatialData(x, subsetName = ) are now on the subsetSpatialCoords and subsetSpatialData pages, and each show() method on its class’s page. Before, these methods had no help page (#15)
- The package now requires R 4.6.0 or later, the R version of Bioconductor 3.24 (#52)
- The package is now listed under the
SingleCell biocView (#52)
ExperimentSubset 1.23.25 (2026-11-01)
-
cbind() and rbind() now keep the subsets of every object, with their own assays, rowData, colData, reducedDims and altExps. Before, only the first object’s subsets were kept and the others were dropped without a message. Subsets of later objects move to where that object’s columns or rows are in the result. Subset names repeated across the objects are an error, as is cbind() of an object with subsets whose rows aren’t the first object’s, in the same order. For SpatialExperiment objects, each subset’s sample_id follows the main object’s when cbind() renames repeated sample IDs. Convert a plain object with ExperimentSubset() before combining it with ExperimentSubset objects (#67)
ExperimentSubset 1.23.24 (2026-10-31)
-
subsetSpatialData() and spatialData(x, subsetName = ) are deprecated, as spatialData() is in SpatialExperiment, which keeps these columns in colData. They warn and still work; use subsetColData(x, subsetName) instead, which returns all of the subset’s colData columns, with parentColData = TRUE to include the main object’s. They will be defunct in the next release. spatialData(x) on the main object is unchanged (#34)
-
subsetSpatialData<- is defunct and fails with an error saying to add each column with colData(x, subsetName = "name")$column <- values. It skips the usual deprecation release because it already failed for every value: SpatialExperiment’s spatialData<- takes no data.frame, and the method took no DataFrame (#34)
ExperimentSubset 1.23.23 (2026-10-31)
-
createSubset() from a parent with no rows or no columns, such as a subset none of whose rows remain after x[i, j], now says that the parent is empty (“Parent ‘s1’ has no rows, so a subset can’t be made from it.”). Before, the error blamed the rows or cols argument, even when it was left at its default (#68)
ExperimentSubset 1.23.22 (2026-10-31)
-
x[i, j] now updates the subsets of x: each keeps the rows and columns of the main object that remain, in its own order, with its own assays, rowData, colData, reducedDims and altExps, and subsets of subsets follow what remains of their parent. A subset none of whose rows or columns remain is kept with no rows or no columns. Before, subsets kept their old row and column positions, so reading one failed with “subscript out of bounds” or, when the positions were still in range, silently returned the wrong rows or columns under the subset’s names (#4)
ExperimentSubset 1.23.21 (2026-10-31)
-
rowData(x, subsetName = , parentRowData = TRUE), colData(x, subsetName = , parentColData = TRUE), subsetRowData(), subsetColData() and getSubsetExperiment(parentData = TRUE) no longer return two columns with the same name when a subset has its own column with the name of a main-object column, of which $ and [[ returned the main object’s. The subset’s column now hides the main object’s, and comes after the main object’s columns, with a message if their values differ. A SpatialExperiment subset has one sample_id column, the main object’s current one (#57)
ExperimentSubset 1.23.20 (2026-10-31)
-
stats is no longer listed in Suggests: it is a base package that R attaches by default, including in R CMD check
ExperimentSubset 1.23.19 (2026-10-31)
- Joshua D. Campbell is now the maintainer, taking over from Irzam Sarfraz, who remains an author
ExperimentSubset 1.23.18 (2026-10-25)
- New article on the website: an end-to-end single-cell workflow on 4,000 PBMCs that keeps empty droplets, cells, quality-controlled cells, variable genes and a T-cell re-analysis as subsets of one object, using both
getSubsetExperiment()/setSubsetExperiment() and direct storage. The vignette links to the website and the article, shows getSubsetExperiment()/setSubsetExperiment(), and sets subset colData columns directly with colData(x, subsetName = )$column <-
ExperimentSubset 1.23.17 (2026-10-25)
ExperimentSubset 1.23.16 (2026-10-25)
- New
getSubsetExperiment() returns a subset as a standalone object of the main object’s class (for example a SingleCellExperiment), with every assay the subset sees, its rowData and colData (after the main object’s columns, with parentData = TRUE), reducedDims, altExps and metadata, so tools written for that class can run on the subset. setSubsetExperiment() stores the result back: its assays, rowData, colData, reducedDims, altExps and metadata replace the subset’s own, so an own assay or column missing from it is removed, while unchanged linked assays and the main object’s columns are not stored. A linked assay the tool changed needs unlink = TRUE, and removing an assay another subset was made from is an error
ExperimentSubset 1.23.15 (2026-10-25)
- A subset now sees all of its parent’s assays as linked assays: the parent’s values sliced to the subset’s rows and columns, under the same names, computed when asked for rather than copied. For example a
logcounts computed on the main object is available in every subset. Read an assay as a subset sees it with assay(x, "subset", subsetAssayName = "a"), getSubsetAssay(x, "subset", subsetAssayName = "a") or the name "subset/a"; subsetAssayNames(x, subsetName = "subset") lists them (#2)
- Each subset has its own assay names: two subsets made from the same parent can both store, say,
decontXcounts. Storing an assay under a name the subset already sees through its parent now needs unlink = TRUE in setSubsetAssay() or assay<-; the subset and subsets made from it then use their own version (including assay(x, "subset") when the name is the one its parentAssay refers to), and the parent’s is unchanged
- A bare name in
assay(), getSubsetAssay(), createSubset(parentAssay = ), subsetParent(), subsetRownames() and subsetColnames() now means a main assay or a subset. An assay stored in a subset is named "subset/assay"; a bare stored-assay name is an error that shows the qualified form. Subsets made from such an assay record the qualified name, and subsets in objects saved by earlier versions that recorded a bare name are switched to the qualified name the next time a subset is created or an assay stored. assay(x, "subset/assay") <- value stores into that subset
-
subsetAssayNames() lists the assays stored in subsets as "subset/assay", so each listed name can be passed back to assay(). Subset names and stored assay names can’t contain /
ExperimentSubset 1.23.14 (2026-10-22)
-
withDimnames (for assay(), assay<-, reducedDim<-, altExp<- and altExps<-), withColData (for altExp<- and altExps<-) and use.names (for rowData()) now take effect, on the main object and with subsetName (where the reducedDim(), reducedDims(), altExp() and altExps() getters also pass them on); they were silently dropped. reducedDims<- is unchanged (#26)
-
rowData(x, subsetName = ) <- and colData(x, subsetName = ) <- with NULL or a data.frame now change the subset; before, they changed the main object’s rowData or colData
-
reducedDim(x, subsetName = ) without a type now returns, or with <- replaces, the subset’s first reducedDim instead of failing
- Writing back rowData or colData read with
parentRowData = TRUE or parentColData = TRUE no longer stores copies of the main object’s columns in the subset: those columns are left out, with a message naming them. The getters mark them in the column metadata (mcols()) of the result
-
subsetRowLinks(), subsetColLinks() and subsetSpatialData() return the subset’s row or column names instead of "1".."n", and asking for the parent’s links no longer fails when the main object has no tree for that dimension
-
subsetParent() resolves stored assay names the same way as assay() and stops with an error if the chain of parents has a cycle
- Loading the package no longer warns about the
listData and elementType slots in the class prototypes
ExperimentSubset 1.23.13 (2026-10-22)
ExperimentSubset 1.23.12 (2026-10-22)
-
rowData(), colData(), subsetRowData() and subsetColData() for a subset now return the subset’s row or column names as rownames (or NULL if it has none), instead of "1".."n", so writing the result back no longer renames the subset’s cells
- Setting a subset’s colData no longer changes its column names: a value without rownames takes the subset’s names, and a value whose rownames differ from them is an error. Rename a subset’s columns with
subsetColnames<-. Subsets whose cells were already renamed to "1".."n" this way keep those names; set them back with subsetColnames<- or re-create the subset
ExperimentSubset 1.23.11 (2026-10-22)
- The tests no longer download PBMC data from ExperimentHub: a small simulated data set replaces it, the tests skip, rather than fail, when a Suggests package they need is missing, and new tests cover the TreeSummarizedExperiment and SpatialExperiment methods (except
spatialData, deprecated upstream)
ExperimentSubset 1.23.10 (2026-10-21)
-
createSubset() checks its input more strictly: rows and cols must select at least one row or column and be positive whole numbers or names, without duplicates (duplicates were accepted in some cases before); names given for an assay without row or column names give a clear error; subsetName must be a single non-empty string that is not already the name of an assay or of an assay stored in a subset; parentAssay must be a single string
-
ExperimentSubset() now stops when subset contains NA instead of silently skipping the subset, and rejects a list of assays without names
- Unknown subset names now give a clear error in
subsetDim(), subsetColnames(), subsetRownames() and their setters, and reducedDims<-; assay(x, i) and getSubsetAssay(x, i) with an unknown name are an error instead of returning NULL
-
assay(x, i) <- value stores the assay inside the subset whenever i is a subset name, and then needs subsetAssayName (giving subsetAssayName with a name that is not a subset is an error); before, the choice depended on the dimensions of value, so a subset with the same dimensions as the main object got a new main assay named after it
ExperimentSubset 1.23.9 (2026-10-21)
- A subset with a single row or column now returns a one-row or one-column matrix from
assay(), not a vector, so subsets can be made from it
-
setSubsetAssay() (and assay(x, i) <- value for a subset) no longer replaces the subset’s row and column names with the input matrix’s. A matrix without names is stored under the subset’s names; a matrix whose names differ from the subset’s, or are in another order, is now an error instead of silently relabelling the subset; a matrix of the wrong size gets an error that says so. assay(x, subsetName) now returns the subset’s own row and column names, including any set with subsetRownames<- or subsetColnames<-, so setSubsetAssay(x, s, assay(x, s), ...) always works
- A
subsetName with spaces is now stored under the name with spaces removed, which the warning already announced; before, the subset was stored under the original name and lookups of its stored assays failed. Refer to such a subset by the name without spaces
ExperimentSubset 1.23.8 (2026-10-21)
- Subsets created from another subset (
parentAssay set to a subset, or to an assay stored in one) now take their row and column names, sample_id, and the parent rowData, colData, rowLinks, colLinks, spatialCoords and spatialData from the right rows and columns of the main object. Before, the indices relative to the parent subset were applied to the main object, so these came from the wrong features and cells while assay() returned the right values. The parent metadata is looked up on access, so it is now right for existing objects too; the subset’s row and column names (and sample_id) are stored when the subset is created, so objects saved with an earlier version keep the wrong names for such subsets. Repair them with subsetRownames(x, "s2") <- rownames(assay(x, "s2")) and the same for subsetColnames(); a wrong SpatialExperiment sample_id needs the subset re-created
ExperimentSubset 1.23.7 (2026-10-21)
- Accessors and replacement methods called on the main object without
subsetName now pass on arguments that travel in the base generic’s ...; for example reducedDim(x, "PCA", withDimnames = FALSE), reducedDims(x, withDimnames = FALSE) and altExps(x, withDimnames = FALSE) failed with “argument x is missing”. Arguments that are named formals of the base generic, such as withDimnames in assay<- or use.names in rowData, are still dropped (#29)
ExperimentSubset 1.23.6 (2026-10-21)
-
altExp(x, e, subsetName = ) now returns the altExp named or numbered by e; it always returned the first one before
-
altExp(x, <number>) <- value now replaces the altExp at that position; with subsetName it replaced the first altExp, and without it the call failed
ExperimentSubset 1.23.5 (2026-10-21)
- The vignette’s PBMC workflow now uses
scrapper for QC, normalization, highly variable genes and PCA, replacing scran and scater functions that are deprecated
-
scrapper replaces scran in Suggests; the tests also use scrapper in place of the deprecated functions
ExperimentSubset 1.23.1 (2026-10-20)
- Fixed a vignette example that filled a 2 x 4 matrix with 100 values, which fails
R CMD check --as-cran
ExperimentSubset 1.1.0 (2021-05-09)
- Added support for TreeSummarizedExperiment and SpatialExperiment classes
ExperimentSubset 0.99.0 (2020-10-02)
PRE-RELEASE * Pre-release version of the ExperimentSubset package to be submitted to Bioconductor