From 18e65d78bd7118bfe9b0f958c80c90915cf8f0f8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 20:49:49 +0000 Subject: [PATCH 1/4] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/crate-ci/typos: v1.28.2 → v1.28.3](https://github.com/crate-ci/typos/compare/v1.28.2...v1.28.3) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5d0ac27..58c6d09 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,7 @@ repos: exclude: '\.Rd' - repo: https://github.com/crate-ci/typos - rev: v1.28.2 + rev: v1.28.3 hooks: - id: typos exclude: '\.nb\.html' From 2b1d95c61a4c9e850ef8e7354afd774164ac4eb6 Mon Sep 17 00:00:00 2001 From: Joshua Shapiro Date: Tue, 17 Dec 2024 10:55:43 -0500 Subject: [PATCH 2/4] Add keeping of rowData to summed SCE --- DESCRIPTION | 2 +- R/sum-duplicate-genes.R | 44 ++++++++++++++++------- man/sum_duplicate_genes.Rd | 5 +++ tests/testthat/test-sum-duplicate-genes.R | 18 ++++++++-- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 0c9cc6e..47986fa 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -24,7 +24,6 @@ Suggests: scran, Seurat, splatter, - scuttle, Matrix, SeuratObject Config/testthat/edition: 3 @@ -37,6 +36,7 @@ Imports: pdfCluster, purrr, S4Vectors, + scuttle, SingleCellExperiment, SummarizedExperiment, tibble, diff --git a/R/sum-duplicate-genes.R b/R/sum-duplicate-genes.R index a4f512f..daf63ea 100644 --- a/R/sum-duplicate-genes.R +++ b/R/sum-duplicate-genes.R @@ -8,6 +8,11 @@ #' substantial sequence identity, which could make separate quantification of #' the two genes less reliable. #' +#' The rowData for the summed SingleCellExperiment object is updated to reflect +#' the new set of gene names. In each case, the first row for any duplicated id +#' is retained. This may mean that for gene symbols that correspond to multiple +#' Ensembl ids, the first Ensembl id is retained and the others are dropped. +#' #' If requested, the log-normalized expression values are recalculated, #' otherwise that matrix is left blank. #' @@ -49,9 +54,7 @@ sum_duplicate_genes <- function(sce, normalize = TRUE, recalculate_reduced_dims if (normalize) { stopifnot( "Package `scran` must be installed if `normalize = TRUE` is set." = - requireNamespace("scran", quietly = TRUE), - "Package `scuttle` must be installed if `normalize = TRUE` is set." = - requireNamespace("scuttle", quietly = TRUE) + requireNamespace("scran", quietly = TRUE) ) } stopifnot( @@ -65,14 +68,20 @@ sum_duplicate_genes <- function(sce, normalize = TRUE, recalculate_reduced_dims } # calculate the reduced matrices - counts <- rowsum(counts(sce), rownames(sce)) |> as("sparseMatrix") + unique_rows <- unique(rownames(sce)) # new row names + counts <- rowsum(counts(sce), rownames(sce))[unique_rows, ] |> # keep order, mostly + as("sparseMatrix") if ("spliced" %in% assayNames(sce)) { - spliced <- rowsum(assay(sce, "spliced"), rownames(sce)) |> as("sparseMatrix") + spliced_names <- rownames(assay(sce, "spliced")) + spliced <- rowsum(assay(sce, "spliced"), spliced_names)[unique(spliced_names), ] |> + as("sparseMatrix") assays <- list(counts = counts, spliced = spliced) } else { assays <- list(counts = counts) } + # regenerate rowData, using first row for each duplicate + row_data <- rowData(sce)[unique_rows, ] if (recalculate_reduced_dims) { reduced_dims <- list() @@ -81,26 +90,35 @@ sum_duplicate_genes <- function(sce, normalize = TRUE, recalculate_reduced_dims } + # Build the new SingleCellExperiment object summed_sce <- SingleCellExperiment( assays = assays, + rowData = row_data, colData = colData(sce), metadata = metadata(sce), # if we are not recalculating reduced dimensions, copy over previous (likely similar) reducedDims = reduced_dims, altExps = altExps(sce) ) + # remove and replace existing Feature stats + rowData(summed_sce)$mean <- NULL + rowData(summed_sce)$detected <- NULL + summed_sce <- scuttle::addPerFeatureQCMetrics(summed_sce) # Add normalized values if requested if (normalize) { - try({ - # try to cluster similar cells - # clustering may fail if < 100 cells in dataset - suppressWarnings({ - qclust <- scran::quickCluster(summed_sce) - summed_sce <- scran::computeSumFactors(summed_sce, clusters = qclust) - }) - }) + try( + { + # try to cluster similar cells + # clustering may fail if < 100 cells in dataset + suppressWarnings({ + qclust <- scran::quickCluster(summed_sce) + summed_sce <- scran::computeSumFactors(summed_sce, clusters = qclust) + }) + }, + silent = TRUE + ) summed_sce <- scuttle::logNormCounts(summed_sce) } diff --git a/man/sum_duplicate_genes.Rd b/man/sum_duplicate_genes.Rd index 8421d11..8936180 100644 --- a/man/sum_duplicate_genes.Rd +++ b/man/sum_duplicate_genes.Rd @@ -30,6 +30,11 @@ substantial sequence identity, which could make separate quantification of the two genes less reliable. } \details{ +The rowData for the summed SingleCellExperiment object is updated to reflect +the new set of gene names. In each case, the first row for any duplicated id +is retained. This may mean that for gene symbols that correspond to multiple +Ensembl ids, the first Ensembl id is retained and the others are dropped. + If requested, the log-normalized expression values are recalculated, otherwise that matrix is left blank. diff --git a/tests/testthat/test-sum-duplicate-genes.R b/tests/testthat/test-sum-duplicate-genes.R index 127c098..219e185 100644 --- a/tests/testthat/test-sum-duplicate-genes.R +++ b/tests/testthat/test-sum-duplicate-genes.R @@ -5,7 +5,14 @@ test_that("merging works as expected", { expect_equal(dim(deduped_sce), dim(sce)) - expect_setequal(rownames(deduped_sce), rownames(sce)) + expect_equal(rownames(deduped_sce), rownames(sce)) + + expect_contains( + colnames(rowData(deduped_sce)), + c("gene_ids", "gene_symbol", "mean", "detected") + ) + expect_equal(rowData(deduped_sce)$gene_ids, rowData(sce)$gene_ids) + expect_equal(rowData(deduped_sce)$gene_symbol, rowData(sce)$gene_symbol) expect_equal( @@ -25,7 +32,14 @@ test_that("merging works as expected with unprocessed SCE", { expect_equal(dim(deduped_sce), dim(sce)) - expect_setequal(rownames(deduped_sce), rownames(sce)) + expect_equal(rownames(deduped_sce), rownames(sce)) + + expect_contains( + colnames(rowData(deduped_sce)), + c("gene_ids", "gene_symbol", "mean", "detected") + ) + expect_equal(rowData(deduped_sce)$gene_ids, rowData(sce)$gene_ids) + expect_equal(rowData(deduped_sce)$gene_symbol, rowData(sce)$gene_symbol) expect_equal( From 93491a05bb02b116e94833308a59491f45eb2fca Mon Sep 17 00:00:00 2001 From: Joshua Shapiro Date: Tue, 17 Dec 2024 10:56:18 -0500 Subject: [PATCH 3/4] add devtools to dependencies --- .Rbuildignore | 1 + dependencies.R | 3 + renv.lock | 259 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 260 insertions(+), 3 deletions(-) create mode 100644 dependencies.R diff --git a/.Rbuildignore b/.Rbuildignore index ae19577..0db5db1 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -6,4 +6,5 @@ ^\.lintr$ ^\.pre-commit-config.yaml$ ^data-raw$ +^dependencies.R$ ^LICENSE\.md$ diff --git a/dependencies.R b/dependencies.R new file mode 100644 index 0000000..3c5f684 --- /dev/null +++ b/dependencies.R @@ -0,0 +1,3 @@ +# development dependencies for renv + +library("devtools") diff --git a/renv.lock b/renv.lock index 6b52b1c..99c563c 100644 --- a/renv.lock +++ b/renv.lock @@ -909,6 +909,13 @@ ], "Hash": "ed9597168d850071aa9abbbef7be7204" }, + "brew": { + "Package": "brew", + "Version": "1.0-10", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "8f4a384e19dccd8c65356dc096847b76" + }, "brio": { "Package": "brio", "Version": "1.1.5", @@ -1166,6 +1173,40 @@ ], "Hash": "99b79fcbd6c4d1ce087f5c5c758b384f" }, + "devtools": { + "Package": "devtools", + "Version": "2.4.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "desc", + "ellipsis", + "fs", + "lifecycle", + "memoise", + "miniUI", + "pkgbuild", + "pkgdown", + "pkgload", + "profvis", + "rcmdcheck", + "remotes", + "rlang", + "roxygen2", + "rversions", + "sessioninfo", + "stats", + "testthat", + "tools", + "urlchecker", + "usethis", + "utils", + "withr" + ], + "Hash": "ea5bc8b4a6a01e4f12d98b58329930bb" + }, "diffobj": { "Package": "diffobj", "Version": "0.3.5", @@ -1202,6 +1243,26 @@ ], "Hash": "80f374ef8500fcdc5d84a0345b837227" }, + "downlit": { + "Package": "downlit", + "Version": "0.4.4", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "brio", + "desc", + "digest", + "evaluate", + "fansi", + "memoise", + "rlang", + "vctrs", + "withr", + "yaml" + ], + "Hash": "45a6a596bf0108ee1ff16a040a2df897" + }, "dplyr": { "Package": "dplyr", "Version": "1.1.4", @@ -1255,6 +1316,17 @@ ], "Hash": "729daec53b663926458ccde421f5c2fb" }, + "ellipsis": { + "Package": "ellipsis", + "Version": "0.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "rlang" + ], + "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077" + }, "evaluate": { "Package": "evaluate", "Version": "1.0.1", @@ -2238,6 +2310,36 @@ ], "Hash": "01f28d4278f15c76cddbea05899c5d6f" }, + "pkgdown": { + "Package": "pkgdown", + "Version": "2.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bslib", + "callr", + "cli", + "desc", + "digest", + "downlit", + "fontawesome", + "fs", + "httr2", + "jsonlite", + "openssl", + "purrr", + "ragg", + "rlang", + "rmarkdown", + "tibble", + "whisker", + "withr", + "xml2", + "yaml" + ], + "Hash": "df2912d5873422b55a13002510f02c9f" + }, "pkgload": { "Package": "pkgload", "Version": "1.4.0", @@ -2330,6 +2432,16 @@ "Repository": "CRAN", "Hash": "a555924add98c99d2f411e37e7d25e9f" }, + "prettyunits": { + "Package": "prettyunits", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" + }, "processx": { "Package": "processx", "Version": "3.8.4", @@ -2343,6 +2455,19 @@ ], "Hash": "0c90a7d71988856bad2a2a45dd871bb9" }, + "profvis": { + "Package": "profvis", + "Version": "0.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "htmlwidgets", + "rlang", + "vctrs" + ], + "Hash": "bffa126bf92987e677c12cfb5651fc1d" + }, "progressr": { "Package": "progressr", "Version": "0.14.0", @@ -2418,12 +2543,51 @@ ], "Hash": "5e3c5dc0b071b21fa128676560dbe94d" }, + "rcmdcheck": { + "Package": "rcmdcheck", + "Version": "1.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R6", + "callr", + "cli", + "curl", + "desc", + "digest", + "pkgbuild", + "prettyunits", + "rprojroot", + "sessioninfo", + "utils", + "withr", + "xopen" + ], + "Hash": "8f25ebe2ec38b1f2aef3b0d2ef76f6c4" + }, + "remotes": { + "Package": "remotes", + "Version": "2.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods", + "stats", + "tools", + "utils" + ], + "Hash": "3ee025083e66f18db6cf27b56e23e141" + }, "renv": { "Package": "renv", "Version": "1.0.11", - "OS_type": null, - "Repository": "CRAN", - "Source": "Repository" + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "utils" + ], + "Hash": "47623f66b4e80b3b0587bc5d7b309888" }, "reshape2": { "Package": "reshape2", @@ -2517,6 +2681,32 @@ ], "Hash": "062470668513dcda416927085ee9bdc7" }, + "roxygen2": { + "Package": "roxygen2", + "Version": "7.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "brew", + "cli", + "commonmark", + "cpp11", + "desc", + "knitr", + "methods", + "pkgload", + "purrr", + "rlang", + "stringi", + "stringr", + "utils", + "withr", + "xml2" + ], + "Hash": "6ee25f9054a70f44d615300ed531ba8d" + }, "rprojroot": { "Package": "rprojroot", "Version": "2.0.4", @@ -2545,6 +2735,18 @@ ], "Hash": "b462187d887abc519894874486dbd6fd" }, + "rversions": { + "Package": "rversions", + "Version": "2.1.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "curl", + "utils", + "xml2" + ], + "Hash": "a9881dfed103e83f9de151dc17002cd1" + }, "sass": { "Package": "sass", "Version": "0.4.9", @@ -2707,6 +2909,19 @@ ], "Hash": "6d94b72071aefd6e8b041c34ee83ebd0" }, + "sessioninfo": { + "Package": "sessioninfo", + "Version": "1.2.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "tools", + "utils" + ], + "Hash": "3f9796a8d0a0e8c6eb49a4b029359d1f" + }, "shiny": { "Package": "shiny", "Version": "1.9.1", @@ -3158,6 +3373,20 @@ ], "Hash": "cfbad971a71f0e27cec22e544a08bc3b" }, + "urlchecker": { + "Package": "urlchecker", + "Version": "1.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "curl", + "tools", + "xml2" + ], + "Hash": "409328b8e1253c8d729a7836fe7f7a16" + }, "usethis": { "Package": "usethis", "Version": "3.0.0", @@ -3313,6 +3542,30 @@ ], "Hash": "36ab21660e2d095fef0d83f689e0477c" }, + "xml2": { + "Package": "xml2", + "Version": "1.3.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "methods", + "rlang" + ], + "Hash": "1d0336142f4cd25d8d23cd3ba7a8fb61" + }, + "xopen": { + "Package": "xopen", + "Version": "1.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "processx" + ], + "Hash": "423df1e86d5533fcb73c6b02b4923b49" + }, "xtable": { "Package": "xtable", "Version": "1.8-4", From 503ed27deddc12b8889685a16ee87b69274a7e23 Mon Sep 17 00:00:00 2001 From: Joshua Shapiro Date: Tue, 17 Dec 2024 11:01:19 -0500 Subject: [PATCH 4/4] add ci block to pre-commit --- .pre-commit-config.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 58c6d09..7dad153 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -41,3 +41,7 @@ repos: - id: no-debug-statement - id: deps-in-desc exclude: 'docker/.*|renv/.*|data-raw/.*' + +ci: + autofix_prs: true + autoupdate_schedule: quarterly