如果使用monocle(非monocle3)进行轨迹分析的话,由于这个包比较古老了,年久失修,所以monocle的函数则大概会报一个错误“Error: the condition has length > 1”。 本文会叙述一下修复此bug的过程。
这个错误其实很简单的,就是if语句中条件逻辑值长度大于1。
在旧版本的R中,这种情况会给出一个warnning:“Error: the condition has length > 1 and only the first element will be used”。而在新版本R中,就会被强制报错。
这里稍微展开一下,其实旧版本R中对这种情况的处理是有很大问题的,会留下潜藏的bug。作如下场景描述:有一个向量可能存在NA值,如果存在NA则需要将NA值替换为0。
看如下代码:
vec <- rnorm(10)
vec[5] <- NA
# is.na(vec)
# [1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
# have bugs
if(is.na(vec)){
vec[is.na(vec)] <- 0
}
# right version
if(any(is.na(vec))){
vec[is.na(vec)] <- 0
}
其实这里的if语句就会有问题了,is.na(vec)的结果是一个长度为10的逻辑向量,它的第5个值为TRUE,其他为FALSE。
由于旧版本R会只提取第一个值(FALSE)为用,因此就会导致if语句体并未被执行,但是问题是vec的第5个元素就是NA值,是需要处理的。
根据正确的分析逻辑,其if判断条件应改为any(is.na(vec)),只要有NA值,就需要处理。
所以新版本R对这种情况的强制报错是一个好事情,减少了潜在bug的产生。
一般情况下,这种bug是需要使用any、all函数对if条件判断值进行处理,调整为一个长度为1的向量。
monocle的构建cds对象、降维聚类、构建轨迹的过程中有两个bug位点,均是报错“Error: the condition has length > 1”。
修改函数bug是对源码进行修改,然后实施本地安装。可以先在CRAN或者github上将monocle的源码包下载下来,然后解压 'tar -xvzf monocle.VERSION.tar.gz'。
解压后的R源码就在monocle/R文件夹中。
bug1: isSparseMatrix函数报错
寻找源码中的isSparseMatrix位置,可以发现它的定义位置在R/utils.R文件中。
cd monocle
grep isSparseMatrix R/*R
# R/expr_models.R: if (isSparseMatrix(exprs(cds))){
# R/methods-CellDataSet.R: # if (isSparseMatrix(exprs(object))){
# R/utils.R: if (class(cellData) != "matrix" && isSparseMatrix(cellData) == FALSE){
# R/utils.R: if (isSparseMatrix(exprs(X))){
# R/utils.R:isSparseMatrix <- function(x){ # <----函数定义-----
# R/utils.R: if (isSparseMatrix(counts)){
isSparseMatrix函数用于判断一个R对象是否为SparseMatrix对象,如果传入的R对象是一个多class的R对象,那么这个函数的返回值就是一个长度大于1的逻辑向量。此函数应作如下修改:
# original code
isSparseMatrix <- function(x){
class(x) %in% c("dgCMatrix", "dgTMatrix")
}
# fix bugs
isSparseMatrix <- function(x){
any(class(x) %in% c("dgCMatrix", "dgTMatrix"))
}
bug2: project2MST函数报错
寻找源码中project2MST函数的位置,这个函数的定义在R/order_cells.R文件中。
grep project2MST R/*R
# R/order_cells.R: cds <- project2MST(cds, project_point_to_line_segment) #project_point_to_line_segment can be changed into other states
# R/order_cells.R:project2MST <- function(cds, Projection_Method){
在这个文件中,寻找project2MST函数体中如下代码,,并作修改:
# original code
if(class(projection) != 'matrix')
projection <- as.matrix(projection)
# fix bugs
if(!'matrix' %in% class(projection))
projection <- as.matrix(projection)
本地安装可以使用命令行R CMD INSTALL,也可以使用R函数install.packages,也可以使用devtools包的install命令。
以前的R tips推文有讲过,这里以使用install.packages作为示例:
# shell环境
# 将monocle重新压缩,此为shell命令,非R代码
# tar -cvzf monocle-fix-bugs.tar.gz monocle
# R环境中
install.packages('monocle-fix-bugs.tar.gz', repos = NULL, type = "source")