From eec205ff226e957e80e1d2dff5037b59fc432c16 Mon Sep 17 00:00:00 2001 From: Pierre Chelle <45343665+pchelle@users.noreply.github.com> Date: Wed, 16 Aug 2023 04:24:37 -0400 Subject: [PATCH] Fixes #477 better handling of non available angles (#478) --- R/error-checks.R | 22 ++++++++++++++++++++++ R/font.R | 3 ++- R/messages.R | 6 ++++++ R/plotconfiguration-label.R | 14 +++++--------- man/dot-checkIsInAvailableAngles.Rd | 17 +++++++++++++++++ 5 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 man/dot-checkIsInAvailableAngles.Rd diff --git a/R/error-checks.R b/R/error-checks.R index 75031bca..2e336c95 100644 --- a/R/error-checks.R +++ b/R/error-checks.R @@ -88,4 +88,26 @@ } warning(messages$warningValuesNotWitinRange(x, left, right, strict)) return(invisible()) +} + + +#' Check if an input angle is within available angles +#' +#' @param angle an input angle provided by user +#' @param availableAngles available angle for usage og `ggtext` +#' @import ospsuite.utils +#' @keywords internal +.checkIsInAvailableAngles <- function(angle, availableAngles = c(0,90,180,270)){ + validateIsNumeric(angle) + newAngle <- tryCatch({ + validateIsIncluded(angle, availableAngles) + return(angle) + }, + error = function(e){ + angleDifferences <- abs(angle - availableAngles) + closestAngle <- head(availableAngles[which(angleDifferences == min(angleDifferences))], 1) + warning(messages$warningAngleNotIncludedInAvailableAngles(angle, closestAngle)) + return(closestAngle) + }) + return(newAngle) } \ No newline at end of file diff --git a/R/font.R b/R/font.R index ae5825a5..4aa8e73d 100644 --- a/R/font.R +++ b/R/font.R @@ -137,8 +137,9 @@ Font <- R6::R6Class( } .convertAngleToOrientation <- function(angle){ + # use modulo 360 to in case minus angles were provided return( - switch(as.character(angle), + switch(as.character(angle %% 360), "0" = "upright", "90" = "left-rotated", "180" = "right-rotated", diff --git a/R/messages.R b/R/messages.R index 2aa5ed65..54a745c9 100644 --- a/R/messages.R +++ b/R/messages.R @@ -32,5 +32,11 @@ messages <- list( ifelse(strict, "strictly ", ""), "within [", paste0(range(left, right), collapse = ";"), "] range" ) + }, + warningAngleNotIncludedInAvailableAngles = function(oldAngle, newAngle){ + paste0( + "Angles other than 0, 90, 180 and 270 are not available for title, subtitles, caption and axis titles. ", + "Replacing '", oldAngle, "' by closest available value: '", newAngle, "'." + ) } ) diff --git a/R/plotconfiguration-label.R b/R/plotconfiguration-label.R index 2624c4e4..35462600 100644 --- a/R/plotconfiguration-label.R +++ b/R/plotconfiguration-label.R @@ -54,16 +54,12 @@ LabelConfiguration <- R6::R6Class( for (labelName in names(labels)) { label <- labels[[labelName]] if(!isOfType(label, "Label")) { - labels[[labelName]] <- asLabel(text = label, font = currentTheme$fonts[[labelName]]) + label <- asLabel(text = label, font = currentTheme$fonts[[labelName]]) } - - # Check Chosen angle is available - availableAngles <- c(0,90,180,270) - if (!(labels[[labelName]]$font$angle %in% availableAngles)) { - labels[[labelName]]$font$angle <- availableAngles[which(abs(label$font$angle - availableAngles) == min(abs(label$font$angle - availableAngles)))][1] - warning("Angles other than 0, 90, 189 and 270 are not available for title, subtitles, caption and axis titles. Replacing by closest available value: ", label$font$angle,".") - } - private[[paste0(".", labelName)]] <- asLabel(labels[[labelName]]) + # Check chosen angle is available + # use modulo 360 to in case minus angles were provided + label$font$angle <- .checkIsInAvailableAngles(label$font$angle %% 360) + private[[paste0(".", labelName)]] <- asLabel(label) } }, diff --git a/man/dot-checkIsInAvailableAngles.Rd b/man/dot-checkIsInAvailableAngles.Rd new file mode 100644 index 00000000..1e24b26d --- /dev/null +++ b/man/dot-checkIsInAvailableAngles.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/error-checks.R +\name{.checkIsInAvailableAngles} +\alias{.checkIsInAvailableAngles} +\title{Check if an input angle is within available angles} +\usage{ +.checkIsInAvailableAngles(angle, availableAngles = c(0, 90, 180, 270)) +} +\arguments{ +\item{angle}{an input angle provided by user} + +\item{availableAngles}{available angle for usage og \code{ggtext}} +} +\description{ +Check if an input angle is within available angles +} +\keyword{internal}