From 176c6ab4e26e31bde8507f2776235a9e2ad89692 Mon Sep 17 00:00:00 2001 From: Yichen Wang Date: Tue, 29 Oct 2024 13:29:07 -0400 Subject: [PATCH] Add one more visualization function, fixes towards cran check --- NAMESPACE | 1 + NEWS.md | 7 +- R/DEG_marker.R | 19 +--- R/GSEA.R | 28 +++-- R/classConversion.R | 5 +- R/classes.R | 2 +- R/data.R | 66 ++++++++++++ R/ggplotting.R | 8 +- R/h5Utility.R | 13 +-- R/integration.R | 5 +- R/preprocess.R | 2 +- R/util.R | 26 ++++- R/visualization.R | 100 ++++++++++++++++-- cran-comments.md | 4 +- data/deg.marker.rda | Bin 0 -> 63289 bytes data/deg.pw.rda | Bin 0 -> 36946 bytes man/deg.marker.Rd | 43 ++++++++ man/deg.pw.Rd | 49 +++++++++ man/dot-ggplotLigerTheme.Rd | 9 +- man/liger-class.Rd | 2 +- man/ligerToSeurat.Rd | 5 +- man/plotCellViolin.Rd | 2 +- man/plotClusterGeneViolin.Rd | 93 ++++++++++++++++ man/plotDimRed.Rd | 2 +- man/plotMarkerHeatmap.Rd | 8 +- man/plotPairwiseDEGHeatmap.Rd | 11 +- man/plotProportion.Rd | 2 +- man/plotProportionBox.Rd | 2 +- man/plotSpatial.Rd | 2 +- man/plotViolin.Rd | 2 +- man/plotVolcano.Rd | 11 +- man/runGOEnrich.Rd | 28 +++-- man/runOnlineINMF.Rd | 5 +- man/scaleNotCenter.Rd | 2 +- man/writeH5.Rd | 13 +-- tests/testthat/test_visualization.R | 15 ++- ...{liger-vignette.Rmd => liger_vignette.Rmd} | 19 ++-- 37 files changed, 482 insertions(+), 129 deletions(-) create mode 100644 data/deg.marker.rda create mode 100644 data/deg.pw.rda create mode 100644 man/deg.marker.Rd create mode 100644 man/deg.pw.Rd create mode 100644 man/plotClusterGeneViolin.Rd rename vignettes/{liger-vignette.Rmd => liger_vignette.Rmd} (92%) diff --git a/NAMESPACE b/NAMESPACE index c7c320a9..f6197d91 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -148,6 +148,7 @@ export(plotCellViolin) export(plotClusterDimRed) export(plotClusterFactorDot) export(plotClusterGeneDot) +export(plotClusterGeneViolin) export(plotClusterProportions) export(plotDatasetDimRed) export(plotDensityDimRed) diff --git a/NEWS.md b/NEWS.md index c2257505..0c45b0ae 100644 --- a/NEWS.md +++ b/NEWS.md @@ -13,19 +13,20 @@ - Pseudo-bulk should be easy because we are just aggregating cells. - Wilcoxon might be a bit harder because ranks are calculated per gene but the H5 sparse data is column majored. Might need to find a fast on-disk transposition method, which would also enhance RcppPlanc performance when running ANLS on H5 data. -## rliger 2.0.99 +## rliger 2.1.0 - Added `centroidAlign()` for new cell factor loading alignment method - Added `plotProportionBox()` for visualizing compositional analysis +- Added `plotClusterGeneViolin()` for visualizing gene expression in clusters - Added `plotBarcodeRank()` for basic QC visualization - Added `plotPairwiseDEGHeatmap()` for visualizing pairwise DEG results - Added `plotGODot()` for visualizing GO enrichment results - Added `calcNMI()` for evaluating clustering results against ground truth -- Added `ligerToH5AD()` allowing reticulate/Python free export of liger object to H5AD format. This might not be releasable due to the need of calling non-exported functions from *hdf5r* library. +- Added `ligerToH5AD()` allowing reticulate/Python free export of liger object to H5AD format. This is presented in extension source code (i.e. not loaded with `library(rliger)`). - Added organism support in `runGeneralQC()` and refined hemoglobin gene matching regex pattern. - Optimized DE test memory usage scalability for both pseudo-bulk method and wilcoxon test - Optimized `plotProportionPie()` by adding argument `circleColors` -- Optimized `plotVolcano()` text annotation positioning +- Optimized `plotVolcano()` text annotation positioning and gene highlighting logic. - Optimized visualization function additional argument documentation - Changed `runMarkerDEG()` and `runPairwiseDEG()` default method from `"wilcoxon"` to `"pseudoBulk"` - Fixed `runMarkerDEG(method = "pseudobulk")` bug in assigning pseudo-replicates, and optimized error/warning signaling. diff --git a/R/DEG_marker.R b/R/DEG_marker.R index cd9b3970..f9a446be 100644 --- a/R/DEG_marker.R +++ b/R/DEG_marker.R @@ -1080,15 +1080,11 @@ computePval <- function(ustat, ties, N, n1n2) { #' @param column_title Title on the column. Default \code{NULL}. #' @inheritDotParams plotGeneHeatmap cellAnnotation #' @inheritDotParams .plotHeatmap transpose showCellLabel showCellLegend showFeatureLabel cellAnnColList featureAnnColList scale trim baseSize cellTextSize featureTextSize cellTitleSize featureTitleSize legendTextSize legendTitleSize viridisOption viridisDirection RColorBrewerOption -#' @return A \linkS4class{HeatmapList} object. +#' @return A \link[ComplexHeatmap]{HeatmapList-class} object. #' @examples #' defaultCluster(pbmc) <- pbmcPlot$leiden_cluster -#' markerTable <- runMarkerDEG( -#' pbmc, -#' minCellPerRep = 5 -#' ) #' pbmc <- normalize(pbmc) -#' plotMarkerHeatmap(pbmc, markerTable) +#' plotMarkerHeatmap(pbmc, deg.marker) plotMarkerHeatmap <- function( object, result, @@ -1183,18 +1179,11 @@ plotMarkerHeatmap <- function( #' @param column_title Title on the column. Default \code{NULL}. #' @param seed Random seed for reproducibility. Default \code{1}. #' @inheritDotParams .plotHeatmap transpose showCellLabel showCellLegend showFeatureLabel cellAnnColList featureAnnColList scale trim baseSize cellTextSize featureTextSize cellTitleSize featureTitleSize legendTextSize legendTitleSize viridisOption viridisDirection RColorBrewerOption -#' @return A \linkS4class{HeatmapList} object. +#' @return A \link[ComplexHeatmap]{HeatmapList-class} object. #' @examples #' defaultCluster(pbmc) <- pbmcPlot$leiden_cluster -#' degTest <- runPairwiseDEG( -#' pbmc, -#' groupTest = "stim", -#' groupCtrl = "ctrl", -#' variable1 = "dataset", -#' splitBy = "defaultCluster" -#' ) #' pbmc <- normalize(pbmc) -#' plotPairwiseDEGHeatmap(pbmc, degTest, '4.stim') +#' plotPairwiseDEGHeatmap(pbmc, deg.pw, '4.stim') plotPairwiseDEGHeatmap <- function( object, result, diff --git a/R/GSEA.R b/R/GSEA.R index 4712067d..597b14f1 100644 --- a/R/GSEA.R +++ b/R/GSEA.R @@ -144,10 +144,19 @@ runGSEA <- function( #' up-regulated genes and should be preferred when \code{result} comes from #' marker detection test. When \code{result} comes from group-to-group DE test, #' it is recommended to set \code{splitReg = TRUE}. -#' @param ... Additional arguments passed to \code{gprofiler2::gost()}. +#' @param ... Additional arguments passed to \code{gprofiler2::gost()}. Useful +#' ones are: +#' +#' \describe{ +#' \item{\code{organism}}{The organism to be used for the analysis. "hsapiens" +#' for human, "mmusculus" for mouse.} +#' \item{\code{evcodes}}{Whether to include overlapping genes for each term. +#' Default \code{FALSE}.} +#' \item{\code{significant}}{Whether to filter out non-significant terms. +#' Default \code{TRUE}.} +#' } #' Arguments \code{query}, \code{custom_bg}, \code{domain_scope}, and -#' \code{ordered_query} are pre-specified by this wrapper function. Users must -#' set \code{organism = "mmusculus"} when working on mouse data. +#' \code{ordered_query} are pre-specified by this wrapper function. #' @references Kolberg, L. et al, 2020 and Raudvere, U. et al, 2019 #' @return A list object where each element is a result list for a group. Each #' result list contains two elements: @@ -157,22 +166,11 @@ runGSEA <- function( #' See \code{gprofiler2::gost()}. for detailed explanation. #' @export #' @examples -#' defaultCluster(pbmc) <- pbmcPlot$leiden_cluster -#' # Test the DEG between "stim" and "ctrl", within each cluster -#' result <- runPairwiseDEG( -#' pbmc, -#' groupTest = "stim", -#' groupCtrl = "ctrl", -#' variable1 = "dataset", -#' splitBy = "defaultCluster", -#' nPsdRep = 3, -#' minCellPerRep = 3 -#' ) #' # Setting `significant = FALSE` because it's hard for a gene list obtained #' # from small test dataset to represent real-life biology. #' \donttest{ #' if (requireNamespace("gprofiler2", quietly = TRUE)) { -#' go <- runGOEnrich(result, group = "0.stim", significant = FALSE) +#' go <- runGOEnrich(deg.pw, group = "0.stim", significant = FALSE) #' } #' } runGOEnrich <- function( diff --git a/R/classConversion.R b/R/classConversion.R index bb59e3d2..67a393de 100644 --- a/R/classConversion.R +++ b/R/classConversion.R @@ -272,7 +272,10 @@ as.ligerDataset.SingleCellExperiment <- function( #' "counts.stim". If \code{merge = TRUE}, return a single Seurat object with #' layers for all datasets merged. #' @examples -#' seu <- ligerToSeurat(pbmc) +#' if (requireNamespace("SeuratObject", quietly = TRUE) && +#' requireNamespace("Seurat", quietly = TRUE)) { +#' seu <- ligerToSeurat(pbmc) +#' } ligerToSeurat <- function( object, assay = NULL, diff --git a/R/classes.R b/R/classes.R index 798ea5a6..8ba9d762 100644 --- a/R/classes.R +++ b/R/classes.R @@ -167,7 +167,7 @@ setValidity("ligerDataset", .valid.ligerDataset) #' @slot datasets list of \linkS4class{ligerDataset} objects. Use generic #' \code{dataset}, \code{dataset<-}, \code{datasets} or \code{datasets<-} to #' interact with. See detailed section accordingly. -#' @slot cellMeta \linkS4class{DFrame} object for cell metadata. Pre-existing +#' @slot cellMeta \link[S4Vectors]{DFrame} object for cell metadata. Pre-existing #' metadata, QC metrics, cluster labeling and etc. are all stored here. Use #' generic \code{cellMeta}, \code{cellMeta<-}, \code{$}, \code{[[]]} or #' \code{[[]]<-} to interact with. See detailed section accordingly. diff --git a/R/data.R b/R/data.R index 6269e1f2..54f48de2 100644 --- a/R/data.R +++ b/R/data.R @@ -22,3 +22,69 @@ #' @source https://www.nature.com/articles/s41587-019-0332-7 #' @references Jeffrey M. Granja and et. al., Nature Biotechnology, 2019 "bmmc" + +#' Data frame for example marker DEG test result +#' @description +#' The data frame is the direct output of marker detection DEG test applied on +#' example dataset which can be loaded with \code{data("pbmc")}. The DEG test +#' was done with: +#' ``` +#' defaultCluster(pbmc) <- pbmcPlot$leiden_cluster +#' deg.marker <- runMarkerDEG( +#' pbmc, +#' minCellPerRep = 5 +#' ) +#' ```` +#' The result is for the marker detection test for 8 clusters in the dataset by +#' comparing each cluster against all other clusters. +#' @seealso [runMarkerDEG()] +#' @format data.frame object of 1992 rows with columns: +#' \itemize{ +#' \item feature: gene names, 249 unique genes repeated 8 times for the tests +#' done for 8 clusters. +#' \item group: cluster names, 8 unique cluster names, dividing the tests. +#' \item logFC: log fold change of the gene expression between the cluster of +#' interest against all other clusters. +#' \item pval: p-value of the DEG test. +#' \item padj: adjusted p-value of the DEG test. +#' \item pct_in: percentage of cells in the cluster of interest expressing the +#' gene. +#' \item pct_out: percentage of cells in all other clusters expressing the gene. +#' } +"deg.marker" + +#' Data frame for example pairwise DEG test result +#' @description +#' The data frame is the direct output of pairwise DEG test applied on example +#' dataset which can be loaded with \code{data("pbmc")}. The DEG test was done +#' with: +#' ``` +#' defaultCluster(pbmc) <- pbmcPlot$leiden_cluster +#' degTest <- runPairwiseDEG( +#' pbmc, +#' groupTest = "stim", +#' groupCtrl = "ctrl", +#' variable1 = "dataset", +#' splitBy = "defaultCluster" +#' )` +#' ``` +#' The result is for the DEG test split for each cluster in the dataset, and +#' within each cluster, compare the cells from "stim" against the cells from +#' "ctrl". +#' @seealso [runPairwiseDEG()] +#' @format data.frame object of 1743 rows with columns: +#' \itemize{ +#' \item feature: gene names, 249 unique genes repeated 7 times for the tests +#' done for 7 clusters. (1 less cluster than in \code{\link{deg.marker}} due to +#' too tiny sample size in the smallest cluster) +#' \item group: cluster names, 7 unique cluster names, dividing the tests. +#' \item logFC: log fold change of the gene expression between the condition of +#' interest against the control condition. +#' \item pval: p-value of the DEG test. +#' \item padj: adjusted p-value of the DEG test. +#' \item pct_in: percentage of cells in the condition of interest expressing the +#' gene. +#' \item pct_out: percentage of cells in the control condition expressing the +#' gene. +#' } +"deg.pw" diff --git a/R/ggplotting.R b/R/ggplotting.R index 695fd5e5..b34da677 100644 --- a/R/ggplotting.R +++ b/R/ggplotting.R @@ -616,8 +616,10 @@ plotCellViolin <- function( #' \code{baseSize + 2}. #' @param subtitleSize,xTextSize,yTextSize,legendTextSize Size of subtitle text, #' axis texts and legend text. Default \code{NULL} controls by \code{baseSize}. -#' @param xFacetSize,yFacetSize Size of facet label text. Default \code{NULL} -#' controls by \code{baseSize - 2}. +#' @param xFacetSize Size of facet strip label text on x-axis. Default +#' \code{NULL} controls by \code{baseSize - 2}. +#' @param yFacetSize Size of facet strip label text on y-axis. Default +#' \code{NULL} controls by \code{baseSize - 2}. #' @param legendDotSize Allow dots in legend region to be large enough to see #' the colors/shapes clearly. Default \code{4}. #' @param panelBorder Whether to show rectangle border of the panel instead of @@ -631,7 +633,7 @@ plotCellViolin <- function( #' presented, otherwise ggplot hues. #' @param legendNRow,legendNCol Integer, when too many categories in one #' variable, arranges number of rows or columns. Default \code{NULL}, -#' automatically split to \code{ceiling(levels(variable)/10)} columns. +#' automatically split to \code{ceiling(levels(variable)/15)} columns. #' @param colorPalette For continuous coloring, an index or a palette name to #' select from available options from ggplot #' \code{\link[ggplot2]{scale_brewer}} or \code{\link[viridisLite]{viridis}}. diff --git a/R/h5Utility.R b/R/h5Utility.R index bd0c401b..2c9fbc8d 100644 --- a/R/h5Utility.R +++ b/R/h5Utility.R @@ -361,17 +361,18 @@ closeAllH5.ligerDataset <- function(object) { #' Basing on the goal of the whole workflow, the data will always be written #' in a CSC matrix format and colnames/rownames are always required. #' -#' The default method coerces the input to a \linkS4class{dgCMatrix}. Methods -#' for other container classes tries to extract proper data and calls the -#' default method. +#' The default method coerces the input to a \link[Matrix]{dgCMatrix-class} +#' object. Methods for other container classes tries to extract proper data and +#' calls the default method. #' @param x An object with in-memory data to be written into H5 file. #' @param file A character string of the file path to be written. #' @param overwrite Logical, whether to overwrite the file if it already exists. #' Default \code{FALSE}. #' @param indicesPath,indptrPath,dataPath The paths inside the H5 file where -#' the \linkS4class{dgCMatrix} constructor \code{i}, \code{p}, and \code{x} will -#' be written to, respectively. Default using cellranger convention -#' \code{"matrix/indices"}, \code{"matrix/indptr"}, and \code{"matrix/data"}. +#' the \link[Matrix]{dgCMatrix-class} constructor \code{i}, \code{p}, and +#' \code{x} will be written to, respectively. Default using cellranger +#' convention \code{"matrix/indices"}, \code{"matrix/indptr"}, and +#' \code{"matrix/data"}. #' @param shapePath The path inside the H5 file where the shape of the matrix #' will be written to. Default \code{"matrix/shape"}. #' @param barcodesPath The path inside the H5 file where the barcodes/colnames diff --git a/R/integration.R b/R/integration.R index 8368fdcf..b441bb94 100644 --- a/R/integration.R +++ b/R/integration.R @@ -582,8 +582,9 @@ optimizeALS <- function( # nocov start #' matrices with a single Seurat object. We strongly recommend that users create #' a \linkS4class{liger} object which has the specific structure. #' @param object \linkS4class{liger} object. Scaled data required. -#' @param newDatasets Named list of \linkS4class{dgCMatrix}. New datasets for -#' scenario 2 or scenario 3. Default \code{NULL} triggers scenario 1. +#' @param newDatasets Named list of \link[Matrix]{dgCMatrix-class} object. New +#' datasets for scenario 2 or scenario 3. Default \code{NULL} triggers scenario +#' 1. #' @param projection Whether to perform data integration with scenario 3 when #' \code{newDatasets} is specified. See description. Default \code{FALSE}. #' @param WInit,VInit,AInit,BInit Optional initialization for \eqn{W}, \eqn{V}, diff --git a/R/preprocess.R b/R/preprocess.R index 3a0b001e..ecbcd9b7 100644 --- a/R/preprocess.R +++ b/R/preprocess.R @@ -1339,7 +1339,7 @@ selectGenesVST <- function( #' done by doing \code{scaleNotCenter(lig, useDataset = c("other", "datasets"))}, #' and then \code{\link{reverseMethData}(lig, useDataset = c("meth", "datasets"))}. #' @param object \linkS4class{liger} object, \linkS4class{ligerDataset} object, -#' \linkS4class{dgCMatrix}, or a Seurat object. +#' \link[Matrix]{dgCMatrix-class} object, or a Seurat object. #' @param ... Arguments passed to other methods. The order goes by: "liger" #' method calls "ligerDataset" method", which then calls "dgCMatrix" method. #' "Seurat" method directly calls "dgCMatrix" method. diff --git a/R/util.R b/R/util.R index 9d954839..d85ff88a 100644 --- a/R/util.R +++ b/R/util.R @@ -447,7 +447,7 @@ cli_or <- function(x) cli::cli_vec(x, list("vec-last" = " or ")) cli::cli_abort( "Package {.pkg scattermore} is needed for rasterizing the scatter plot. Please install it by command: - {.code BiocManager::install('scattermore')}" + {.code install.packages('scattermore')}" ) } } @@ -679,3 +679,27 @@ searchH <- function(object, useRaw = NULL) { } return(list(H = H, useRaw = useRaw)) } + + +.pivot_longer <- function( + data, + cols, + names_to = "name", + values_to = "value" +) { + if (is.numeric(cols) || is.logical(cols)) cols <- colnames(data)[cols] + if (!is.character(cols)) + cli::cli_abort("`cols` should be a character vector.") + keeps <- setdiff(colnames(data), cols) + blocks <- lapply(cols, function(col) { + len <- nrow(data) + blockData <- list() + blockData[[names_to]] <- rep(col, len) + blockData[[values_to]] <- data[[col]] + for (keep in keeps) { + blockData[[keep]] <- data[[keep]] + } + as.data.frame(blockData) + }) + do.call(rbind, blocks) +} diff --git a/R/visualization.R b/R/visualization.R index 01c7572e..84dbcae6 100644 --- a/R/visualization.R +++ b/R/visualization.R @@ -327,6 +327,95 @@ plotGeneDetectedViolin <- function( ylab = "Number of Genes Detected", ...) } + +#' Create violin plot for multiple genes grouped by clusters +#' @description +#' Make violin plots for each given gene grouped by cluster variable and stack +#' along y axis. +#' +#' @details +#' If \code{xlab} need to be set, set \code{xlabAngle} at the same time. This is +#' due to that the argument parsing mechanism will partially match it to main +#' function arguments before matching the \code{...} arguments. +#' @param object A \linkS4class{liger} object. +#' @param gene Character vector of gene names. +#' @param groupBy Names of available categorical variable in \code{cellMeta} +#' slot. Use \code{FALSE} for no grouping. Default \code{NULL} looks clustering +#' result but will not group if no clustering found. +#' @param box Logical, whether to add boxplot. Default \code{FALSE}. +#' @param boxAlpha Numeric, transparency of boxplot. Default \code{0.1}. +#' @param yFunc Function to transform the y-axis. Default is +#' \code{log1p(x*1e4)}. Set to \code{NULL} for no transformation. +#' @param showLegend Whether to show the legend. Default \code{FALSE}. +#' @param xlabAngle Numeric, counter-clockwise rotation angle in degrees of X +#' axis label text. Default \code{40}. +#' @inheritDotParams .ggplotLigerTheme title subtitle xlab ylab legendFillTitle legendPosition baseSize titleSize xTitleSize yTitleSize legendTitleSize subtitleSize xTextSize yTextSize legendTextSize yFacetSize panelBorder legendNRow legendNCol colorLabels colorValues plotly +#' @return A ggplot object. +#' @export +#' @examples +#' plotClusterGeneViolin(pbmcPlot, varFeatures(pbmcPlot)[1:10]) +plotClusterGeneViolin <- function( + object, + gene, + groupBy = NULL, + box = FALSE, + boxAlpha = 0.1, + yFunc = function(x) log1p(x*1e4), + showLegend = FALSE, + xlabAngle = 40, + ... +) { + groupBy <- groupBy %||% object@uns$defaultCluster + gene <- unique(gene) + featureDF <- retrieveCellFeature(object, gene, slot = "normData") + # Account for the case where the gene is not detected in any cell + ngene <- ncol(featureDF) + geneUse <- gene[gene %in% colnames(featureDF)] + if (!is.null(yFunc)) featureDF <- as.data.frame(apply(featureDF, 2, yFunc)) + if (!isFALSE(groupBy)) { + featureDF[[groupBy]] <- .fetchCellMetaVar( + object = object, + variables = groupBy, + checkCategorical = TRUE + ) + } else { + groupBy <- "group" + featureDF[[groupBy]] <- factor("All") + } + p <- featureDF %>% + .pivot_longer( + cols = seq(ngene), + names_to = "gene", + values_to = "Expression" + ) %>% + dplyr::mutate(gene = factor(.data[["gene"]], levels = geneUse)) %>% + ggplot2::ggplot(ggplot2::aes( + x = .data[[groupBy]], + y = .data[["Expression"]], + fill = .data[[groupBy]] + )) + + ggplot2::geom_violin() + if (isTRUE(box)) { + p <- p + ggplot2::geom_boxplot(alpha = boxAlpha) + } + p <- p + + ggplot2::facet_wrap( + stats::formula("~gene"), + scales = "free_y", + nrow = ngene, + strip.position = "left" + ) + .ggplotLigerTheme( + p, + showLegend = showLegend, + xlabAngle = xlabAngle, + ... + ) +} + + + + #' Create barcode-rank plot for each dataset #' @description #' This function ranks the total count of each cell within each dataset and make @@ -795,16 +884,7 @@ plotProportionBox <- function( #' @return ggplot #' @export #' @examples -#' defaultCluster(pbmc) <- pbmcPlot$leiden_cluster -#' # Test the DEG between "stim" and "ctrl", within each cluster -#' result <- runPairwiseDEG( -#' pbmc, -#' groupTest = "stim", -#' groupCtrl = "ctrl", -#' variable1 = "dataset", -#' splitBy = "defaultCluster" -#' ) -#' plotVolcano(result, "0.stim") +#' plotVolcano(deg.pw, "0.stim") plotVolcano <- function( result, group = NULL, diff --git a/cran-comments.md b/cran-comments.md index d43a8c8a..0772fc29 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,4 +1,4 @@ -# rliger 2.0.0 +# rliger 2.1.0 ## R CMD check results @@ -15,6 +15,8 @@ Suggests or Enhances not in mainstream repositories: Availability using Additional_repositories specification: DoubletFinder yes https://blaserlab.r-universe.dev RcppPlanc yes https:/welch-lab.r-universe.dev + +Package has a VignetteBuilder field but no prebuilt vignette index. ``` ``` diff --git a/data/deg.marker.rda b/data/deg.marker.rda new file mode 100644 index 0000000000000000000000000000000000000000..77622a85b05a69da1555a4ef2bc5869d0206b453 GIT binary patch literal 63289 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 Uy#M(9Q~!&(BAh5lc2a4{0RLffHvj+t literal 0 HcmV?d00001 diff --git a/data/deg.pw.rda b/data/deg.pw.rda new file mode 100644 index 0000000000000000000000000000000000000000..90433f1438652b3898762890adcf149a605ce858 GIT binary patch literal 36946 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 literal 0 HcmV?d00001 diff --git a/man/deg.marker.Rd b/man/deg.marker.Rd new file mode 100644 index 00000000..4040cee3 --- /dev/null +++ b/man/deg.marker.Rd @@ -0,0 +1,43 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data.R +\docType{data} +\name{deg.marker} +\alias{deg.marker} +\title{Data frame for example marker DEG test result} +\format{ +data.frame object of 1992 rows with columns: +\itemize{ +\item feature: gene names, 249 unique genes repeated 8 times for the tests +done for 8 clusters. +\item group: cluster names, 8 unique cluster names, dividing the tests. +\item logFC: log fold change of the gene expression between the cluster of +interest against all other clusters. +\item pval: p-value of the DEG test. +\item padj: adjusted p-value of the DEG test. +\item pct_in: percentage of cells in the cluster of interest expressing the +gene. +\item pct_out: percentage of cells in all other clusters expressing the gene. +} +} +\usage{ +deg.marker +} +\description{ +The data frame is the direct output of marker detection DEG test applied on +example dataset which can be loaded with \code{data("pbmc")}. The DEG test +was done with: + +\if{html}{\out{
}}\preformatted{defaultCluster(pbmc) <- pbmcPlot$leiden_cluster +deg.marker <- runMarkerDEG( + pbmc, + minCellPerRep = 5 +) +}\if{html}{\out{
}} + +The result is for the marker detection test for 8 clusters in the dataset by +comparing each cluster against all other clusters. +} +\seealso{ +\code{\link[=runMarkerDEG]{runMarkerDEG()}} +} +\keyword{datasets} diff --git a/man/deg.pw.Rd b/man/deg.pw.Rd new file mode 100644 index 00000000..e3985cb6 --- /dev/null +++ b/man/deg.pw.Rd @@ -0,0 +1,49 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data.R +\docType{data} +\name{deg.pw} +\alias{deg.pw} +\title{Data frame for example pairwise DEG test result} +\format{ +data.frame object of 1743 rows with columns: +\itemize{ +\item feature: gene names, 249 unique genes repeated 7 times for the tests +done for 7 clusters. (1 less cluster than in \code{\link{deg.marker}} due to +too tiny sample size in the smallest cluster) +\item group: cluster names, 7 unique cluster names, dividing the tests. +\item logFC: log fold change of the gene expression between the condition of +interest against the control condition. +\item pval: p-value of the DEG test. +\item padj: adjusted p-value of the DEG test. +\item pct_in: percentage of cells in the condition of interest expressing the +gene. +\item pct_out: percentage of cells in the control condition expressing the +gene. +} +} +\usage{ +deg.pw +} +\description{ +The data frame is the direct output of pairwise DEG test applied on example +dataset which can be loaded with \code{data("pbmc")}. The DEG test was done +with: + +\if{html}{\out{
}}\preformatted{defaultCluster(pbmc) <- pbmcPlot$leiden_cluster +degTest <- runPairwiseDEG( + pbmc, + groupTest = "stim", + groupCtrl = "ctrl", + variable1 = "dataset", + splitBy = "defaultCluster" +)` +}\if{html}{\out{
}} + +The result is for the DEG test split for each cluster in the dataset, and +within each cluster, compare the cells from "stim" against the cells from +"ctrl". +} +\seealso{ +\code{\link[=runPairwiseDEG]{runPairwiseDEG()}} +} +\keyword{datasets} diff --git a/man/dot-ggplotLigerTheme.Rd b/man/dot-ggplotLigerTheme.Rd index 7fa2061d..281670c3 100644 --- a/man/dot-ggplotLigerTheme.Rd +++ b/man/dot-ggplotLigerTheme.Rd @@ -87,8 +87,11 @@ axis titles and legend title. Default \code{NULL} controls by \item{subtitleSize, xTextSize, yTextSize, legendTextSize}{Size of subtitle text, axis texts and legend text. Default \code{NULL} controls by \code{baseSize}.} -\item{xFacetSize, yFacetSize}{Size of facet label text. Default \code{NULL} -controls by \code{baseSize - 2}.} +\item{xFacetSize}{Size of facet strip label text on x-axis. Default +\code{NULL} controls by \code{baseSize - 2}.} + +\item{yFacetSize}{Size of facet strip label text on y-axis. Default +\code{NULL} controls by \code{baseSize - 2}.} \item{legendDotSize}{Allow dots in legend region to be large enough to see the colors/shapes clearly. Default \code{4}.} @@ -98,7 +101,7 @@ using ggplot classic bottom and left axis lines. Default \code{FALSE}.} \item{legendNRow, legendNCol}{Integer, when too many categories in one variable, arranges number of rows or columns. Default \code{NULL}, -automatically split to \code{ceiling(levels(variable)/10)} columns.} +automatically split to \code{ceiling(levels(variable)/15)} columns.} \item{colorLabels}{Character vector for modifying category names in a color legend. Passed to \code{ggplot2::scale_color_manual(labels)}. Default diff --git a/man/liger-class.Rd b/man/liger-class.Rd index 68a2ee80..cb4c8405 100644 --- a/man/liger-class.Rd +++ b/man/liger-class.Rd @@ -399,7 +399,7 @@ please try updating the objects individually with \code{dataset}, \code{dataset<-}, \code{datasets} or \code{datasets<-} to interact with. See detailed section accordingly.} -\item{\code{cellMeta}}{\linkS4class{DFrame} object for cell metadata. Pre-existing +\item{\code{cellMeta}}{\link[S4Vectors]{DFrame} object for cell metadata. Pre-existing metadata, QC metrics, cluster labeling and etc. are all stored here. Use generic \code{cellMeta}, \code{cellMeta<-}, \code{$}, \code{[[]]} or \code{[[]]<-} to interact with. See detailed section accordingly.} diff --git a/man/ligerToSeurat.Rd b/man/ligerToSeurat.Rd index 676e35b2..c3f20471 100644 --- a/man/ligerToSeurat.Rd +++ b/man/ligerToSeurat.Rd @@ -57,5 +57,8 @@ conversion if your \linkS4class{liger} object contains datasets from various modalities. } \examples{ -seu <- ligerToSeurat(pbmc) +if (requireNamespace("SeuratObject", quietly = TRUE) && + requireNamespace("Seurat", quietly = TRUE)) { + seu <- ligerToSeurat(pbmc) +} } diff --git a/man/plotCellViolin.Rd b/man/plotCellViolin.Rd index c3f8d319..f7cb0dbb 100644 --- a/man/plotCellViolin.Rd +++ b/man/plotCellViolin.Rd @@ -94,7 +94,7 @@ Default \code{NULL} uses internal selected palette when <= 26 categories are presented, otherwise ggplot hues.} \item{\code{legendNRow,legendNCol}}{Integer, when too many categories in one variable, arranges number of rows or columns. Default \code{NULL}, -automatically split to \code{ceiling(levels(variable)/10)} columns.} +automatically split to \code{ceiling(levels(variable)/15)} columns.} \item{\code{plotly}}{Whether to use plotly to enable web based interactive browsing for the plot. Requires installation of package "plotly". Default \code{FALSE}.} diff --git a/man/plotClusterGeneViolin.Rd b/man/plotClusterGeneViolin.Rd new file mode 100644 index 00000000..ce005f42 --- /dev/null +++ b/man/plotClusterGeneViolin.Rd @@ -0,0 +1,93 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/visualization.R +\name{plotClusterGeneViolin} +\alias{plotClusterGeneViolin} +\title{Create violin plot for multiple genes grouped by clusters} +\usage{ +plotClusterGeneViolin( + object, + gene, + groupBy = NULL, + box = FALSE, + boxAlpha = 0.1, + yFunc = function(x) log1p(x * 10000), + showLegend = FALSE, + xlabAngle = 40, + ... +) +} +\arguments{ +\item{object}{A \linkS4class{liger} object.} + +\item{gene}{Character vector of gene names.} + +\item{groupBy}{Names of available categorical variable in \code{cellMeta} +slot. Use \code{FALSE} for no grouping. Default \code{NULL} looks clustering +result but will not group if no clustering found.} + +\item{box}{Logical, whether to add boxplot. Default \code{FALSE}.} + +\item{boxAlpha}{Numeric, transparency of boxplot. Default \code{0.1}.} + +\item{yFunc}{Function to transform the y-axis. Default is +\code{log1p(x*1e4)}. Set to \code{NULL} for no transformation.} + +\item{showLegend}{Whether to show the legend. Default \code{FALSE}.} + +\item{xlabAngle}{Numeric, counter-clockwise rotation angle in degrees of X +axis label text. Default \code{40}.} + +\item{...}{ + Arguments passed on to \code{\link[=.ggplotLigerTheme]{.ggplotLigerTheme}} + \describe{ + \item{\code{title,subtitle,xlab,ylab}}{Main title, subtitle or X/Y axis title text. +By default, no main title or subtitle will be set, and X/Y axis title will be +the names of variables used for plotting. Use \code{NULL} to hide elements. +\code{TRUE} for \code{xlab} or \code{ylab} shows default values.} + \item{\code{legendFillTitle}}{Legend title text for fill aesthetics, often used for +violin, box, bar plots. Default \code{NULL} shows the original variable name.} + \item{\code{legendPosition}}{Text indicating where to place the legend. Choose from +\code{"top"}, \code{"bottom"}, \code{"left"} or \code{"right"}. Default +\code{"right"}.} + \item{\code{baseSize}}{One-parameter control of all text sizes. Individual text +element sizes can be controlled by other size arguments. "Title" sizes are +2 points larger than "text" sizes when being controlled by this.} + \item{\code{titleSize,xTitleSize,yTitleSize,legendTitleSize}}{Size of main title, +axis titles and legend title. Default \code{NULL} controls by +\code{baseSize + 2}.} + \item{\code{subtitleSize,xTextSize,yTextSize,legendTextSize}}{Size of subtitle text, +axis texts and legend text. Default \code{NULL} controls by \code{baseSize}.} + \item{\code{yFacetSize}}{Size of facet strip label text on y-axis. Default +\code{NULL} controls by \code{baseSize - 2}.} + \item{\code{panelBorder}}{Whether to show rectangle border of the panel instead of +using ggplot classic bottom and left axis lines. Default \code{FALSE}.} + \item{\code{colorLabels}}{Character vector for modifying category names in a +color legend. Passed to \code{ggplot2::scale_color_manual(labels)}. Default +\code{NULL} uses original levels of the factor.} + \item{\code{colorValues}}{Character vector of colors for modifying category colors +in a color legend. Passed to \code{ggplot2::scale_color_manual(values)}. +Default \code{NULL} uses internal selected palette when <= 26 categories are +presented, otherwise ggplot hues.} + \item{\code{legendNRow,legendNCol}}{Integer, when too many categories in one +variable, arranges number of rows or columns. Default \code{NULL}, +automatically split to \code{ceiling(levels(variable)/15)} columns.} + \item{\code{plotly}}{Whether to use plotly to enable web based interactive browsing +for the plot. Requires installation of package "plotly". Default +\code{FALSE}.} + }} +} +\value{ +A ggplot object. +} +\description{ +Make violin plots for each given gene grouped by cluster variable and stack +along y axis. +} +\details{ +If \code{xlab} need to be set, set \code{xlabAngle} at the same time. This is +due to that the argument parsing mechanism will partially match it to main +function arguments before matching the \code{...} arguments. +} +\examples{ +plotClusterGeneViolin(pbmcPlot, varFeatures(pbmcPlot)[1:10]) +} diff --git a/man/plotDimRed.Rd b/man/plotDimRed.Rd index f7e39c54..f22513e7 100644 --- a/man/plotDimRed.Rd +++ b/man/plotDimRed.Rd @@ -163,7 +163,7 @@ Default \code{NULL} uses internal selected palette when <= 26 categories are presented, otherwise ggplot hues.} \item{\code{legendNRow,legendNCol}}{Integer, when too many categories in one variable, arranges number of rows or columns. Default \code{NULL}, -automatically split to \code{ceiling(levels(variable)/10)} columns.} +automatically split to \code{ceiling(levels(variable)/15)} columns.} \item{\code{colorDirection}}{Choose \code{1} or \code{-1}. Applied when \code{colorPalette} is from Viridis options. Default \code{-1} use darker color for higher value, while \code{1} reverses this direction.} diff --git a/man/plotMarkerHeatmap.Rd b/man/plotMarkerHeatmap.Rd index 71e599da..66a1a391 100644 --- a/man/plotMarkerHeatmap.Rd +++ b/man/plotMarkerHeatmap.Rd @@ -89,17 +89,13 @@ mapped with \code{\link[RColorBrewer]{brewer.pal}}. This is passed to }} } \value{ -A \linkS4class{HeatmapList} object. +A \link[ComplexHeatmap]{HeatmapList-class} object. } \description{ Create heatmap for showing top marker expression in conditions } \examples{ defaultCluster(pbmc) <- pbmcPlot$leiden_cluster -markerTable <- runMarkerDEG( - pbmc, - minCellPerRep = 5 -) pbmc <- normalize(pbmc) -plotMarkerHeatmap(pbmc, markerTable) +plotMarkerHeatmap(pbmc, deg.marker) } diff --git a/man/plotPairwiseDEGHeatmap.Rd b/man/plotPairwiseDEGHeatmap.Rd index 194971e1..37e1637a 100644 --- a/man/plotPairwiseDEGHeatmap.Rd +++ b/man/plotPairwiseDEGHeatmap.Rd @@ -88,20 +88,13 @@ mapped with \code{\link[RColorBrewer]{brewer.pal}}. This is passed to }} } \value{ -A \linkS4class{HeatmapList} object. +A \link[ComplexHeatmap]{HeatmapList-class} object. } \description{ Create heatmap for pairwise DEG analysis result } \examples{ defaultCluster(pbmc) <- pbmcPlot$leiden_cluster -degTest <- runPairwiseDEG( - pbmc, - groupTest = "stim", - groupCtrl = "ctrl", - variable1 = "dataset", - splitBy = "defaultCluster" -) pbmc <- normalize(pbmc) -plotPairwiseDEGHeatmap(pbmc, degTest, '4.stim') +plotPairwiseDEGHeatmap(pbmc, deg.pw, '4.stim') } diff --git a/man/plotProportion.Rd b/man/plotProportion.Rd index c3a54555..0189f40c 100644 --- a/man/plotProportion.Rd +++ b/man/plotProportion.Rd @@ -89,7 +89,7 @@ Default \code{NULL} uses internal selected palette when <= 26 categories are presented, otherwise ggplot hues.} \item{\code{legendNRow,legendNCol}}{Integer, when too many categories in one variable, arranges number of rows or columns. Default \code{NULL}, -automatically split to \code{ceiling(levels(variable)/10)} columns.} +automatically split to \code{ceiling(levels(variable)/15)} columns.} \item{\code{colorPalette}}{For continuous coloring, an index or a palette name to select from available options from ggplot \code{\link[ggplot2]{scale_brewer}} or \code{\link[viridisLite]{viridis}}. diff --git a/man/plotProportionBox.Rd b/man/plotProportionBox.Rd index 7b52814d..e487faaf 100644 --- a/man/plotProportionBox.Rd +++ b/man/plotProportionBox.Rd @@ -74,7 +74,7 @@ Default \code{NULL} uses internal selected palette when <= 26 categories are presented, otherwise ggplot hues.} \item{\code{legendNRow,legendNCol}}{Integer, when too many categories in one variable, arranges number of rows or columns. Default \code{NULL}, -automatically split to \code{ceiling(levels(variable)/10)} columns.} +automatically split to \code{ceiling(levels(variable)/15)} columns.} \item{\code{colorPalette}}{For continuous coloring, an index or a palette name to select from available options from ggplot \code{\link[ggplot2]{scale_brewer}} or \code{\link[viridisLite]{viridis}}. diff --git a/man/plotSpatial.Rd b/man/plotSpatial.Rd index 8084b5f2..2cdcddf3 100644 --- a/man/plotSpatial.Rd +++ b/man/plotSpatial.Rd @@ -66,7 +66,7 @@ Default \code{NULL} uses internal selected palette when <= 26 categories are presented, otherwise ggplot hues.} \item{\code{legendNRow,legendNCol}}{Integer, when too many categories in one variable, arranges number of rows or columns. Default \code{NULL}, -automatically split to \code{ceiling(levels(variable)/10)} columns.} +automatically split to \code{ceiling(levels(variable)/15)} columns.} \item{\code{naColor}}{The color code for \code{NA} values. Default \code{"#DEDEDE"}. \code{\link[ggplot2]{scale_colour_gradient2}}. Default \code{NULL}.} }} diff --git a/man/plotViolin.Rd b/man/plotViolin.Rd index 475b07e3..35c8f01e 100644 --- a/man/plotViolin.Rd +++ b/man/plotViolin.Rd @@ -78,7 +78,7 @@ Default \code{NULL} uses internal selected palette when <= 26 categories are presented, otherwise ggplot hues.} \item{\code{legendNRow,legendNCol}}{Integer, when too many categories in one variable, arranges number of rows or columns. Default \code{NULL}, -automatically split to \code{ceiling(levels(variable)/10)} columns.} +automatically split to \code{ceiling(levels(variable)/15)} columns.} \item{\code{plotly}}{Whether to use plotly to enable web based interactive browsing for the plot. Requires installation of package "plotly". Default \code{FALSE}.} diff --git a/man/plotVolcano.Rd b/man/plotVolcano.Rd index 945ca21e..35a61614 100644 --- a/man/plotVolcano.Rd +++ b/man/plotVolcano.Rd @@ -97,14 +97,5 @@ labeling, whereas \code{highlight} is considered first. If both are as default (\code{NULL}), all significant features will be labeled. } \examples{ -defaultCluster(pbmc) <- pbmcPlot$leiden_cluster -# Test the DEG between "stim" and "ctrl", within each cluster -result <- runPairwiseDEG( - pbmc, - groupTest = "stim", - groupCtrl = "ctrl", - variable1 = "dataset", - splitBy = "defaultCluster" -) -plotVolcano(result, "0.stim") +plotVolcano(deg.pw, "0.stim") } diff --git a/man/runGOEnrich.Rd b/man/runGOEnrich.Rd index 273b6bdc..07c5b54a 100644 --- a/man/runGOEnrich.Rd +++ b/man/runGOEnrich.Rd @@ -42,10 +42,19 @@ up-regulated genes and should be preferred when \code{result} comes from marker detection test. When \code{result} comes from group-to-group DE test, it is recommended to set \code{splitReg = TRUE}.} -\item{...}{Additional arguments passed to \code{gprofiler2::gost()}. +\item{...}{Additional arguments passed to \code{gprofiler2::gost()}. Useful +ones are: + +\describe{ +\item{\code{organism}}{The organism to be used for the analysis. "hsapiens" +for human, "mmusculus" for mouse.} +\item{\code{evcodes}}{Whether to include overlapping genes for each term. +Default \code{FALSE}.} +\item{\code{significant}}{Whether to filter out non-significant terms. +Default \code{TRUE}.} +} Arguments \code{query}, \code{custom_bg}, \code{domain_scope}, and -\code{ordered_query} are pre-specified by this wrapper function. Users must -set \code{organism = "mmusculus"} when working on mouse data.} +\code{ordered_query} are pre-specified by this wrapper function.} } \value{ A list object where each element is a result list for a group. Each @@ -60,22 +69,11 @@ This function forms genesets basing on the differential expression result, and calls gene ontology (GO) analysis method provided by gprofiler2. } \examples{ -defaultCluster(pbmc) <- pbmcPlot$leiden_cluster -# Test the DEG between "stim" and "ctrl", within each cluster -result <- runPairwiseDEG( - pbmc, - groupTest = "stim", - groupCtrl = "ctrl", - variable1 = "dataset", - splitBy = "defaultCluster", - nPsdRep = 3, - minCellPerRep = 3 -) # Setting `significant = FALSE` because it's hard for a gene list obtained # from small test dataset to represent real-life biology. \donttest{ if (requireNamespace("gprofiler2", quietly = TRUE)) { - go <- runGOEnrich(result, group = "0.stim", significant = FALSE) + go <- runGOEnrich(deg.pw, group = "0.stim", significant = FALSE) } } } diff --git a/man/runOnlineINMF.Rd b/man/runOnlineINMF.Rd index 7d34b7a5..c36905e0 100644 --- a/man/runOnlineINMF.Rd +++ b/man/runOnlineINMF.Rd @@ -59,8 +59,9 @@ as 1.0 may improve reconstruction quality. Default \code{5.0}.} \item{...}{Arguments passed to other S3 methods of this function.} -\item{newDatasets}{Named list of \linkS4class{dgCMatrix}. New datasets for -scenario 2 or scenario 3. Default \code{NULL} triggers scenario 1.} +\item{newDatasets}{Named list of \link[Matrix]{dgCMatrix-class} object. New +datasets for scenario 2 or scenario 3. Default \code{NULL} triggers scenario +1.} \item{projection}{Whether to perform data integration with scenario 3 when \code{newDatasets} is specified. See description. Default \code{FALSE}.} diff --git a/man/scaleNotCenter.Rd b/man/scaleNotCenter.Rd index 135cefad..68e221ce 100644 --- a/man/scaleNotCenter.Rd +++ b/man/scaleNotCenter.Rd @@ -49,7 +49,7 @@ scaleNotCenter(object, ...) } \arguments{ \item{object}{\linkS4class{liger} object, \linkS4class{ligerDataset} object, -\linkS4class{dgCMatrix}, or a Seurat object.} +\link[Matrix]{dgCMatrix-class} object, or a Seurat object.} \item{...}{Arguments passed to other methods. The order goes by: "liger" method calls "ligerDataset" method", which then calls "dgCMatrix" method. diff --git a/man/writeH5.Rd b/man/writeH5.Rd index 5f5a9d14..0f8545c8 100644 --- a/man/writeH5.Rd +++ b/man/writeH5.Rd @@ -40,9 +40,10 @@ writeH5(x, file, ...) Default \code{FALSE}.} \item{indicesPath, indptrPath, dataPath}{The paths inside the H5 file where -the \linkS4class{dgCMatrix} constructor \code{i}, \code{p}, and \code{x} will -be written to, respectively. Default using cellranger convention -\code{"matrix/indices"}, \code{"matrix/indptr"}, and \code{"matrix/data"}.} +the \link[Matrix]{dgCMatrix-class} constructor \code{i}, \code{p}, and +\code{x} will be written to, respectively. Default using cellranger +convention \code{"matrix/indices"}, \code{"matrix/indptr"}, and +\code{"matrix/data"}.} \item{shapePath}{The path inside the H5 file where the shape of the matrix will be written to. Default \code{"matrix/shape"}.} @@ -73,9 +74,9 @@ information might be lost. Basing on the goal of the whole workflow, the data will always be written in a CSC matrix format and colnames/rownames are always required. -The default method coerces the input to a \linkS4class{dgCMatrix}. Methods -for other container classes tries to extract proper data and calls the -default method. +The default method coerces the input to a \link[Matrix]{dgCMatrix-class} +object. Methods for other container classes tries to extract proper data and +calls the default method. } \examples{ raw <- rawData(pbmc, "ctrl") diff --git a/tests/testthat/test_visualization.R b/tests/testthat/test_visualization.R index 5a7654f2..34d52e19 100644 --- a/tests/testthat/test_visualization.R +++ b/tests/testthat/test_visualization.R @@ -116,6 +116,10 @@ test_that("Violin plots", { plotTotalCountViolin(pbmc, dot = TRUE) ) + expect_gg( + plotClusterGeneViolin(pbmcPlot, "S100A8", box = TRUE), + plotClusterGeneViolin(pbmcPlot, "S100A8", groupBy = FALSE) + ) # General skip_if_not_installed("scattermore") expect_gg( @@ -172,14 +176,17 @@ context("Density plot") test_that("Density plot", { expect_gg( expect_no_warning(plotDensityDimRed(pbmcPlot, splitBy = "dataset", - title = "one")), - expect_message(plotDensityDimRed(pbmcPlot, title = letters[1:3], - dotRaster = TRUE), - "`title` has length greater than") + title = "one")) ) expect_is(plotDensityDimRed(pbmcPlot, "UMAP", splitBy = "dataset", title = names(pbmcPlot), combinePlot = FALSE), "list") + skip_if_not(requireNamespace("scattermore", quietly = TRUE)) + expect_gg( + expect_message(plotDensityDimRed(pbmcPlot, title = letters[1:3], + dotRaster = TRUE), + "`title` has length greater than") + ) }) #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/vignettes/liger-vignette.Rmd b/vignettes/liger_vignette.Rmd similarity index 92% rename from vignettes/liger-vignette.Rmd rename to vignettes/liger_vignette.Rmd index bf3ce40e..0821630a 100644 --- a/vignettes/liger-vignette.Rmd +++ b/vignettes/liger_vignette.Rmd @@ -1,16 +1,17 @@ --- -title: "Data Integration with LIGER" -author: "Joshua D. Welch" -date: "`r Sys.Date()`" +title: "Data integration with LIGER" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{Data Integration with LIGER} + %\VignetteIndexEntry{Data integration with LIGER} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- -```{r setup, include = FALSE} -knitr::opts_chunk$set() +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) ``` ## Introduction @@ -52,3 +53,9 @@ Meanwhile, since version 2.0.0, LIGER is massively updated for usability and int * [Introduction to new liger object and other related classes](https://welch-lab.github.io/liger/articles/liger_object.html) * [Running Liger directly on Seurat objects](https://welch-lab.github.io/liger/articles/liger_with_seurat.html) + +## Loading the package + +```{r setup, message=FALSE} +library(rliger) +```