前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R tips:monocle安装调试

R tips:monocle安装调试

作者头像
生信菜鸟团
发布2024-04-18 19:53:03
1070
发布2024-04-18 19:53:03
举报
文章被收录于专栏:生信菜鸟团生信菜鸟团

如果使用monocle(非monocle3)进行轨迹分析的话,由于这个包比较古老了,年久失修,所以monocle的函数则大概会报一个错误“Error: the condition has length > 1”。 本文会叙述一下修复此bug的过程。

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。

看如下代码:

代码语言:javascript
复制
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的向量。

修复函数bug

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文件中。

代码语言:javascript
复制
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的逻辑向量。此函数应作如下修改:

代码语言:javascript
复制
# 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文件中。

代码语言:javascript
复制
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函数体中如下代码,,并作修改:

代码语言:javascript
复制
# original code
if(class(projection) != 'matrix')
    projection <- as.matrix(projection)

# fix bugs
if(!'matrix' %in% class(projection))
    projection <- as.matrix(projection)

本地安装修改好bug的R包

本地安装可以使用命令行R CMD INSTALL,也可以使用R函数install.packages,也可以使用devtools包的install命令。

以前的R tips推文有讲过,这里以使用install.packages作为示例:

代码语言:javascript
复制
# shell环境
# 将monocle重新压缩,此为shell命令,非R代码
# tar -cvzf  monocle-fix-bugs.tar.gz monocle


# R环境中
install.packages('monocle-fix-bugs.tar.gz', repos = NULL, type = "source") 
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-12,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 生信菜鸟团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • bug解析
  • 修复函数bug
  • 本地安装修改好bug的R包
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com