繁体   English   中英

R:测试多个对象相等

[英]R: test_that multiple objects are equal

我试图在脚本中包含一个使用testthat::test_that的测试,并想编写一个测试,即多个对象相等:

dfX1 = data.frame(x1 = rnorm(10), 
                  x2 = rnorm(10), 
                  row.names = paste0("team", 1:10))

dfX2 = data.frame(x1 = rnorm(10), 
                  x2 = rnorm(10), 
                  row.names = paste0("team", 1:10))

dfX3 = data.frame(x1 = rnorm(10), 
                  x2 = rnorm(10), 
                  row.names = paste0("team", 1:10))

# something like this?
stopifnot(all(row.names(dfX1) == row.names(dfX2) == row.names(dfX3)))

我完全知道最后一行是没有意义的。 我正在寻找一种适合testthat语义的紧凑型解决方案。

尝试这个:

dfX1 = data.frame(x1 = rnorm(10), 
                  x2 = rnorm(10), 
                  row.names = paste0("team", 1:10))

dfX2 = data.frame(x1 = rnorm(10), 
                  x2 = rnorm(10), 
                  row.names = paste0("team", 1:10))

dfX3 = data.frame(x1 = rnorm(10), 
                  x2 = rnorm(10), 
                  row.names = paste0("team", 1:10))

# something like this?
stopifnot(identical(union(row.names(dfX1) ,row.names(dfX2)),
                row.names(dfX3)) == TRUE)

对于2个以上的向量,请使用:

stopifnot(identical(Reduce(union, list(row.names(dfX1) ,row.names(dfX2),
row.names(dfX3, ... , row.names(dfX_Nminus1))),
                row.names(dfX_N)) == TRUE)

假设所有向量的长度都相等,这也是可行的:

l.d <- list(row.names(dfX1) ,row.names(dfX2),
        row.names(dfX3))
stopifnot(length(Reduce(intersect, l.d)) == length(l.d[[1]]))

testthat的两种解决方案:

library(testthat);library(purrr)
# example data
dfX1 = data.frame(x1 = rnorm(10), 
                  x2 = rnorm(10), 
                  row.names = paste0("team", 1:10))
dfX2 = data.frame(x1 = rnorm(10), 
                  x2 = rnorm(10), 
                  row.names = paste0("team", 1:10))
dfX3 = data.frame(x1 = rnorm(10), 
                  x2 = rnorm(10), 
                  row.names = paste0("team", 1:10))

测试解决方案1-不能确定问题出在哪里,而是一个问题

expect_equal(unlist(unique(map(list(dfX1, dfX2, dfX3), row.names))), row.names(dfX1))

有错误

olddfX3<-dfX3
row.names(dfX3) <- paste0(row.names(dfX3), 1)

expect_equal(unlist(unique(map(list(dfX1, dfX2, dfX3), row.names))), row.names(dfX1))
# Error: unlist(unique(map(list(dfX1, dfX2, dfX3), row.names))) not equal to row.names(dfX1).
# Lengths differ: 20 vs 10

dfX3<-olddfX3

Testthat解决方案2-2x2测试-将为您提供较长的错误文本,但您可以确定问题所在

tests_2x2 <- function(names){

  lss <- setNames(lapply(names,get),names)

  len <- length(lss)


  for(x in 1:len){
    y=x+1
    while(y<=len){
      test_that(paste0("test that row.names(", 
        names(lss)[x], ") == row.names(", names(lss)[y], ")"), {
          expect_equal(row.names(lss[[x]]), row.names(lss[[y]]))})
      y=y+1
    }
  }
}

输入df名称以获取测试的特定结果

names<-c("dfX1", "dfX2", "dfX3")
tests_2x2(names)

一个错误:

olddfX3<-dfX3
row.names(dfX3) <- paste0(row.names(dfX3), 1)
tests_2x2(names)
# Error: Test failed: 'test that row.names(dfX2) == row.names(dfX3)'
# * row.names(lss[[i]]) not equal to row.names(lss[[i + 1]]).
# 10/10 mismatches
# x[1]: "team1"
# y[1]: "team11"
# 
# x[2]: "team2"
# y[2]: "team21"
# 
# x[3]: "team3"
# y[3]: "team31"
# 
# x[4]: "team4"
# y[4]: "team41"
# 
# x[5]: "team5"
# y[5]: "team51"
# 
# x[6]: "team1"
# y[6]: "team11"
# 
# x[7]: "team2"
# y[7]: "team21"
# 
# x[8]: "team3"
# y[8]: "team31"
# 
# x[9]: "team4"
# y[9]: "team41"
# 
# x[10]: "team5"
# y[10]: "team51" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM