Почему мой модульный тест успешно выполняется в консоли R, но возвращает сообщение об ошибке «make test»? - PullRequest
7 голосов
/ 03 сентября 2011

Я учусь разрабатывать пакет R. Все идет хорошо, благодаря руководствам R и этой вики для RUnit. Точнее, когда я запускаю свои модульные тесты в новой консоли 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

Однако, когда я запускаю их в терминале, я получил одну ошибку (рассматриваемая функция использует пакет GenomicRanges , который я установил в "~ / src / Rlibs"):

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

Я не вижу, что вызывает эту ошибку. Я думаю, вам понадобится больше информации о коде и тесте, но это нелегко, потому что я не знаю, как воспроизвести эту ошибку на небольшом примере, не создавая новый пакет только для этого. Может быть, у кого-то из вас возникнет идея об этом сообщении об ошибке и вы дадите мне несколько советов?

Редактировать: , чтобы помочь кому-нибудь дать мне подсказку об ошибке, вот код, который я написал для фиктивного пакета. Цель состоит в том, чтобы найти, какие элементы "p" включены в элементы "g".

Вот тест:

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 Ответ

7 голосов
/ 04 сентября 2011

Я думаю, что эта строка - ваш преступник:

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.ranges и g.ranges есть что-то, чего нетне нравится.То есть они не могут быть принудительно привязаны к векторам, ИЛИ вы неправильно поднастроили, а тип объекта неверен ([ или [[).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...