From d729872380455ce6e70b8b10ed17df9b08a2b72e Mon Sep 17 00:00:00 2001 From: J Wokaty Date: Tue, 30 Apr 2024 11:13:19 -0400 Subject: [PATCH 01/11] bump x.y.z version to even y prior to creation of RELEASE_3_19 branch --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9a38c90..99ecb58 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: projectR Type: Package Title: Functions for the projection of weights from PCA, CoGAPS, NMF, correlation, and clustering -Version: 1.19.2 +Version: 1.20.0 Author: Gaurav Sharma, Charles Shin, Jared Slosberg, Loyal Goff, Genevieve Stein-O'Brien Authors@R: c( person("Gaurav", "Sharma", role = c("aut")), From a687dafc6c6df05805e2d87e2400346f0b4c5b9c Mon Sep 17 00:00:00 2001 From: J Wokaty Date: Tue, 30 Apr 2024 11:13:19 -0400 Subject: [PATCH 02/11] bump x.y.z version to odd y following creation of RELEASE_3_19 branch --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 99ecb58..a87970a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: projectR Type: Package Title: Functions for the projection of weights from PCA, CoGAPS, NMF, correlation, and clustering -Version: 1.20.0 +Version: 1.21.0 Author: Gaurav Sharma, Charles Shin, Jared Slosberg, Loyal Goff, Genevieve Stein-O'Brien Authors@R: c( person("Gaurav", "Sharma", role = c("aut")), From 06eb443c7c62ee2bb45ea4ae1bc655b6174994d9 Mon Sep 17 00:00:00 2001 From: dimalvovs Date: Wed, 25 Sep 2024 09:08:25 -0400 Subject: [PATCH 03/11] rm obsolete code --- R/projectR.R | 34 ++++------------------------------ 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/R/projectR.R b/R/projectR.R index 0a415e0..5f10380 100644 --- a/R/projectR.R +++ b/R/projectR.R @@ -9,7 +9,6 @@ setOldClass("prcomp") #' @param NP vector of integers indicating which columns of loadings object to use. The default of NP=NA will use entire matrix. #' @param full logical indicating whether to return the full model solution. By default only the new pattern object is returned. #' @param model Optional arguements to choose method for projection -#' @param family VGAM family function for model fitting (default: "gaussianff") #' @param bootstrapPval logical to indicate whether to generate p-values using bootstrap, not available for prcomp and rotatoR objects #' @param bootIter number of bootstrap iterations, default = 1000 #' @rdname projectR-methods @@ -21,13 +20,12 @@ setMethod("projectR",signature(data="matrix",loadings="matrix"),function( loadingsNames = NULL, # a vector with names of loadings rows NP=NA, # vector of integers indicating which columns of loadings object to use. The default of NP=NA will use entire matrix. full=FALSE, # logical indicating whether to return the full model solution. By default only the new pattern object is returned. - family="gaussianff", # VGAM family function (default: "gaussianff") bootstrapPval=FALSE, # logical to indicate whether to generate p-values using bootstrap bootIter=1e3 # No of bootstrap iterations ){ ifelse(!is.na(NP),loadings<-loadings[,NP],loadings<-loadings) - #if(!is.na(NP)){loadings<-loadings[,NP]} was giving warning with subset of patterns + #match genes in data sets if(is.null(dataNames)){ dataNames <- rownames(data) @@ -45,16 +43,8 @@ setMethod("projectR",signature(data="matrix",loadings="matrix"),function( projectionPatterns <- t(projection$coefficients) projection.ts<-t(projection$coefficients/projection$stdev.unscaled/projection$sigma) - #projection<-vglm(dataM$data2 ~ 0 + dataM$data1,family=family) - #projectionPatterns<-coefvlm(projection,matrix.out=TRUE) - - #For VGAM - #pval.matrix<-matrix(2*pnorm(-abs(summary(projection)@coef3[,3])),nrow=5,byrow=TRUE) - #For limma pval.matrix<-2*pnorm(-abs(projection.ts)) - #colnames(pval.matrix)<-colnames(projectionPatterns) - #rownames(pval.matrix)<-rownames(projectionPatterns) if(bootstrapPval){ boots <- lapply(1:bootIter,function(x){ @@ -66,7 +56,6 @@ setMethod("projectR",signature(data="matrix",loadings="matrix"),function( } if(full & bootstrapPval){ - #projectionFit <- list('projection'=projectionPatterns, 'fit'=projection,'pval'=pval.matrix) projectionFit <- list('projection'=projectionPatterns, 'pval'=pval.matrix, 'bootstrapPval' = bootPval) return(projectionFit) } else if(full){ @@ -82,7 +71,6 @@ setMethod("projectR",signature(data="matrix",loadings="matrix"),function( #' @param NP vector of integers indicating which columns of loadings object to use. The default of NP=NA will use entire matrix. #' @param full logical indicating whether to return the full model solution. By default only the new pattern object is returned. #' @param model Optional arguements to choose method for projection -#' @param family VGAM family function for model fitting (default: "gaussianff") #' @rdname projectR-methods #' @aliases projectR setMethod("projectR",signature(data="dgCMatrix",loadings="matrix"),function( @@ -91,8 +79,7 @@ setMethod("projectR",signature(data="dgCMatrix",loadings="matrix"),function( dataNames = NULL, # a vector with names of data rows loadingsNames = NULL, # a vector with names of loadings rows NP=NA, # vector of integers indicating which columns of loadings object to use. The default of NP=NA will use entire matrix. - full=FALSE, # logical indicating whether to return the full model solution. By default only the new pattern object is returned. - family="gaussianff" # VGAM family function (default: "gaussianff") + full=FALSE # logical indicating whether to return the full model solution. By default only the new pattern object is returned. ){ ifelse(!is.na(NP),loadings<-loadings[,NP],loadings<-loadings) @@ -108,25 +95,15 @@ setMethod("projectR",signature(data="dgCMatrix",loadings="matrix"),function( print(paste(as.character(dim(dataM[[2]])[1]),'row names matched between data and loadings')) print(paste('Updated dimension of data:',as.character(paste(dim(dataM[[2]]), collapse = ' ')))) # do projection - Design <- model.matrix(~0 + dataM[[1]]) - colnames(Design) <- colnames(dataM[[1]]) projection <- MatrixModels:::lm.fit.sparse(t(dataM[[2]]),dataM[[1]]) projectionPatterns <- t(projection$coefficients) projection.ts<-t(projection$coefficients/projection$stdev.unscaled/projection$sigma) - #projection<-vglm(dataM$data2 ~ 0 + dataM$data1,family=family) - #projectionPatterns<-coefvlm(projection,matrix.out=TRUE) - - #For VGAM - #pval.matrix<-matrix(2*pnorm(-abs(summary(projection)@coef3[,3])),nrow=5,byrow=TRUE) #For limma pval.matrix<-2*pnorm(-abs(projection.ts)) - #colnames(pval.matrix)<-colnames(projectionPatterns) - #rownames(pval.matrix)<-rownames(projectionPatterns) if(full==TRUE){ - #projectionFit <- list('projection'=projectionPatterns, 'fit'=projection,'pval'=pval.matrix) projectionFit <- list('projection'=projectionPatterns, 'pval'=pval.matrix) return(projectionFit) } @@ -153,7 +130,6 @@ setMethod("projectR",signature(data="matrix",loadings="LinearEmbeddingMatrix"),f NP=NA, # vector of integers indicating which columns of loadings object to use. The default of NP=NA will use entire matrix. full=FALSE, # logical indicating whether to return the full model solution. By default only the new pattern object is returned. model=NA, # optional arguements to choose method for projection - family="gaussianff", # VGAM family function (default: "gaussianff") bootstrapPval=FALSE, # logical to indicate whether to generate p-values using bootstrap bootIter=1e3 # No of bootstrap iterations ){ @@ -256,10 +232,8 @@ setMethod("projectR",signature(data="matrix",loadings="rotatoR"),function( Eigenvalues<-eigen(cov(projectionPatterns))$values PercentVariance<-round(Eigenvalues/sum(Eigenvalues) * 100, digits = 2) - #PercentVariance<-apply(projectionPatterns,2, function(x) 100*var(x)/sum(apply(p2P,2,var))) - - projectionFit <- list(t(projectionPatterns), PercentVariance) - return(projectionFit) + projectionFit <- list(t(projectionPatterns), PercentVariance) + return(projectionFit) } else{return(t(projectionPatterns))} From d93559c02167e559c530bdc29332de355fa75f35 Mon Sep 17 00:00:00 2001 From: dimalvovs Date: Thu, 26 Sep 2024 13:57:44 -0400 Subject: [PATCH 04/11] works with dgCMatrix now --- R/projectR.R | 39 ++++++++++++++++++---------------- tests/testthat/test_projectR.R | 14 +++++++++++- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/R/projectR.R b/R/projectR.R index 5f10380..27fbbf8 100644 --- a/R/projectR.R +++ b/R/projectR.R @@ -82,26 +82,29 @@ setMethod("projectR",signature(data="dgCMatrix",loadings="matrix"),function( full=FALSE # logical indicating whether to return the full model solution. By default only the new pattern object is returned. ){ - ifelse(!is.na(NP),loadings<-loadings[,NP],loadings<-loadings) - #if(!is.na(NP)){loadings<-loadings[,NP]} was giving warning with subset of patterns - #match genes in data sets - if(is.null(dataNames)){ - dataNames <- rownames(data) - } - if(is.null(loadingsNames)){ - loadingsNames <- rownames(loadings) + #columns of dgcMatrix are LHS for stats::lm, and columns of loadings are the + #dense RHS (predictors). sometimes dgcMatrix is too big to fit RAM, so we + #just project in chunks lm models as supported by stats::lm/limma::lmFit + + print("dgCMatrix detected, projecting in chunks.") + + chop <- function(sparsematrix) { + NCOL <- ncol(sparsematrix) + bins <- seq(1, NCOL, by = 1000) + lapply(seq_along(bins), function(i) { + start <- bins[i] + end <- ifelse(i < length(bins), bins[i + 1] - 1, NCOL) + return(start:end) + }) } - dataM<-geneMatchR(data1=data, data2=loadings, data1Names=dataNames, data2Names=loadingsNames, merge=FALSE) - print(paste(as.character(dim(dataM[[2]])[1]),'row names matched between data and loadings')) - print(paste('Updated dimension of data:',as.character(paste(dim(dataM[[2]]), collapse = ' ')))) - # do projection - projection <- MatrixModels:::lm.fit.sparse(t(dataM[[2]]),dataM[[1]]) - projectionPatterns <- t(projection$coefficients) - projection.ts<-t(projection$coefficients/projection$stdev.unscaled/projection$sigma) - + #capture print statement that projectR generated when geneMatchR is called + warns <- invisible(capture.output( + projectionList <- lapply(chop(data), function(i) { + projectR(as.matrix(data[,i]), loadings, dataNames, loadingsNames, NP, full) + }) + )) - #For limma - pval.matrix<-2*pnorm(-abs(projection.ts)) + projectionPatterns <- do.call(cbind, projectionList) if(full==TRUE){ projectionFit <- list('projection'=projectionPatterns, 'pval'=pval.matrix) diff --git a/tests/testthat/test_projectR.R b/tests/testthat/test_projectR.R index 3acd3d4..24396aa 100644 --- a/tests/testthat/test_projectR.R +++ b/tests/testthat/test_projectR.R @@ -200,4 +200,16 @@ test_that("results are correctly formatted for P value mode",{ }) - +test_that("projection works on sparse data matrix",{ + dense <- as.matrix(p.RNAseq6l3c3t) + sparse <- as(p.RNAseq6l3c3t, "sparseMatrix") + loadings <- CR.RNAseq6l3c3t@featureLoadings + + expect_true("dgCMatrix" %in% class(sparse)) + expect_no_error(projectR(data, loadings)) + + pdense <- projectR(dense, loadings) + psparse <- projectR(sparse, loadings) + expect_identical(projectR(dense, loadings), + projectR(sparse, loadings)) +}) \ No newline at end of file From 96e91ee79d7bbb9ac7268fc2ada64c5af90a1d82 Mon Sep 17 00:00:00 2001 From: dimalvovs Date: Thu, 26 Sep 2024 16:55:33 -0400 Subject: [PATCH 05/11] mimic the usual call, cover full=TRUE --- R/projectR.R | 53 +++++++++++++++++++++++----------- tests/testthat/test_projectR.R | 18 ++++++++++-- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/R/projectR.R b/R/projectR.R index 27fbbf8..137f403 100644 --- a/R/projectR.R +++ b/R/projectR.R @@ -78,39 +78,58 @@ setMethod("projectR",signature(data="dgCMatrix",loadings="matrix"),function( loadings, # a matrix of continous values to be projected with unique rownames dataNames = NULL, # a vector with names of data rows loadingsNames = NULL, # a vector with names of loadings rows - NP=NA, # vector of integers indicating which columns of loadings object to use. The default of NP=NA will use entire matrix. + NP=NULL, # vector of integers indicating which columns of loadings object to use. The default of NP=NA will use entire matrix. full=FALSE # logical indicating whether to return the full model solution. By default only the new pattern object is returned. ){ - #columns of dgcMatrix are LHS for stats::lm, and columns of loadings are the - #dense RHS (predictors). sometimes dgcMatrix is too big to fit RAM, so we - #just project in chunks lm models as supported by stats::lm/limma::lmFit + if(!is.null(NP)) { + loadings<-loadings[,NP] + } + + #match genes in data sets + if(is.null(dataNames)){ + dataNames <- rownames(data) + } + if(is.null(loadingsNames)){ + loadingsNames <- rownames(loadings) + } + + dataM<-geneMatchR(data1=data, data2=loadings, data1Names=dataNames, data2Names=loadingsNames, merge=FALSE) + print(paste(as.character(dim(dataM[[2]])[1]),'row names matched between data and loadings')) + print(paste('Updated dimension of data:',as.character(paste(dim(dataM[[2]]), collapse = ' ')))) print("dgCMatrix detected, projecting in chunks.") + #columns of dgcMatrix are LHS for stats::lm, and columns of loadings are the + #dense RHS (predictors). sometimes dgcMatrix is too big to fit RAM, so we + #just fit chunks of lm models as supported by stats::lm/limma::lmFit chop <- function(sparsematrix) { - NCOL <- ncol(sparsematrix) - bins <- seq(1, NCOL, by = 1000) + coln <- ncol(sparsematrix) + bins <- seq(1, coln, by = 1000) lapply(seq_along(bins), function(i) { start <- bins[i] - end <- ifelse(i < length(bins), bins[i + 1] - 1, NCOL) + end <- ifelse(i < length(bins), bins[i + 1] - 1, coln) return(start:end) }) } - #capture print statement that projectR generated when geneMatchR is called - warns <- invisible(capture.output( - projectionList <- lapply(chop(data), function(i) { - projectR(as.matrix(data[,i]), loadings, dataNames, loadingsNames, NP, full) + #discard print statements projectR generates each time a chunk is called + invisible(capture.output( + projectionList <- lapply(chop(dataM[[2]]), function(i) { + projectR(as.matrix(dataM[[2]][,i]), dataM[[1]], full=full) }) )) - projectionPatterns <- do.call(cbind, projectionList) - - if(full==TRUE){ - projectionFit <- list('projection'=projectionPatterns, 'pval'=pval.matrix) - return(projectionFit) + if(full==TRUE) { + if(length(projectionList)==1) {#if only one chunk + res <- projectionList[[1]] + } else { + projectionFit <- lapply(projectionList, function(x) do.call(cbind, x)) + res <- projectionFit + } + } else { + res <- do.call(cbind, projectionList) } - else{return(projectionPatterns)} + return(res) }) diff --git a/tests/testthat/test_projectR.R b/tests/testthat/test_projectR.R index 24396aa..0f5ddb1 100644 --- a/tests/testthat/test_projectR.R +++ b/tests/testthat/test_projectR.R @@ -200,16 +200,30 @@ test_that("results are correctly formatted for P value mode",{ }) -test_that("projection works on sparse data matrix",{ +test_that("projection works on sparse data matrix", { dense <- as.matrix(p.RNAseq6l3c3t) sparse <- as(p.RNAseq6l3c3t, "sparseMatrix") loadings <- CR.RNAseq6l3c3t@featureLoadings expect_true("dgCMatrix" %in% class(sparse)) - expect_no_error(projectR(data, loadings)) + expect_no_error(projectR(sparse, loadings)) pdense <- projectR(dense, loadings) psparse <- projectR(sparse, loadings) expect_identical(projectR(dense, loadings), projectR(sparse, loadings)) +}) + +test_that("projection works on sparse data matrix with full=TRUE", { + dense <- as.matrix(p.RNAseq6l3c3t) + sparse <- as(p.RNAseq6l3c3t, "sparseMatrix") + loadings <- CR.RNAseq6l3c3t@featureLoadings + + expect_true("dgCMatrix" %in% class(sparse)) + expect_no_error(projectR(sparse, loadings)) + + pdense <- projectR(dense, loadings, full=TRUE) + psparse <- projectR(sparse, loadings, full=TRUE) + expect_identical(projectR(dense, loadings), + projectR(sparse, loadings)) }) \ No newline at end of file From 5b1a15a4615792e718d3a06f67b84e5b9a497d6e Mon Sep 17 00:00:00 2001 From: dimalvovs Date: Thu, 26 Sep 2024 17:09:08 -0400 Subject: [PATCH 06/11] =?UTF-8?q?fix=20no=20definition=20for=20class=20?= =?UTF-8?q?=E2=80=9CLinearEmbeddingMatrix=E2=80=9D=20warning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NAMESPACE | 1 + R/projectR.R | 1 + 2 files changed, 2 insertions(+) diff --git a/NAMESPACE b/NAMESPACE index 273c371..5ffadf6 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -21,6 +21,7 @@ exportClasses(correlateR) exportClasses(rotatoR) import(MatrixModels) import(RColorBrewer) +import(SingleCellExperiment) import(cluster) import(dplyr) import(fgsea) diff --git a/R/projectR.R b/R/projectR.R index 0a415e0..818ee71 100644 --- a/R/projectR.R +++ b/R/projectR.R @@ -136,6 +136,7 @@ setMethod("projectR",signature(data="dgCMatrix",loadings="matrix"),function( ####################################################################################################################################### #' @import limma +#' @import SingleCellExperiment #' @importFrom NMF fcnnls #' @examples #' library("CoGAPS") From 6e8a3f0d0718d7a2a1006393ea7a571b998b35d3 Mon Sep 17 00:00:00 2001 From: dimalvovs Date: Thu, 26 Sep 2024 17:09:30 -0400 Subject: [PATCH 07/11] :wq bump version --- DESCRIPTION | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9a38c90..5cb0701 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: projectR Type: Package Title: Functions for the projection of weights from PCA, CoGAPS, NMF, correlation, and clustering -Version: 1.19.2 +Version: 1.19.3 Author: Gaurav Sharma, Charles Shin, Jared Slosberg, Loyal Goff, Genevieve Stein-O'Brien Authors@R: c( person("Gaurav", "Sharma", role = c("aut")), @@ -15,6 +15,7 @@ Authors@R: c( Description: Functions for the projection of data into the spaces defined by PCA, CoGAPS, NMF, correlation, and clustering. License: GPL (==2) Imports: + SingleCellExperiment, methods, cluster, stats, @@ -50,7 +51,7 @@ Suggests: SeuratObject LazyData: TRUE LazyDataCompression: gzip -RoxygenNote: 7.3.1 +RoxygenNote: 7.3.2 Encoding: UTF-8 VignetteBuilder: knitr biocViews: FunctionalPrediction, GeneRegulation, BiologicalQuestion, Software From 1677e0b284b5dbe7064913340afb8fbab7558f2a Mon Sep 17 00:00:00 2001 From: dimalvovs Date: Thu, 26 Sep 2024 17:31:09 -0400 Subject: [PATCH 08/11] debug: update docs --- man/projectR-methods.Rd | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/man/projectR-methods.Rd b/man/projectR-methods.Rd index e0b1247..5f553fe 100644 --- a/man/projectR-methods.Rd +++ b/man/projectR-methods.Rd @@ -23,7 +23,6 @@ projectR(data, loadings, dataNames = NULL, loadingsNames = NULL, ...) loadingsNames = NULL, NP = NA, full = FALSE, - family = "gaussianff", bootstrapPval = FALSE, bootIter = 1000 ) @@ -33,9 +32,8 @@ projectR(data, loadings, dataNames = NULL, loadingsNames = NULL, ...) loadings, dataNames = NULL, loadingsNames = NULL, - NP = NA, - full = FALSE, - family = "gaussianff" + NP = NULL, + full = FALSE ) \S4method{projectR}{matrix,LinearEmbeddingMatrix}( @@ -46,7 +44,6 @@ projectR(data, loadings, dataNames = NULL, loadingsNames = NULL, ...) NP = NA, full = FALSE, model = NA, - family = "gaussianff", bootstrapPval = FALSE, bootIter = 1000 ) @@ -129,8 +126,6 @@ projectR(data, loadings, dataNames = NULL, loadingsNames = NULL, ...) \item{full}{logical indicating whether to return the full model solution. By default only the new pattern object is returned.} -\item{family}{VGAM family function for model fitting (default: "gaussianff")} - \item{bootstrapPval}{logical to indicate whether to generate p-values using bootstrap, not available for prcomp and rotatoR objects} \item{bootIter}{number of bootstrap iterations, default = 1000} From a9d3e1416ebce7a8e2128b5bf43677df4f0b1bae Mon Sep 17 00:00:00 2001 From: dimalvovs Date: Thu, 26 Sep 2024 18:18:29 -0400 Subject: [PATCH 09/11] geneMatchR() could not handle big data - revert it --- R/projectR.R | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/R/projectR.R b/R/projectR.R index 38b87e2..3e8b9eb 100644 --- a/R/projectR.R +++ b/R/projectR.R @@ -86,18 +86,6 @@ setMethod("projectR",signature(data="dgCMatrix",loadings="matrix"),function( loadings<-loadings[,NP] } - #match genes in data sets - if(is.null(dataNames)){ - dataNames <- rownames(data) - } - if(is.null(loadingsNames)){ - loadingsNames <- rownames(loadings) - } - - dataM<-geneMatchR(data1=data, data2=loadings, data1Names=dataNames, data2Names=loadingsNames, merge=FALSE) - print(paste(as.character(dim(dataM[[2]])[1]),'row names matched between data and loadings')) - print(paste('Updated dimension of data:',as.character(paste(dim(dataM[[2]]), collapse = ' ')))) - print("dgCMatrix detected, projecting in chunks.") #columns of dgcMatrix are LHS for stats::lm, and columns of loadings are the #dense RHS (predictors). sometimes dgcMatrix is too big to fit RAM, so we @@ -113,11 +101,13 @@ setMethod("projectR",signature(data="dgCMatrix",loadings="matrix"),function( }) } #discard print statements projectR generates each time a chunk is called - invisible(capture.output( - projectionList <- lapply(chop(dataM[[2]]), function(i) { - projectR(as.matrix(dataM[[2]][,i]), dataM[[1]], full=full) + w <- invisible(capture.output( + projectionList <- lapply(chop(data), function(i) { + projectR(as.matrix(data[,i]), loadings, full=full) }) )) + #since chopping by columns, it's enough to print matching rows only once + print(w[1]) if(full==TRUE) { if(length(projectionList)==1) {#if only one chunk From e5e8919f21fce069f9a2b5312a952e24bcae5af4 Mon Sep 17 00:00:00 2001 From: J Wokaty Date: Tue, 29 Oct 2024 10:35:42 -0400 Subject: [PATCH 10/11] bump x.y.z version to even y prior to creation of RELEASE_3_20 branch --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index a87970a..d228349 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: projectR Type: Package Title: Functions for the projection of weights from PCA, CoGAPS, NMF, correlation, and clustering -Version: 1.21.0 +Version: 1.22.0 Author: Gaurav Sharma, Charles Shin, Jared Slosberg, Loyal Goff, Genevieve Stein-O'Brien Authors@R: c( person("Gaurav", "Sharma", role = c("aut")), From 6cc9b37b2831ace96205ea052d727228413c8091 Mon Sep 17 00:00:00 2001 From: J Wokaty Date: Tue, 29 Oct 2024 10:35:42 -0400 Subject: [PATCH 11/11] bump x.y.z version to odd y following creation of RELEASE_3_20 branch --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index d228349..ffd3be4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: projectR Type: Package Title: Functions for the projection of weights from PCA, CoGAPS, NMF, correlation, and clustering -Version: 1.22.0 +Version: 1.23.0 Author: Gaurav Sharma, Charles Shin, Jared Slosberg, Loyal Goff, Genevieve Stein-O'Brien Authors@R: c( person("Gaurav", "Sharma", role = c("aut")),