context("Visualize clinical data with a boxplot") # Suppress the following warning as this is a bug in plotly: # See https://github.com/ropensci/plotly/issues/994 ignoreBoxmodeWarning <- function(expr){ withCallingHandlers( expr, warning = function(w){ if(grepl("^'layout' objects don't have these attributes: 'boxmode'",w$message)){ invokeRestart("muffleWarning") } } ) } library(plotly) test_that("Boxplots are correctly generated", { data <- data.frame( USUBJID = c("1", "1", "2", "2", "2"), AVISIT = c("Week 1", "Week 1", "Baseline", "Week 1", "Week 1"), ATPT = c("PREDOSE", "1H", "PREDOSE", "PREDOSE", "PREDOSE"), TRTA = c("A", "A", "B", "B", "B"), AVAL = c(34, 29, 70, 13, 45), patientProfileLink = sprintf("label", c(1, 1, 2, 2, 2)), stringsAsFactors = FALSE ) # create plot pl <- ignoreBoxmodeWarning({ boxplotClinData( data = data, xVar = "AVISIT", yVar = "AVAL", colorVar = "TRTA", facetVar = "ATPT", title = "Diastolic Blood Pressure distribution by actual visit and analysis timepoint", yLab = "Actual value of the Diastolic Blood Pressure parameter (mmHg)", pathVar = "patientProfileLink" ) }) ## check if input == output data # extract data from output object plData <- ignoreBoxmodeWarning(plotly_build(pl)$x$data) # only box aes plDataBox <- plData[sapply(plData, function(x) x$type == "box")] plDataBoxDf <- do.call(rbind, lapply(plDataBox, function(x) data.frame( AVISIT = as.character(x[["x"]]), AVAL = as.numeric(x$y), TRTA = x$legendgroup, # To get facetVar look at the key definition. This extraction relies on the # column facetVar position in the key-column definition. # Ideally it should be made more general in the future. ATPT = strsplit(as.character(x$key),"\\.")[[1]][[3]], stringsAsFactors = FALSE ) ) ) data <- data[c("AVISIT","AVAL","TRTA","ATPT")] # order data to compare with each other data <- data[with(data,order(ATPT, TRTA, AVISIT, AVAL)),] plDataBoxDf <- plDataBoxDf[with(plDataBoxDf,order(ATPT, TRTA, AVISIT, AVAL)),] expect_equivalent(object = data, expected = plDataBoxDf) }) test_that("An interactive table is created in addition to the boxplot", { data <- data.frame( USUBJID = c("1", "1", "2", "2", "2"), AVISIT = c("Week 1", "Week 1", "Baseline", "Week 1", "Week 1"), ATPT = c("PREDOSE", "1H", "PREDOSE", "PREDOSE", "PREDOSE"), TRTA = c("A", "A", "B", "B", "B"), AVAL = c(34, 29, 70, 13, 45), patientProfileLink = sprintf("label", c(1, 1, 2, 2, 2)) ) # create plot res <- ignoreBoxmodeWarning({ boxplotClinData( data = data, xVar = "AVISIT", yVar = "AVAL", colorVar = "TRTA", facetVar = "ATPT", table = TRUE, pathVar = "patientProfileLink", pathLab = "Subject variable" ) }) expect_s3_class(res$table, "datatables") }) test_that("A boxplot with selected hover variables is created", { data <- data.frame( USUBJID = c("1", "1", "2", "2", "2"), AVISIT = c("Week 1", "Week 1", "Baseline", "Week 1", "Week 1"), AVAL = c(34, 29, 70, 13, 45) ) # create plot res <- ignoreBoxmodeWarning({ boxplotClinData( data = data, xVar = "AVISIT", yVar = "AVAL", hoverVars = c("USUBJID", "AVISIT", "AVAL") ) }) expect_s3_class(res, "plotly") }) test_that("A boxplot is successfully created with a color variable but without facets", { data <- data.frame( USUBJID = c("1", "1", "2", "2", "2"), AVISIT = c("Week 1", "Week 1", "Baseline", "Week 1", "Week 1"), AVAL = c(34, 29, 70, 13, 45), TRTA = c("A", "A", "B", "B", "B") ) # create plot res <- ignoreBoxmodeWarning({ boxplotClinData( data = data, xVar = "AVISIT", yVar = "AVAL", colorVar = "TRTA", facetVar = NULL, ) }) expect_s3_class(res, "plotly") }) test_that("A boxplot is successfully created with facets but without a color variable", { data <- data.frame( USUBJID = c("1", "1", "2", "2", "2"), AVISIT = c("Week 1", "Week 1", "Baseline", "Week 1", "Week 1"), AVAL = c(34, 29, 70, 13, 45), ATPT = c("PREDOSE", "1H", "PREDOSE", "PREDOSE", "PREDOSE") ) # create plot res <- ignoreBoxmodeWarning({ boxplotClinData( data = data, xVar = "AVISIT", yVar = "AVAL", colorVar = NULL, facetVar = "ATPT", ) }) expect_s3_class(res, "plotly") }) test_that("A boxplot is successfully created without a color variable and facets", { data <- data.frame( USUBJID = c("1", "1", "2", "2", "2"), AVISIT = c("Week 1", "Week 1", "Baseline", "Week 1", "Week 1"), AVAL = c(34, 29, 70, 13, 45) ) res <- ignoreBoxmodeWarning({ boxplotClinData( data = data, xVar = "AVISIT", yVar = "AVAL", colorVar = NULL, facetVar = NULL, ) }) expect_s3_class(res, "plotly") })