为什么我的单元测试在R控制台中成功运行但是在“make test”中返回错误?

时间:2011-09-03 02:45:28

标签: unit-testing r

我正在学习如何开发R包。一切顺利,感谢R手册和RUnit的this wiki。更确切地说,当我在一个新的R控制台中启动我的单元测试时,所有测试都成功完成:

#rm(list=ls())
library(RUnit)
testSuite <- defineTestSuite("current", "~/src/mypkg/inst/unitTests/")
isValidTestSuite  # returns TRUE
runTestSuite(testSuite)  # returns Number of errors: 0 and Number of failures: 0

然而,当我在终端中启动它们时,我遇到一个错误(有问题的函数使用我在“〜/ src / Rlibs”中安装的包GenomicRanges):

$ make test R_LIBS="~/src/Rlibs/"
...
ERROR in test.MyFunction: Error in match(x, table, nomatch = 0L) :
  'match' requires vector arguments

我没有看到导致此错误的原因。我想你需要更多关于代码和测试的信息,但这并不容易,因为我不知道如何在一个小例子上复制这个错误而不为此创建一个新包。也许你们中的一些人会对这个错误信息有所了解并给我一些提示?

编辑,以帮助某人给我一个关于错误的提示,这是我为虚拟包编写的代码。目的是找出“g”项中包含哪些“p”项。

以下是测试:

test.MyFunction <- function(){
  g <- list(c1=data.frame(name=c("g1","g2"), start=c(11,1111),
                  end=c(500,1500), strand=c("+","+"), stringsAsFactors=FALSE))
  p <- list(c1=data.frame(name=c("p1","p2"), strand=c("+","-"),
                   start=c(11,601), end=c(20, 610), stringsAsFactors=FALSE))
  exp <- list(c1=list(g1=c("p1")))  # item "p1" is included in item "g1"
  obs <- MyFunction(g, p)
  checkEquals(obs, exp)
}

这是函数本身:

MyFunction <- function(g, p){
  res <- lapply(names(g), function(c.name){
    res.c <- list()
    nb.g <- length(g[[c.name]]$name)

    if(length(.find.package("GenomicRanges", quiet=TRUE)) > 0){
      g.ranges <- GRanges(seqnames=Rle(c(c.name), c(nb.g)),
                            ranges=IRanges(g[[c.name]]$start,
                              g[[c.name]]$end, names=g[[c.name]]$name),
                            strand="*")
      p.ranges <- GRanges(seqnames=Rle(c(c.name), nrow(p[[c.name]])),
                             ranges=IRanges(p[[c.name]]$start,
                               p[[c.name]]$end, names=p[[c.name]]$name),
                             strand=p[[c.name]]$strand)
      for(g.name in names(g.ranges)){
        links <- p.ranges %in% g.ranges[names(g.ranges) == g.name]
        if(sum(links) > 0)
          res.c[[g.name]] <- names(p.ranges)[which(links)]
      }
    } else{
      msg <- "can't find package GenomicRanges"
      stop(msg, call.=FALSE)
    }
    res.c
  })

  names(res) <- names(g)
  return(res)
}

1 个答案:

答案 0 :(得分:7)

我认为这条线是你的罪魁祸首:

links <- p.ranges %in% g.ranges[names(g.ranges) == g.name]

%in%match,这就是错误信息似乎正在阅读的内容:

ERROR in test.MyFunction: Error in match(x, table, nomatch = 0L) :
  'match' requires vector arguments

它不喜欢p.rangesg.ranges。即,它们不能被强制转换为向量,或者您没有正确地进行子集化,并且对象类型不正确([[[)。