2011-09-03 32 views
7

我正在学习如何开发一个R包。一切顺利,感谢RUnit的R手册和this wiki。更确切地说,当我一个新的R控制台内启动我的单元测试,所有测试成功完成:为什么我的单元测试在R控制台中成功运行,但是返回“make test”错误?

#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”中):

$ 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) 
} 
+0

我不知道问题是什么,但它可能是由'.Rprofile'中的某些内容引起的。你可以尝试运行'R --vanilla',看看它的行为是否有所不同。 – Owen

+0

@Owen我试过了,但它也不起作用。事实上,如果我像这样启动它,我甚至不能使用--vanilla,因为R需要至少读取我的〜/ .Renviron以查找GenomicRanges包(通过env变量R_LIBS)。 – tflutre

+0

你能告诉我们什么类型的对象是由'GRanges()'返回的吗?即str(p.ranges)',str(g.ranges)' –

回答

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它不喜欢的。即,它们不能被强制转换为向量,或者你没有正确设置子集并且对象类型不正确([[[)。

+0

谢谢,我会看到我可以做些什么来改变这个特定的行,但它仍然不清楚为什么这条线在R控制台交互执行时工作,但不是其他... – tflutre

+1

我以前见过这个错误。当我在一个函数中运行逐行代码时,它发生在我身上。将错误的对象类传递给一个不理解它的函数总是有问题。错误消息说明了这一切,并从我所看到的 - 这是在%aka匹配中使用%的唯一行。 –

相关问题