Home > Mobile >  Test Plotly objects equality using testthat
Test Plotly objects equality using testthat

Time:01-25

Using testthat, I want to check if two plotly objects are the same.

Reproducible data:

library(plotly)
p1 <- plot_ly(economics, x = ~pop)
p2 <- plot_ly(economics, x = ~pop)

I am searching for a code equivalent to testthat::expect_equivalent in priority (should be similar for testthat::expect_equal and testthat::expect_identical functions.

testthat::expect_equivalent(p1, p2)   

Error: p1 not equivalent to p2. Component “x”: Component “visdat”: Component 1: Component “id”: 1 string mismatch Component “x”: Component “visdat”: Component 1: Component “p”: Component “cur_data”: 1 string mismatch Component “x”: Component “cur_data”: 1 string mismatch

I have found a way to test for equality of the mismatch component.

I overwrite components that are equal (visdat here) and have random ids in the plotly object, then test for equality.

testthat::expect_equal(
  object = p2$x$visdat[[1]](),
  expected = p1$x$visdat[[1]]()
)

p2$x$visdat[1] <- p1$x$visdat[1]
names(p2$x$visdat) <- names(p1$x$visdat)
    
p2$x$cur_data <- p1$x$cur_data
testthat::expect_equivalent(p1, p2)

Testthat code of plotly package does not help https://rdrr.io/cran/plotly/src/tests/testthat/test-plotly.R

Is there a more straightforward way to check if two plotly objects are equivalent?

Thanks a lot for any help

CodePudding user response:

I find it hard to keep up with what is current and what is deprecated in testthat, but I believe currently testthat::expect_equal will call waldo::compare to compare the two objects.

The waldo::compare function will make use of a compare_proxy method on the object to remove unimportant differences before making the comparison. So what you need to do is to find or write a compare_proxy.plotly method. It only sees one object at a time, so you can't transfer names from one to the other, but you can put in standard names or remove the names completely.

For example, the proxy below works on your example. A more extensive example might need other modifications:

library(waldo)
library(plotly)
#> Loading required package: ggplot2
#> 
#> Attaching package: 'plotly'
#> The following object is masked from 'package:ggplot2':
#> 
#>     last_plot
#> The following object is masked from 'package:stats':
#> 
#>     filter
#> The following object is masked from 'package:graphics':
#> 
#>     layout

p1 <- plot_ly(economics, x = ~pop)
p2 <- plot_ly(economics, x = ~pop)

compare_proxy.plotly <- function(x, path = "x") {
  names(x$x$visdat) <- "proxy"
  e <- environment(x$x$visdat$proxy)
  environment(x$x$visdat$proxy) <- globalenv()
  
  # Maybe we should follow the recursion, but not now.
  e$p <- NULL
  
  e$id <- "proxy"
  x$x$visdatEnvironment <- as.list(e)
  
  x$x$cur_data <- "proxy"
  names(x$x$attrs) <- "proxy"
  
  list(object = x, path = paste0("compare_proxy(", path, ")"))
}

waldo::compare(p1, p2)
#> ✔ No differences

testthat::local_edition(3)
testthat::expect_equal(p1, p2)

# Use a different but identical dataset

economics2 <- economics
p3 <- plot_ly(economics2, x = ~pop)
testthat::expect_equal(p1, p3)

# Use a slightly different dataset

economics2$pce[1] <- 0
p4 <- plot_ly(economics2, x = ~pop)

testthat::expect_equal(p1, p4)
#> Error: `p1` (`actual`) not equal to `p4` (`expected`).
#> 
#> compare_proxy(actual)$x$visdatEnvironment$plotlyVisDat vs compare_proxy(expected)$x$visdatEnvironment$plotlyVisDat
#>                                                                       pce
#> - compare_proxy(actual)$x$visdatEnvironment$plotlyVisDat[1, ]       506.7
#>   compare_proxy(expected)$x$visdatEnvironment$plotlyVisDat[1, ]       0.0
#>   compare_proxy(actual)$x$visdatEnvironment$plotlyVisDat[2, ]       509.8
#>   compare_proxy(actual)$x$visdatEnvironment$plotlyVisDat[3, ]       515.6
#>   compare_proxy(actual)$x$visdatEnvironment$plotlyVisDat[4, ]       512.2
#> 
#> compare_proxy(actual)$x$visdatEnvironment$plotlyVisDat$pce[1:4] vs compare_proxy(expected)$x$visdatEnvironment$plotlyVisDat$pce[1:4]
#> - 507
#>   0
#>   510
#>   516
#>   512
#> 
#> compare_proxy(actual)$x$visdatEnvironment$data vs compare_proxy(expected)$x$visdatEnvironment$data
#>                                                               pce
#> - compare_proxy(actual)$x$visdatEnvironment$data[1, ]       506.7
#>   compare_proxy(expected)$x$visdatEnvironment$data[1, ]       0.0
#>   compare_proxy(actual)$x$visdatEnvironment$data[2, ]       509.8
#>   compare_proxy(actual)$x$visdatEnvironment$data[3, ]       515.6
#>   compare_proxy(actual)$x$visdatEnvironment$data[4, ]       512.2
#> 
#>   `compare_proxy(actual)$x$visdatEnvironment$data$pce[1:4]`: 507 510 516 512
#> `compare_proxy(expected)$x$visdatEnvironment$data$pce[1:4]`:   0 510 516 512

Created on 2023-01-25 with reprex v2.0.2

  • Related