2011-09-03 36 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匹配中使用%的唯一行。 –

相關問題