A small gotcha when comparing lists using testthat
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
I recently encountered a small gotcha when using the testthat package to test the equality of two lists. Imagine I have the following two lists below:
list1 <- list(a = 1, b = 2, c = 3, d = 4) list2 <- list(a = 0, b = 2, c = 3, d = 5)
Imagine that:
- I know that the value associated with
a
is going to be different, so I don’t want to test equality for it. - The values associated with the other keys should be the same, so I want to test equality for them.
If I run the tests correctly, I should get an error message associated with the key d
. The following code snippet using the testthat
package looks like it does the job, BUT IT DOES NOT WORK:
library(testthat) # WRONG!!!! for (key in names(list1)) { if (key != "a") { expect_equal(list1$key, list2$key) } }
The code above incorrectly reports that all the elements in list1
and list2
(ignoring the key a
) are equal.
The correct way to test equality in this situation is as follows:
library(testthat) # CORRECT keys <- setdiff(names(list1), "a") expect_equal(list1[keys], list2[keys]) # Error: list1[keys] not equal to list2[keys]. # Component “d”: Mean relative difference: 0.25
Update: As some of the commenters have rightly pointed out (thanks for contributing!), the bigger mistake in the first snippet is the use of $
to pull out the element instead of the double square braces [[
. When using $
, it is looking for a key in the list that is literally named "key"
. Not what I intended!
The code snippet above can be changed to use [[
, but notice how the error message is less informative:
library(testthat) # CORRECT, but error message less informative for (key in names(list1)) { if (key != "a") { expect_equal(list1[[key]], list2[[key]]) } } # Error: list1[[key]] not equal to list2[[key]]. # 1/1 mismatches # [1] 4 - 5 == -1
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.