From 632f9751af8d2c6b60945f575e005590d1f1ae85 Mon Sep 17 00:00:00 2001 From: Gael <Gael@WL20-0067.corp.pasteur.fr> Date: Fri, 8 Oct 2021 13:28:24 +0200 Subject: [PATCH] v10.8.3 release --- README.md | 5 + cute_little_R_functions.R | 8853 +++++++++++++++++----------------- cute_little_R_functions.docx | Bin 493524 -> 493745 bytes 3 files changed, 4434 insertions(+), 4424 deletions(-) diff --git a/README.md b/README.md index b4acd9a..28f1782 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,11 @@ Gitlab developers ## WHAT'S NEW IN +### v10.8.3 + +1) fun.test() and fun.slide() debbuged for cute.path + + ### v10.8.2 1) forgot to add fun_gg_scatter() and fun_gg_boxplot() to v10.8.1. Now ok diff --git a/cute_little_R_functions.R b/cute_little_R_functions.R index 1d08a27..91196fa 100644 --- a/cute_little_R_functions.R +++ b/cute_little_R_functions.R @@ -2057,11 +2057,13 @@ fun_test <- function( tempo <- fun_check(data = cute.path, class = "vector", typeof = "character", length = 1, fun.name = function.name) ; eval(ee) if(tempo$problem == FALSE){ if(grepl(x = cute.path, pattern = "^http")){ - tempo.try1 <- any(grepl(x = fun_get_message("source(cute.path)"), pattern = "^[Ee]rror")) + tempo.error1 <- any(grepl(x = fun_get_message("source(cute.path)"), pattern = "^[Ee]rror")) + tempo.error2 <- FALSE }else{ - tempo.try2 <- ! file.exists(cute.path) + tempo.error1 <- FALSE + tempo.error2 <- ! file.exists(cute.path) } - if(tempo.try1 | tempo.try2){ + if(tempo.error1 | tempo.error2){ tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(grepl(x = cute.path, pattern = "^http"), "URL", "FILE"), " PATH INDICATED IN THE cute.path PARAMETER DOES NOT EXISTS:\n", cute.path) text.check <- c(text.check, tempo.cat) arg.check <- c(arg.check, TRUE) @@ -3952,11 +3954,13 @@ fun_slide <- function( tempo <- fun_check(data = cute.path, class = "vector", typeof = "character", length = 1, fun.name = function.name) ; eval(ee) if(tempo$problem == FALSE){ if(grepl(x = cute.path, pattern = "^http")){ - tempo.try1 <- any(grepl(x = fun_get_message("source(cute.path)"), pattern = "^[Ee]rror")) + tempo.error1 <- any(grepl(x = fun_get_message("source(cute.path)"), pattern = "^[Ee]rror")) + tempo.error2 <- FALSE }else{ - tempo.try2 <- ! file.exists(cute.path) + tempo.error1 <- FALSE + tempo.error2 <- ! file.exists(cute.path) } - if(tempo.try1 | tempo.try2){ + if(tempo.error1 | tempo.error2){ tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(grepl(x = cute.path, pattern = "^http"), "URL", "FILE"), " PATH INDICATED IN THE cute.path PARAMETER DOES NOT EXISTS:\n", cute.path) text.check <- c(text.check, tempo.cat) arg.check <- c(arg.check, TRUE) @@ -9043,4261 +9047,4262 @@ fun_get_message <- function( # add horizontal argument and deal any conflict with vertical argument. Start with horizontal = NULL as default. If ! is.null() -> convert vertical if required fun_gg_boxplot <- function( -data1, -y, -categ, -categ.class.order = NULL, -categ.color = NULL, -box.legend.name = NULL, -box.fill = FALSE, -box.width = 0.5, -box.space = 0.1, -box.line.size = 0.75, -box.notch = FALSE, -box.alpha = 1, -box.mean = TRUE, -box.whisker.kind = "std", -box.whisker.width = 0, -dot.color = grey(0.25), -dot.categ = NULL, -dot.categ.class.order = NULL, -dot.legend.name = NULL, -dot.tidy = FALSE, -dot.tidy.bin.nb = 50, -dot.jitter = 0.5, -dot.seed = 2, -dot.size = 3, -dot.alpha = 0.5, -dot.border.size = 0.5, -dot.border.color = NULL, -x.lab = NULL, -x.angle = 0, -y.lab = NULL, -y.lim = NULL, -y.log = "no", -y.tick.nb = NULL, -y.second.tick.nb = 1, -y.include.zero = FALSE, -y.top.extra.margin = 0.05, -y.bottom.extra.margin = 0.05, -stat.pos = "top", -stat.mean = FALSE, -stat.size = 4, -stat.dist = 5, -stat.angle = 0, -vertical = TRUE, -text.size = 12, -title = "", -title.text.size = 8, -legend.show = TRUE, -legend.width = 0.5, -article = TRUE, -grid = FALSE, -add = NULL, -return = FALSE, -return.ggplot = FALSE, -return.gtable = TRUE, -plot = TRUE, -warn.print = FALSE, -lib.path = NULL + data1, + y, + categ, + categ.class.order = NULL, + categ.color = NULL, + box.legend.name = NULL, + box.fill = FALSE, + box.width = 0.5, + box.space = 0.1, + box.line.size = 0.75, + box.notch = FALSE, + box.alpha = 1, + box.mean = TRUE, + box.whisker.kind = "std", + box.whisker.width = 0, + dot.color = grey(0.25), + dot.categ = NULL, + dot.categ.class.order = NULL, + dot.legend.name = NULL, + dot.tidy = FALSE, + dot.tidy.bin.nb = 50, + dot.jitter = 0.5, + dot.seed = 2, + dot.size = 3, + dot.alpha = 0.5, + dot.border.size = 0.5, + dot.border.color = NULL, + x.lab = NULL, + x.angle = 0, + y.lab = NULL, + y.lim = NULL, + y.log = "no", + y.tick.nb = NULL, + y.second.tick.nb = 1, + y.include.zero = FALSE, + y.top.extra.margin = 0.05, + y.bottom.extra.margin = 0.05, + stat.pos = "top", + stat.mean = FALSE, + stat.size = 4, + stat.dist = 5, + stat.angle = 0, + vertical = TRUE, + text.size = 12, + title = "", + title.text.size = 8, + legend.show = TRUE, + legend.width = 0.5, + article = TRUE, + grid = FALSE, + add = NULL, + return = FALSE, + return.ggplot = FALSE, + return.gtable = TRUE, + plot = TRUE, + warn.print = FALSE, + lib.path = NULL ){ -# AIM -# Plot ggplot2 boxplots + dots + means -# For ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html -# WARNINGS -# Rows containing NA in data1[, c(y, categ)] will be removed before processing, with a warning (see below) -# Hinges are not computed like in the classical boxplot() function of R. See https://ggplot2.tidyverse.org/reference/geom_boxplot.html -# To have a single box, please create a factor column with a single class and specify the name of this column in the categ argument. For a single set of grouped boxes, create a factor column with a single class and specify this column in categ argument as first element (i.e., as categ1, knowing that categ2 must also be specified in this situation). See categ argument below -# The dot.alpha argument can alter the display of the color boxes when using pdf output -# Size arguments (box.line.size, dot.size, dot.border.size, stat.size, text.size and title.text.size) are in mm. See Hadley comment in https://stackoverflow.com/questions/17311917/ggplot2-the-unit-of-size. See also http://sape.inf.usi.ch/quick-reference/ggplot2/size). Unit object are not accepted, but conversion can be used (e.g., grid::convertUnit(grid::unit(0.2, "inches"), "mm", valueOnly = TRUE)) -# Display seems to be done twice on Windows devices (like a blink). However, no double plots on pdf devices. Thus, the blink remains mysterious -# To remove boxes and have only dots, use box.alpha = 0 -# ARGUMENTS -# data1: data frame containing one column of quantitative values (see the y argument below) and one or two columns of categories (see the categ argument below). Duplicated column names are not allowed -# y: character string of the data1 column name for y-axis (column containing numeric values). Numeric values will be split according to the classes of the column names indicated in the categ argument to generate the boxes and will also be used to plot the dots -# categ: vector of character strings of the data1 column name for categories (column of characters or factors). Must be either one or two column names. If a single column name (further referred to as categ1), then one box per class of categ1. If two column names (further referred to as categ1 and categ2), then one box per class of categ2, which form a group of boxes in each class of categ1. WARNING: no empty classes allowed. To have a single box, create a factor column with a single class and specify the name of this column in the categ argument (here, no categ2 in categ argument). For a single set of grouped boxes, create a factor column with a single class and specify this column in categ argument as first element (i.e., as categ1), in addition to the already used category (as categ2 in this situation) -# categ.class.order: list indicating the order of the classes of categ1 and categ2 represented on the boxplot (the first compartment for categ1 and and the second for categ2). If categ.class.order == NULL, classes are represented according to the alphabetical order. Some compartments can be NULL and others not. See the categ argument for categ1 and categ2 description -# categ.color: vector of color character string for box frames (see the categ argument for categ1 and categ2 description) -# If categ.color == NULL, default colors of ggplot2, whatever categ1 and categ2 -# If categ.color is non-null and only categ1 in categ argument, categ.color can be either: -# (1) a single color string. All the boxes will have this color, whatever the number of classes of categ1 -# (2) a vector of string colors, one for each class of categ1. Each color will be associated according to categ.class.order of categ1 -# (3) a vector or factor of string colors, like if it was one of the column of data1 data frame. WARNING: a single color per class of categ1 and a single class of categ1 per color must be respected -# Color functions, like grey(), hsv(), etc., are also accepted -# Positive integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the maximal integer value among all the integers in categ.color (see fun_gg_palette()) -# If categ.color is non-null and categ1 and categ2 are specified, all the rules described above will apply to categ2 instead of categ1 (colors will be determined for boxes inside a group of boxes) -# box.legend.name: character string of the legend title. If box.legend.name is NULL, then box.legend.name <- categ1 if only categ1 is present, and box.legend.name <- categ2 if categ1 and categ2 are present in the categ argument. Write "" if no legend required. See the categ argument for categ1 and categ2 description -# box.fill: logical. Fill the box? If TRUE, the categ.color argument will be used to generate filled boxplots (the box frames being black) as well as filled outlier dots (the dot border being controlled by the dot.border.color argument). If all the dots are plotted (argument dot.color other than NULL), they will be over the boxes. If FALSE, the categ.color argument will be used to color the box frames and the outlier dot borders. If all the dots are plotted, they will be beneath the boxes -# box.width: single numeric value (from 0 to 1) of width of either boxes or group of boxes -# When categ argument has a single categ1 element (i.e., separate boxes. See the categ argument for categ1 and categ2 description), then each class of categ1 is represented by a single box. In that case, box.width argument defines each box width, from 0 (no box width) to 1 (max box width), but also the space between boxes (the code uses 1 - box.width for the box spaces). Of note, xmin and xmax of the fun_gg_boxplot() output report the box boundaries (around x-axis unit 1, 2, 3, etc., for each box) -# When categ argument has a two categ1 and categ2 elements (i.e., grouped boxes), box.width argument defines the width allocated for each set of grouped boxes, from 0 (no group width) to 1 (max group width), but also the space between grouped boxes (the code uses 1 - box.width for the spaces). Of note, xmin and xmax of the fun_gg_boxplot() output report the box boundaries (around x-axis unit 1, 2, 3, etc., for each set of grouped box) -# box.space: single numeric value (from 0 to 1) indicating the box separation inside grouped boxes, when categ argument has a two categ1 and categ2 elements. 0 means no space and 1 means boxes shrunk to a vertical line. Ignored if categ argument has a single categ1 element -# box.line.size: single numeric value of line width of boxes and whiskers in mm -# box.notch: logical. Notched boxplot? It TRUE, display notched boxplot, notches corresponding approximately to the 95% confidence interval of the median (the notch interval is exactly 1.58 x Inter Quartile Range (IQR) / sqrt(n), with n the number of values that made the box). If notch intervals between two boxes do not overlap, it can be interpreted as significant median differences -# box.alpha: single numeric value (from 0 to 1) of box transparency (full transparent to full opaque, respectively). To remove boxplots, use box.alpha = 0 -# box.mean: logical. Add mean value? If TRUE, a diamond-shaped dot, with the horizontal diagonal corresponding to the mean value, is displayed over each boxplot -# box.whisker.kind: range of the whiskers. Either "no" (no whiskers), or "std" (length of each whisker equal to 1.5 x Inter Quartile Range (IQR)), or "max" (length of the whiskers up or down to the most distant dot) -# box.whisker.width: single numeric value (from 0 to 1) of the whisker width, with 0 meaning no whiskers and 1 meaning a width equal to the box width -# dot.color: vector of color character string ruling the dot colors and the dot display. See the example section below for easier understanding of the rules described here -# If NULL, no dots plotted -# If "same", the dots will have the same colors as the respective boxplots -# Otherwise, as in the rule (1), (2) or (3) described in the categ.color argument, except that in the possibility (3), the rule "a single color per class of categ and a single class of categ per color", does not have to be respected (for instance, each dot can have a different color). Colors will also depend on the dot.categ argument. If dot.categ is NULL, then colors will be applied to each class of the last column name specified in categ. If dot.categ is non-NULL, colors will be applied to each class of the column name specified in dot.categ. See examples -# dot.categ: optional single character string of a column name (further referred to as categ3) of the data1 argument. This column of data1 will be used to generate a legend for dots, in addition to the legend for boxes. See the dot.color argument for details about the way the legend is built using the two dot.categ and dot.color arguments. If NULL, no legend created and the colors of dots will depend on dot.color and categ arguments (as explained in the dot.color argument) -# dot.categ.class.order: optional vector of character strings indicating the order of the classes of categ3 (see the dot.categ argument). If dot.categ is non-NULL and dot.categ.class.order is NULL, classes are displayed in the legend according to the alphabetical order. Ignored if dot.categ is NULL -# dot.legend.name: optional character string of the legend title for categ3 (see the dot.categ argument). If dot.legend.name == NULL, dot.categ value is used (name of the column in data1). Write "" if no legend required. Ignored if dot.categ is NULL -# dot.tidy: logical. Nice dot spreading? If TRUE, use the geom_dotplot() function for a nice representation. WARNING: change the true quantitative coordinates of dots (i.e., y-axis values for vertical display) because of binning. Thus, the gain in aestheticism is associated with a loss in precision that can be very important. If FALSE, dots are randomly spread on the qualitative axis, using the dot.jitter argument (see below) keeping the true quantitative coordinates -# dot.tidy.bin.nb: positive integer indicating the number of bins (i.e., nb of separations) of the y.lim range. Each dot will then be put in one of the bin, with a diameter of the width of the bin. In other words, increase the number of bins to have smaller dots. Not considered if dot.tidy is FALSE -# dot.jitter: numeric value (from 0 to 1) of random dot horizontal dispersion (for vertical display), with 0 meaning no dispersion and 1 meaning dispersion in the corresponding box width interval. Not considered if dot.tidy is TRUE -# dot.seed: integer value that set the random seed. Using the same number will generate the same dot jittering. Write NULL to have different jittering each time the same instruction is run. Ignored if dot.tidy is TRUE -# dot.size: numeric value of dot diameter in mm. Not considered if dot.tidy is TRUE -# dot.alpha: numeric value (from 0 to 1) of dot transparency (full transparent to full opaque, respectively) -# dot.border.size: numeric value of border dot width in mm. Write zero for no dot border. If dot.tidy is TRUE, value 0 remove the border and other values leave the border without size control (geom_doplot() feature) -# dot.border.color: single character color string defining the color of the dot border (same color for all the dots, whatever their categories). If dot.border.color == NULL, the border color will be the same as the dot color. A single integer is also accepted instead of a character string, that will be processed by fun_gg_palette() -# x.lab: a character string or expression for x-axis legend. If NULL, character string of categ1 (see the categ argument for categ1 and categ2 description) -# x.angle: integer value of the text angle for the x-axis numbers, using the same rules as in ggplot2. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. -# y.lab: a character string or expression for y-axis legend. If NULL, character string of the y argument -# y.lim: 2 numeric values indicating the range of the y-axis. Order matters (for inverted axis). If NULL, the range of the x column name of data1 will be used. -# y.log: either "no", "log2" (values in the y argument column of the data1 data frame will be log2 transformed and y-axis will be log2 scaled) or "log10" (values in the y argument column of the data1 data frame will be log10 transformed and y-axis will be log10 scaled). WARNING: not possible to have horizontal boxes with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) -# y.tick.nb: approximate number of desired values labeling the y-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if y.log is "no", then the number of labeling values is set by ggplot2. If NULL and if y.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the y.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for y.lim = c(9, 1200)). WARNING: if non-NULL and if y.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) -# y.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if y.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$y.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks -# y.include.zero: logical. Does y.lim range include 0? Ignored if y.log is "log2" or "log10" -# y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to y.lim. If different from 0, add the range of the axis multiplied by y.top.extra.margin (e.g., abs(y.lim[2] - y.lim[1]) * y.top.extra.margin) to the top of y-axis -# y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis -# stat.pos: add the median number above the corresponding box. Either NULL (no number shown), "top" (at the top of the plot region) or "above" (above each box) -# stat.mean: logical. Display mean numbers instead of median numbers? Ignored if stat.pos is NULL -# stat.size: numeric value of the stat font size in mm. Ignored if stat.pos is NULL -# stat.dist: numeric value of the stat distance in percentage of the y-axis range (stat.dist = 5 means move the number displayed at 5% of the y-axis range). Ignored if stat.pos is NULL or "top" -# stat.angle: integer value of the angle of stat, using the same rules as in ggplot2. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. -# vertical: logical. Vertical boxes? WARNING: will be automatically set to TRUE if y.log argument is other than "no". Indeed, not possible to have horizontal boxes with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) -# text.size: numeric value of the font size of the (1) axis numbers, (2) axis labels and (3) texts in the graphic legend (in mm) -# title: character string of the graph title -# title.text.size: numeric value of the title font size in mm -# legend.show: logical. Show legend? Not considered if categ argument is NULL, because this already generate no legend, excepted if legend.width argument is non-NULL. In that specific case (categ is NULL, legend.show is TRUE and legend.width is non-NULL), an empty legend space is created. This can be useful when desiring graphs of exactly the same width, whatever they have legends or not -# legend.width: single proportion (between 0 and 1) indicating the relative width of the legend sector (on the right of the plot) relative to the width of the plot. Value 1 means that the window device width is split in 2, half for the plot and half for the legend. Value 0 means no room for the legend, which will overlay the plot region. Write NULL to inactivate the legend sector. In such case, ggplot2 will manage the room required for the legend display, meaning that the width of the plotting region can vary between graphs, depending on the text in the legend -# article: logical. If TRUE, use an article theme (article like). If FALSE, use a classic related ggplot theme. Use the add argument (e.g., add = "+ggplot2::theme_classic()" for the exact classic ggplot theme -# grid: logical. Draw lines in the background to better read the box values? Not considered if article == FALSE (grid systematically present) -# add: character string allowing to add more ggplot2 features (dots, lines, themes, facet, etc.). Ignored if NULL -# WARNING: (1) the string must start with "+", (2) the string must finish with ")" and (3) each function must be preceded by "ggplot2::". Example: "+ ggplot2::coord_flip() + ggplot2::theme_bw()" -# If the character string contains the "ggplot2::theme" string, then the article argument of fun_gg_boxplot() (see above) is ignored with a warning -# Handle the add argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions -# WARNING: the call of objects inside the quotes of add can lead to an error if the name of these objects are some of the fun_gg_boxplot() arguments. Indeed, the function will use the internal argument instead of the global environment object. Example article <- "a" in the working environment and add = '+ ggplot2::ggtitle(article)'. The risk here is to have TRUE as title. To solve this, use add = '+ ggplot2::ggtitle(get("article", envir = .GlobalEnv))' -# return: logical. Return the graph parameters? -# return.ggplot: logical. Return the ggplot object in the output list? Ignored if return argument is FALSE. WARNING: always assign the fun_gg_boxplot() function (e.g., a <- fun_gg_boxplot()) if return.ggplot argument is TRUE, otherwise, double plotting is performed. See $ggplot in the RETURN section below for more details -# return.gtable: logical. Return the ggplot object as gtable of grobs in the output list? Ignored if plot argument is FALSE. Indeed, the graph must be plotted to get the grobs dispositions. See $gtable in the RETURN section below for more details -# plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting -# warn.print: logical. Print warnings at the end of the execution? ? If FALSE, warning messages are never printed, but can still be recovered in the returned list. Some of the warning messages (those delivered by the internal ggplot2 functions) are not apparent when using the argument plot = FALSE -# lib.path: character string indicating the absolute path of the required packages (see below). if NULL, the function will use the R library default folders -# RETURN -# A boxplot if plot argument is TRUE -# A list of the graph info if return argument is TRUE: -# $data: the initial data with graphic information added -# $stat: the graphic statistics (mostly equivalent to ggplot_build()$data[[2]]) -# $removed.row.nb: which rows have been removed due to NA/Inf detection in y and categ columns (NULL if no row removed) -# $removed.rows: removed rows (NULL if no row removed) -# $plot: the graphic box and dot coordinates -# $dots: dot coordinates -# $main.box: coordinates of boxes -# $median: median coordinates -# $sup.whisker: coordinates of top whiskers (y for base and y.end for extremities) -# $inf.whisker: coordinates of bottom whiskers (y for base and y.end for extremities) -# $sup.whisker.edge: coordinates of top whisker edges (x and xend) -# $inf.whisker.edge: coordinates of bottom whisker edges(x and xend) -# $mean: diamond mean coordinates (only if box.mean argument is TRUE) -# $stat.pos: coordinates of stat numbers (only if stat.pos argument is not NULL) -# y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non-NULL or if y.log argument is different from "no") -# y.second.tick.values: values of secondary ticks. NULL except if y.second.tick.nb argument is non-NULL or if y.log argument is different from "no") -# $panel: the variable names used for the panels (NULL if no panels). WARNING: NA can be present according to ggplot2 upgrade to v3.3.0 -# $axes: the x-axis and y-axis info -# $warn: the warning messages. Use cat() for proper display. NULL if no warning. WARNING: warning messages delivered by the internal ggplot2 functions are not apparent when using the argument plot = FALSE -# $ggplot: ggplot object that can be used for reprint (use print(...$ggplot) or update (use ...$ggplot + ggplot2::...). NULL if return.ggplot argument is FALSE. Of note, a non-NULL $ggplot in the output list is sometimes annoying as the manipulation of this list prints the plot -# $gtable: gtable object that can be used for reprint (use gridExtra::grid.arrange(...$ggplot) or with additionnal grobs (see the grob decomposition in the examples). NULL if return.ggplot argument is FALSE. Contrary to $ggplot, a non-NULL $gtable in the output list is not annoying as the manipulation of this list does not print the plot -# REQUIRED PACKAGES -# ggplot2 -# gridExtra -# lemon (in case of use in the add argument) -# scales -# REQUIRED FUNCTIONS FROM THE cute PACKAGE -# fun_check() -# fun_comp_1d() -# fun_comp_2d() -# fun_gg_just() -# fun_gg_palette() -# fun_inter_ticks() -# fun_name_change() -# fun_pack() -# fun_round() -# fun_scale() -# EXAMPLE -# set.seed(1) ; obs1 <- data.frame(Time = c(rnorm(20, 100, 10), rnorm(20, 200, 50), rnorm(20, 500, 60), rnorm(20, 100, 50)), Categ1 = rep(c("CAT", "DOG"), times = 40), Categ2 = rep(c("A", "B", "C", "D"), each = 20), Color1 = rep(c("coral", "lightblue"), times = 40), Color2 = rep(c("#9F2108", "#306100", "#007479", "#8500C0"), each = 20), stringsAsFactors = TRUE) ; set.seed(NULL) ; fun_gg_boxplot(data1 = obs1, y = "Time", categ = "Categ1") -# see http -# DEBUGGING -# set.seed(1) ; obs1 <- data.frame(Time = c(rnorm(10), rnorm(10) + 2), Categ1 = rep(c("G", "H"), each = 10), stringsAsFactors = TRUE) ; set.seed(NULL) ; obs1$Time[1:10] <- NA ; data1 = obs1 ; y = "Time" ; categ = c("Categ1") ; categ.class.order = NULL ; categ.color = NULL ; box.legend.name = NULL ; box.fill = FALSE ; box.width = 0.5 ; box.space = 0.1 ; box.line.size = 0.75 ; box.notch = FALSE ; box.alpha = 1 ; box.mean = TRUE ; box.whisker.kind = "std" ; box.whisker.width = 0 ; dot.color = grey(0.25) ; dot.categ = NULL ; dot.categ.class.order = NULL ; dot.legend.name = NULL ; dot.tidy = FALSE ; dot.tidy.bin.nb = 50 ; dot.jitter = 0.5 ; dot.seed = 2 ; dot.size = 3 ; dot.alpha = 0.5 ; dot.border.size = 0.5 ; dot.border.color = NULL ; x.lab = NULL ; x.angle = 0 ; y.lab = NULL ; y.lim = NULL ; y.log = "no" ; y.tick.nb = NULL ; y.second.tick.nb = 1 ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0.05 ; stat.pos = "top" ; stat.mean = FALSE ; stat.size = 4 ; stat.dist = 5 ; stat.angle = 0 ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; legend.show = TRUE ; legend.width = 0.5 ; article = TRUE ; grid = FALSE ; add = NULL ; return = FALSE ; return.ggplot = FALSE ; return.gtable = TRUE ; plot = TRUE ; warn.print = FALSE ; lib.path = NULL -# function name -function.name <- paste0(as.list(match.call(expand.dots = FALSE))[[1]], "()") -arg.names <- names(formals(fun = sys.function(sys.parent(n = 2)))) # names of all the arguments -arg.user.setting <- as.list(match.call(expand.dots = FALSE))[-1] # list of the argument settings (excluding default values not provided by the user) -# end function name -# required function checking -req.function <- c( -"fun_comp_2d", -"fun_gg_just", -"fun_gg_palette", -"fun_name_change", -"fun_pack", -"fun_check", -"fun_round", -"fun_scale", -"fun_inter_ticks" -) -tempo <- NULL -for(i1 in req.function){ -if(length(find(i1, mode = "function")) == 0L){ -tempo <- c(tempo, i1) -} -} -if( ! is.null(tempo)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nREQUIRED cute FUNCTION", ifelse(length(tempo) > 1, "S ARE", " IS"), " MISSING IN THE R ENVIRONMENT:\n", paste0(tempo, collapse = "()\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end required function checking -# reserved words to avoid bugs (names of dataframe columns used in this function) -reserved.words <- c("categ.check", "categ.color", "dot.color", "dot.categ", "dot.max", "dot.min", "group", "PANEL", "group.check", "MEAN", "tempo.categ1", "tempo.categ2", "text.max.pos", "text.min.pos", "x", "x.y", "y", "y.check", "y_from.dot.max", "ymax", "tidy_group", "binwidth") -# end reserved words to avoid bugs (used in this function) -# arg with no default values -mandat.args <- c( -"data1", -"y", -"categ" -) -tempo <- eval(parse(text = paste0("missing(", paste0(mandat.args, collapse = ") | missing("), ")"))) -if(any(tempo)){ # normally no NA for missing() output -tempo.cat <- paste0("ERROR IN ", function.name, "\nFOLLOWING ARGUMENT", ifelse(length(mandat.args) > 1, "S HAVE", "HAS"), " NO DEFAULT VALUE AND REQUIRE ONE:\n", paste0(mandat.args, collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end arg with no default values -# argument primary checking -arg.check <- NULL # -text.check <- NULL # -checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools -ee <- expression(arg.check <- c(arg.check, tempo$problem) , text.check <- c(text.check, tempo$text) , checked.arg.names <- c(checked.arg.names, tempo$object.name)) -tempo <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = categ, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) -if( ! is.null(categ.class.order)){ -tempo <- fun_check(data = categ.class.order, class = "list", fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = categ.class.order, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(box.legend.name)){ -tempo <- fun_check(data = box.legend.name, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = box.legend.name, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(categ.color)){ -tempo1 <- fun_check(data = categ.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = categ.color, class = "factor", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.check.color <- fun_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, neg.values = FALSE, fun.name = function.name)$problem -if(tempo.check.color == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -}else if(any(categ.color == 0L, na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = categ.color, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = box.fill, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.space, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.line.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.notch, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.mean, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.whisker.kind, options = c("no", "std", "max"), length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.whisker.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(dot.color)){ -tempo1 <- fun_check(data = dot.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = dot.color, class = "factor", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.check.color <- fun_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, neg.values = FALSE, fun.name = function.name)$problem -if(tempo.check.color == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -}else if(any(dot.color == 0L, na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.color, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(dot.categ)){ -tempo <- fun_check(data = dot.categ, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.categ, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(dot.categ.class.order)){ -tempo <- fun_check(data = dot.categ.class.order, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.categ.class.order, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(dot.legend.name)){ -tempo <- fun_check(data = dot.legend.name, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.legend.name, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = dot.tidy, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = dot.tidy.bin.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if(dot.tidy.bin.nb == 0L){ # length and NA checked above -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.tidy.bin.nb ARGUMENT MUST BE A NON-NULL AND POSITVE INTEGER VALUE") # integer possible because dealt above -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -tempo <- fun_check(data = dot.jitter, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(dot.seed)){ -tempo <- fun_check(data = dot.seed, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = TRUE, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.seed, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = dot.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -if( ! is.null(dot.border.color)){ -tempo1 <- fun_check(data = dot.border.color, class = "vector", mode = "character", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.border.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR STRING STARTING BY #, OR (2) A COLOR NAME GIVEN BY colors(), OR (3) AN INTEGER VALUE") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -}else if(tempo1$problem == FALSE & tempo2$problem == TRUE){ -if( ! all(dot.border.color %in% colors() | grepl(pattern = "^#", dot.border.color), na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.border.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR STRING STARTING BY #, OR (2) A COLOR NAME GIVEN BY colors(), OR (3) AN INTEGER VALUE") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.border.color, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(x.lab)){ -tempo1 <- fun_check(data = x.lab, class = "expression", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = x.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lab ARGUMENT MUST BE A SINGLE CHARACTER STRING OR EXPRESSION") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x.lab, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = x.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) -if( ! is.null(y.lab)){ -tempo1 <- fun_check(data = y.lab, class = "expression", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = y.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lab ARGUMENT MUST BE A SINGLE CHARACTER STRING OR EXPRESSION") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.lab, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(y.lim)){ -tempo <- fun_check(data = y.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if(any(is.infinite(y.lim))){ # normally no NA for is.infinite() output -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.lim, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = y.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(y.tick.nb)){ -tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if(y.tick.nb < 0){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(y.second.tick.nb)){ -tempo <- fun_check(data = y.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if(y.second.tick.nb <= 0){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.second.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.second.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(stat.pos)){ -tempo <- fun_check(data = stat.pos, options = c("top", "above"), length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = stat.pos, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = stat.mean, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = stat.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = stat.dist, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = stat.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = vertical, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = legend.show, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(legend.width)){ -tempo <- fun_check(data = legend.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = legend.width, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = article, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(add)){ -tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = add, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = return.ggplot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = return.gtable, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(lib.path)){ -tempo <- fun_check(data = lib.path, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if( ! all(dir.exists(lib.path), na.rm = TRUE)){ # separation to avoid the problem of tempo$problem == FALSE and lib.path == NA -tempo.cat <- paste0("ERROR IN ", function.name, "\nDIRECTORY PATH INDICATED IN THE lib.path ARGUMENT DOES NOT EXISTS:\n", paste(lib.path, collapse = "\n")) -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = lib.path, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if(any(arg.check) == TRUE){ # normally no NA -stop(paste0("\n\n================\n\n", paste(text.check[arg.check], collapse = "\n"), "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == # -} -# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.7/r_debugging_tools-v1.7.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() -# end argument primary checking -# second round of checking and data preparation -# management of NA arguments -tempo.arg <- names(arg.user.setting) # values provided by the user -tempo.log <- suppressWarnings(sapply(lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.na), FUN = any)) & lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = length) == 1L # no argument provided by the user can be just NA -if(any(tempo.log) == TRUE){ # normally no NA because is.na() used here -tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT JUST BE NA") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end management of NA arguments -# management of NULL arguments -tempo.arg <-c( -"data1", -"y", -"categ", -"box.fill", -"box.width", -"box.space", -"box.line.size", -"box.notch", -"box.alpha", -"box.mean", -"box.whisker.kind", -"box.whisker.width", -# "dot.color", # inactivated because can be null -"dot.tidy", -"dot.tidy.bin.nb", -"dot.jitter", -# "dot.seed", # inactivated because can be null -"dot.size", -"dot.alpha", -"dot.border.size", -"x.angle", -"y.log", -# "y.second.tick.nb", # inactivated because can be null -"y.include.zero", -"y.top.extra.margin", -"y.bottom.extra.margin", -# "stat.pos", # inactivated because can be null -"stat.mean", -"stat.size", -"stat.dist", -"stat.angle", -"vertical", -"text.size", -"title", -"title.text.size", -"legend.show", -# "legend.width", # inactivated because can be null -"article", -"grid", -"return", -"return.ggplot", -"return.gtable", -"plot", -"warn.print" -) -tempo.log <- sapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.null) -if(any(tempo.log) == TRUE){# normally no NA with is.null() -tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT BE NULL") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end management of NULL arguments -# code that protects set.seed() in the global environment -# see also Protocol 100-rev0 Parallelization in R.docx -if(exists(".Random.seed", envir = .GlobalEnv)){ # if .Random.seed does not exists, it means that no random operation has been performed yet in any R environment -tempo.random.seed <- .Random.seed -on.exit(assign(".Random.seed", tempo.random.seed, env = .GlobalEnv)) -}else{ -on.exit(set.seed(NULL)) # inactivate seeding -> return to complete randomness -} -set.seed(dot.seed) -# end code that protects set.seed() in the global environment -# warning initiation -ini.warning.length <- options()$warning.length -options(warning.length = 8170) -warn <- NULL -warn.count <- 0 -# end warning initiation -# other checkings -if(any(duplicated(names(data1)), na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nDUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if( ! (y %in% names(data1))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny ARGUMENT MUST BE A COLUMN NAME OF data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -tempo <- fun_check(data = data1[, y], data.name = "y COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) -if(tempo$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny ARGUMENT MUST BE NUMERIC COLUMN IN data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -if(length(categ) > 2){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg ARGUMENT CANNOT HAVE MORE THAN 2 COLUMN NAMES OF data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! all(categ %in% names(data1))){ # all() without na.rm -> ok because categ cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(categ, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if(length(dot.categ) > 1){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT CANNOT HAVE MORE THAN 1 COLUMN NAMES OF data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! all(dot.categ %in% names(data1))){ # all() without na.rm -> ok because dot.categ cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(dot.categ, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# reserved word checking -if(any(names(data1) %in% reserved.words, na.rm = TRUE)){ -if(any(duplicated(names(data1)), na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nDUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if( ! is.null(dot.categ)){ -if(dot.categ %in% categ){ -reserved.words <- c(reserved.words, paste0(dot.categ, "_DOT")) # paste0(dot.categ, "_DOT") is added to the reserved words because in such situation, a new column will be added to data1 that is named paste0(dot.categ, "_DOT") -} -} -tempo.output <- fun_name_change(names(data1), reserved.words) -for(i2 in 1:length(tempo.output$ini)){ # a loop to be sure to take the good ones -names(data1)[names(data1) == tempo.output$ini[i2]] <- tempo.output$post[i2] -if(any(y == tempo.output$ini[i2])){ # any() without na.rm -> ok because y cannot be NA (tested above) -y[y == tempo.output$ini[i2]] <- tempo.output$post[i2] -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN y ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN y ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# WARNING: names of y argument potentially replaced -if(any(categ == tempo.output$ini[i2])){ # any() without na.rm -> ok because categ cannot be NA (tested above) -categ[categ == tempo.output$ini[i2]] <- tempo.output$post[i2] -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN categ ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN categ ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# WARNING: names of categ argument potentially replaced -if( ! is.null(dot.categ)){ -if(any(dot.categ == tempo.output$ini[i2])){ # any() without na.rm -> ok because dot.categ cannot be NA (tested above) -dot.categ[dot.categ == tempo.output$ini[i2]] <- tempo.output$post[i2] -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN dot.categ ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN dot.categ ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# WARNING: names of dot.categ argument potentially replaced -} -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") REGARDING COLUMN NAMES REPLACEMENT, THE NAMES\n", paste(tempo.output$ini, collapse = " "), "\nHAVE BEEN REPLACED BY\n", paste(tempo.output$post, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -if( ! (is.null(add) | is.null(tempo.output$ini))){ -if(grepl(x = add, pattern = paste(tempo.output$ini, collapse = "|"))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF COLUMN NAMES OF data1 IN THE add ARGUMENT STRING, THAT CORRESPOND TO RESERVED STRINGS FOR ", function.name, "\nCOLUMN NAMES HAVE TO BE CHANGED\nTHE PROBLEMATIC COLUMN NAMES ARE SOME OF THESE NAMES:\n", paste(tempo.output$ini, collapse = " "), "\nIN THE DATA FRAME OF data1 AND IN THE STRING OF add ARGUMENT, TRY TO REPLACE NAMES BY:\n", paste(tempo.output$post, collapse = " "), "\n\nFOR INFORMATION, THE RESERVED WORDS ARE:\n", paste(reserved.words, collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -} -if( ! (is.null(add))){ -if(any(sapply(X = arg.names, FUN = grepl, x = add), na.rm = TRUE)){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NAMES OF ", function.name, " ARGUMENTS DETECTED IN THE add STRING:\n", paste(arg.names[sapply(X = arg.names, FUN = grepl, x = add)], collapse = "\n"), "\nRISK OF WRONG OBJECT USAGE INSIDE ", function.name) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end reserved word checking -# verif of add -if( ! is.null(add)){ -if( ! grepl(pattern = "^\\s*\\+", add)){ # check that the add string start by + -tempo.cat <- paste0("ERROR IN ", function.name, "\nadd ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! grepl(pattern = "(ggplot2|lemon)\\s*::", add)){ # -tempo.cat <- paste0("ERROR IN ", function.name, "\nFOR EASIER FUNCTION DETECTION, add ARGUMENT MUST CONTAIN \"ggplot2::\" OR \"lemon::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! grepl(pattern = ")\\s*$", add)){ # check that the add string finished by ) -tempo.cat <- paste0("ERROR IN ", function.name, "\nadd ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -# end verif of add -# management of add containing facet -facet.categ <- NULL -if( ! is.null(add)){ -facet.check <- TRUE -tempo <- unlist(strsplit(x = add, split = "\\s*\\+\\s*(ggplot2|lemon)\\s*::\\s*")) # -tempo <- sub(x = tempo, pattern = "^facet_wrap", replacement = "ggplot2::facet_wrap") -tempo <- sub(x = tempo, pattern = "^facet_grid", replacement = "ggplot2::facet_grid") -tempo <- sub(x = tempo, pattern = "^facet_rep", replacement = "lemon::facet_rep") -if(any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap"), na.rm = TRUE)){ -tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")]))) -facet.categ <- names(tempo1$params$facets) -tempo.text <- "facet_wrap OR facet_rep_wrap" -facet.check <- FALSE -}else if(grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")){ -tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")]))) -facet.categ <- c(names(tempo1$params$rows), names(tempo1$params$cols)) -tempo.text <- "facet_grid OR facet_rep_grid" -facet.check <- FALSE -} -if(facet.check == FALSE & ! all(facet.categ %in% names(data1))){ # WARNING: all(facet.categ %in% names(data1)) is TRUE when facet.categ is NULL # all() without na.rm -> ok because facet.categ cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF \"", tempo.text, "\" STRING IN THE add ARGUMENT BUT PROBLEM OF VARIABLE DETECTION (COLUMN NAMES OF data1)\nTHE DETECTED VARIABLES ARE:\n", paste(facet.categ, collapse = " "), "\nTHE data1 COLUMN NAMES ARE:\n", paste(names(data1), collapse = " "), "\nPLEASE REWRITE THE add STRING AND RERUN") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -# end management of add containing facet -# conversion of categ columns in data1 into factors -for(i1 in 1:length(categ)){ -tempo1 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\n", paste0("categ NUMBER ", i1, " OF data1"), " MUST BE A FACTOR OR CHARACTER VECTOR") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if(tempo1$problem == FALSE){ # character vector -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN categ NUMBER ", i1, " IN data1, THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR, WITH LEVELS ACCORDING TO THE ALPHABETICAL ORDER") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -data1[, categ[i1]] <- factor(data1[, categ[i1]]) # if already a factor, change nothing, if characters, levels according to alphabetical order -} -# OK: all the categ columns of data1 are factors from here -# end conversion of categ columns in data1 into factors - - - -# management of log scale and Inf removal -if(any(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf # normally no NA with is.finite0() and is.na() -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN THE ", y, " COLUMN OF THE data1 ARGUMENT AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -data1.ini <- data1 # strictly identical to data1 except that in data1 y is log converted if and only if y.log != "no" -if(y.log != "no"){ -tempo1 <- ! is.finite(data1[, y]) # where are initial NA and Inf -data1[, y] <- suppressWarnings(get(y.log)(data1[, y]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -if(any( ! (tempo1 | is.finite(data1[, y])))){ # normally no NA with is.finite -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN THE ", y, " COLUMN OF THE data1 ARGUMENT AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# Inf removal -if(any(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf # normally no NA with is.finite -removed.row.nb <- which(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y]))) -removed.rows <- data1.ini[removed.row.nb, ] # here data1.ini used to have the y = O rows that will be removed because of Inf creation after log transformation -data1 <- data1[-removed.row.nb, ] # -data1.ini <- data1.ini[-removed.row.nb, ] # -}else{ -removed.row.nb <- NULL -removed.rows <- data.frame(stringsAsFactors = FALSE) -} -# From here, data1 and data.ini have no more Inf -# end Inf removal -if(y.log != "no" & ! is.null(y.lim)){ -if(any(y.lim <= 0)){ # any() without na.rm -> ok because y.lim cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if(any( ! is.finite(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}))){ # normally no NA with is.finite -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT RETURNS INF/NA WITH THE y.log ARGUMENT SET TO ", y.log, "\nAS SCALE COMPUTATION IS ", ifelse(y.log == "log10", "log10", "log2"), ":\n", paste(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -if(y.log != "no" & y.include.zero == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") y.log ARGUMENT SET TO ", y.log, " AND y.include.zero ARGUMENT SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -y.include.zero <- FALSE -} -if(y.log != "no" & vertical == FALSE){ -vertical <- TRUE -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") BECAUSE OF A BUG IN ggplot2, CANNOT FLIP BOXES HORIZONTALLY WITH A Y.LOG SCALE -> vertical ARGUMENT RESET TO TRUE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# end management of log scale and Inf removal -# na detection and removal (done now to be sure of the correct length of categ) -column.check <- unique(c(y, categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){dot.categ}, if( ! is.null(facet.categ)){facet.categ})) # dot.categ because can be a 3rd column of data1, categ.color and dot.color will be tested later -if(any(is.na(data1[, column.check]))){ # data1 used here instead of data1.ini in case of new NaN created by log conversion (neg values) # normally no NA with is.na -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -for(i2 in 1:length(column.check)){ -if(any(is.na(data1[, column.check[i2]]))){ # normally no NA with is.na -tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i2], " OF data1") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n", tempo.warn))) -} -} -tempo <- unique(unlist(lapply(lapply(c(data1[column.check]), FUN = is.na), FUN = which))) -removed.row.nb <- c(removed.row.nb, tempo) # removed.row.nb created to remove Inf -removed.rows <- rbind(removed.rows, data1.ini[tempo, ], stringsAsFactors = FALSE) # here data1.ini used to have the non NA rows that will be removed because of NAN creation after log transformation (neg values for instance) -column.check <- column.check[ ! column.check == y] # remove y to keep quali columns -if(length(tempo) != 0){ -data1 <- data1[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former -data1.ini <- data1.ini[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers than the former -for(i3 in 1:length(column.check)){ -if(any( ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]]), na.rm = TRUE)){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i3], " OF data1, THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA/Inf REMOVAL (IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[, column.check[i3]])[ ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]])], collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -} -count.categ <- 0 -for(i2 in 1:length(column.check)){ -if(column.check[i2] %in% categ){ -count.categ <- count.categ + 1 -} -if(column.check[i2] == categ[count.categ]){ -categ.class.order[count.categ] <- list(levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])]) # remove the absent color in the character vector -data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(categ.class.order[[count.categ]])) -} -if( ! is.null(dot.color) & ! is.null(dot.categ)){ # reminder : dot.categ cannot be a column name of categ anymore (because in that case dot.categ name is changed into "..._DOT" -if(column.check[i2] == dot.categ){ -dot.categ.class.order <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector -data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(dot.categ.class.order)) -} -} -if(column.check[i2] %in% facet.categ){ # works if facet.categ == NULL this method should keep the order of levels when removing some levels -tempo.levels <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(as.character(data1[, column.check[i2]]))] -data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = tempo.levels) -} -} -} -# end na detection and removal (done now to be sure of the correct length of categ) -# From here, data1 and data.ini have no more NA or NaN in y, categ, dot.categ (if dot.color != NULL) and facet.categ - - - -if( ! is.null(categ.class.order)){ -if(length(categ.class.order) != length(categ)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.class.order ARGUMENT MUST BE A LIST OF LENGTH EQUAL TO LENGTH OF categ\nHERE IT IS LENGTH: ", length(categ.class.order), " VERSUS ", length(categ)) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -for(i3 in 1:length(categ.class.order)){ -if(is.null(categ.class.order[[i3]])){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE categ.class.order COMPARTMENT ", i3, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -data1[, categ[i3]] <- factor(as.character(data1[, categ[i3]])) # if already a factor, change nothing, if characters, levels according to alphabetical order -categ.class.order[[i3]] <- levels(data1[, categ[i3]]) # character vector that will be used later -}else{ -tempo <- fun_check(data = categ.class.order[[i3]], data.name = paste0("COMPARTMENT ", i3 , " OF categ.class.order ARGUMENT"), class = "vector", mode = "character", length = length(levels(data1[, categ[i3]])), fun.name = function.name) # length(data1[, categ[i1]) -> if data1[, categ[i1] was initially character vector, then conversion as factor after the NA removal, thus class number ok. If data1[, categ[i1] was initially factor, no modification after the NA removal, thus class number ok -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -if(any(duplicated(categ.class.order[[i3]]), na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i3, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i3]], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! (all(categ.class.order[[i3]] %in% unique(data1[, categ[i3]]), na.rm = TRUE) & all(unique(data1[, categ[i3]]) %in% categ.class.order[[i3]], na.rm = TRUE))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i3, " OF categ.class.order ARGUMENT MUST BE CLASSES OF ELEMENT ", i3, " OF categ ARGUMENT\nHERE IT IS:\n", paste(categ.class.order[[i3]], collapse = " "), "\nFOR COMPARTMENT ", i3, " OF categ.class.order AND IT IS:\n", paste(unique(data1[, categ[i3]]), collapse = " "), "\nFOR COLUMN ", categ[i3], " OF data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -data1[, categ[i3]] <- factor(data1[, categ[i3]], levels = categ.class.order[[i3]]) # reorder the factor - -} -names(categ.class.order)[i3] <- categ[i3] -} -} -}else{ -categ.class.order <- vector("list", length = length(categ)) -tempo.categ.class.order <- NULL -for(i2 in 1:length(categ.class.order)){ -categ.class.order[[i2]] <- levels(data1[, categ[i2]]) -names(categ.class.order)[i2] <- categ[i2] -tempo.categ.class.order <- c(tempo.categ.class.order, ifelse(i2 != 1, "\n", ""), categ.class.order[[i2]]) -} -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR BOX ORDERING:\n", paste(tempo.categ.class.order, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# categ.class.order not NULL anymore (list) -if(is.null(box.legend.name) & box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE box.legend.name SETTING IS NULL. NAMES OF categ WILL BE USED: ", paste(categ, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -box.legend.name <- categ[length(categ)] # if only categ1, then legend name of categ1, if length(categ) == 2L, then legend name of categ2 -} -# box.legend.name not NULL anymore (character string) -# management of categ.color -if( ! is.null(categ.color)){ -# check the nature of color -# integer colors into gg_palette -tempo.check.color <- fun_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem -if(tempo.check.color == FALSE){ -# convert integers into colors -categ.color <- fun_gg_palette(max(categ.color, na.rm = TRUE))[categ.color] -} -# end integer colors into gg_palette -if( ! (all(categ.color %in% colors() | grepl(pattern = "^#", categ.color)))){ # check that all strings of low.color start by #, # all() without na.rm -> ok because categ.color cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(categ.color), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if(any(is.na(categ.color)) & box.alpha != 0){ # normally no NA with is.na -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT CONTAINS NA") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# end check the nature of color -# check the length of color -categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 -if(length(data1[, categ[categ.len]]) == length(levels(data1[, categ[categ.len]])) & length(categ.color) == length(data1[, categ[categ.len]])){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE NUMBER OF CLASSES OF THE COLUMN ", categ[categ.len], " THE NUMBER OF ROWS OF THIS COLUMN AND THE NUMBER OF COLORS OF THE categ.color ARGUMENT ARE ALL EQUAL. BOX COLORS WILL BE ATTRIBUTED ACCORDING THE LEVELS OF ", categ[categ.len], ", NOT ACCORDING TO THE ROWS OF ", categ[categ.len]) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -if(length(categ.color) == length(levels(data1[, categ[categ.len]]))){ # here length(categ.color) is equal to the different number of categ -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -data1 <- data.frame(data1, categ.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) # no need stringsAsFactors here for stat.nolog as factors remain factors -data1$categ.color <- factor(data1$categ.color, labels = categ.color) # replace the characters of data1[, categ[categ.len]] put in the categ.color column by the categ.color (can be write like this because categ.color is length of levels of data1[, categ[categ.len]]) -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", categ[categ.len], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(categ.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else if(length(categ.color) == length(data1[, categ[categ.len]])){# here length(categ.color) is equal to nrow(data1) -> Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[categ.len]]))) -data1 <- data.frame(data1, categ.color = categ.color, stringsAsFactors = TRUE) -tempo.check <- unique(data1[ , c(categ[categ.len], "categ.color")]) -if( ! (nrow(tempo.check) == length(unique(categ.color)) & nrow(tempo.check) == length(unique(data1[ , categ[categ.len]])))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF categ ", categ[categ.len], ":\n", paste(unique(mapply(FUN = "paste", data1[ ,categ[categ.len]], data1[ ,"categ.color"])), collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -categ.color <- unique(data1$categ.color[order(data1[, categ[categ.len]])]) # Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[categ.len]]))) -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ ", categ[categ.len], " AS:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\n", paste(categ.color, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -}else if(length(categ.color) == 1L){ -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -data1 <- data.frame(data1, categ.color = categ.color, stringsAsFactors = TRUE) -categ.color <- rep(categ.color, length(levels(data1[, categ[categ.len]]))) -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[categ.len], "\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(categ.color, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS AFTER NA/Inf REMOVAL, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[categ.len], " COLUMN. HERE IT IS COLOR LENGTH ", length(categ.color), " VERSUS CATEG LENGTH ", length(data1[, categ[categ.len]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[categ.len]])), "\nPRESENCE OF NA/Inf COULD BE THE PROBLEM") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -}else{ -categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -categ.color <- fun_gg_palette(length(levels(data1[, categ[categ.len]]))) -data1 <- data.frame(data1, categ.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) -data1$categ.color <- factor(data1$categ.color, labels = categ.color) # replace the characters of data1[, categ[categ.len]] put in the categ.color column by the categ.color (can be write like this because categ.color is length of levels of data1[, categ[categ.len]]) -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL categ.color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", categ[categ.len], " IN data1:\n", paste(categ.color, collapse = " "), "\n", paste(levels(data1[, categ[categ.len]]), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# categ.color not NULL anymore -categ.color <- as.character(categ.color) -# categ.color is a character string representing the diff classes -data1$categ.color <- factor(data1$categ.color, levels = unique(categ.color)) # ok because if categ.color is a character string, the order make class 1, class 2, etc. unique() because no duplicates allowed -# data1$categ.color is a factor with order of levels -> categ.color -# end management of categ.color -# management of dot.color -if( ! is.null(dot.color)){ -# optional legend of dot colors -if( ! is.null(dot.categ)){ -ini.dot.categ <- dot.categ -if( ! dot.categ %in% names(data1)){ # no need to use all() because length(dot.categ) = 1 -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT MUST BE A COLUMN NAME OF data1. HERE IT IS:\n", dot.categ) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if(dot.categ %in% categ){ # no need to use all() because length(dot.categ) = 1. Do not use dot.categ %in% categ[length(categ)] -> error -# management of dot legend if dot.categ %in% categ (because legends with the same name are joined in ggplot2) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE COLUMN NAME OF data1 INDICATED IN THE dot.categ ARGUMENT (", dot.categ, ") HAS BEEN REPLACED BY ", paste0(dot.categ, "_DOT"), " TO AVOID MERGED LEGEND BY GGPLOT2") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -data1 <- data.frame(data1, dot.categ = data1[, dot.categ], stringsAsFactors = TRUE) # dot.categ is not a column name of data1 (checked above with reserved words) -dot.categ <- paste0(dot.categ, "_DOT") -names(data1)[names(data1) == "dot.categ"] <- dot.categ # paste0(dot.categ, "_DOT") is not a column name of data1 (checked above with reserved words) -# tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT CANNOT BE A COLUMN NAME OF data1 ALREADY SPECIFIED IN THE categ ARGUMENT:\n", dot.categ, "\nINDEED, dot.categ ARGUMENT IS MADE TO HAVE MULTIPLE DOT COLORS NOT RELATED TO THE BOXPLOT CATEGORIES") -# stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -tempo1 <- fun_check(data = data1[, dot.categ], data.name = paste0(dot.categ, " COLUMN OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = data1[, dot.categ], data.name = paste0(dot.categ, " COLUMN OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ COLUMN MUST BE A FACTOR OR CHARACTER VECTOR") # -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -data1[, dot.categ] <- factor(data1[, dot.categ]) # if already a factor, change nothing, if characters, levels according to alphabetical order -# dot.categ column of data1 is factor from here -if( ! is.null(dot.categ.class.order)){ -if(any(duplicated(dot.categ.class.order), na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(dot.categ.class.order, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! (all(dot.categ.class.order %in% levels(data1[, dot.categ])) & all(levels(data1[, dot.categ]) %in% dot.categ.class.order, na.rm = TRUE))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ.class.order ARGUMENT MUST BE CLASSES OF dot.categ ARGUMENT\nHERE IT IS:\n", paste(dot.categ.class.order, collapse = " "), "\nFOR dot.categ.class.order AND IT IS:\n", paste(levels(data1[, dot.categ]), collapse = " "), "\nFOR dot.categ COLUMN (", ini.dot.categ, ") OF data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor -} -}else{ -if(all(dot.color == "same") & length(dot.color)== 1L){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) -dot.categ.class.order <- unlist(categ.class.order[length(categ)]) -data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order SETTING IS NULL AND dot.color IS \"same\". ORDER OF categ.class.order WILL BE APPLIED FOR LEGEND DISPLAY: ", paste(dot.categ.class.order, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else{ -dot.categ.class.order <- sort(levels(data1[, dot.categ])) -data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR LEGEND DISPLAY: ", paste(dot.categ.class.order, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# dot.categ.class.order not NULL anymore (character string) if dot.categ is not NULL -if(all(dot.color == "same") & length(dot.color)== 1L){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) -if( ! identical(ini.dot.categ, categ[length(categ)])){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN dot.color ARGUMENT IS \"same\", THE COLUMN NAME IN dot.categ ARGUMENT MUST BE IDENTICAL TO THE LAST COLUMN NAME IN categ ARGUMENT. HERE IT IS:\ndot.categ: ", paste(ini.dot.categ, collapse = " "), "\ncateg: ", paste(categ, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! fun_comp_1d(unlist(categ.class.order[length(categ)]), dot.categ.class.order)$identical.content){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN dot.color ARGUMENT IS \"same\",\nLAST COMPARTMENT OF categ.class.order ARGUMENT AND dot.categ.class.order ARGUMENT CANNOT BE DIFFERENT:\nLAST COMPARTMENT OF categ.class.order: ", paste(unlist(categ.class.order[length(categ)]), collapse = " "), "\ndot.categ.class.order: ", paste(dot.categ.class.order, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -for(i3 in 1:length(categ)){ -if(identical(categ[i3], ini.dot.categ) & ! identical(unlist(categ.class.order[i3]), dot.categ.class.order) & identical(sort(unlist(categ.class.order[i3])), sort(dot.categ.class.order))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE dot.categ ARGUMENT SETTING IS PRESENT IN THE categ ARGUMENT SETTING, BUT ORDER OF THE CLASSES IS NOT THE SAME:\ncateg.class.order: ", paste(unlist(categ.class.order[i3]), collapse = " "), "\ndot.categ.class.order: ", paste(dot.categ.class.order, collapse = " "), "\nNOTE THAT ORDER OF categ.class.order IS THE ONE USED FOR THE AXIS REPRESENTATION") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(is.null(dot.legend.name)){ -dot.legend.name <- if(ini.dot.categ %in% categ[length(categ)]){dot.categ}else{ini.dot.categ} # -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE dot.legend.name SETTING IS NULL -> ", dot.legend.name, " WILL BE USED AS LEGEND TITLE OF DOTS") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# dot.legend.name not NULL anymore (character string) -}else{ -if( ! is.null(dot.categ.class.order)){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order ARGUMENT IS NOT NULL, BUT IS THE dot.categ ARGUMENT\n-> dot.categ.class.order NOT CONSIDERED AS NO LEGEND WILL BE DRAWN") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# But dot.categ.class.order will be converted to NULL below (not now) -} -# end optional legend of dot colors -# check the nature of color -# integer colors into gg_palette -tempo.check.color <- fun_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem -if(tempo.check.color == FALSE){ -# convert integers into colors -dot.color <- fun_gg_palette(max(dot.color, na.rm = TRUE))[dot.color] -} -# end integer colors into gg_palette -if(all(dot.color == "same") & length(dot.color)== 1L){# all() without na.rm -> ok because dot.color cannot be NA (tested above) -dot.color <- categ.color # same color of the dots as the corresponding box color -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT HAS BEEN SET TO \"same\"\nTHUS, DOTS WILL HAVE THE SAME COLORS AS THE CORRESPONDING BOXPLOT") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else if( ! (all(dot.color %in% colors() | grepl(pattern = "^#", dot.color)))){ # check that all strings of low.color start by #, # all() without na.rm -> ok because dot.color cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR VECTOR STARTING BY #, OR (2) COLOR NAMES GIVEN BY colors(), OR (3) INTEGERS, OR THE STRING \"same\"\nHERE IT IS: ", paste(unique(dot.color), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if(any(is.na(dot.color))){ # normally no NA with is.finite -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT CONTAINS NA") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# end check the nature of color -# check the length of color -if( ! is.null(dot.categ)){ -# optional legend of dot colors -if(length(data1[, dot.categ]) == length(levels(data1[, dot.categ])) & length(dot.color) == length(data1[, dot.categ])){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE NUMBER OF CLASSES OF THE COLUMN ", dot.categ, " THE NUMBER OF ROWS OF THIS COLUMN AND THE NUMBER OF COLORS OF THE dot.color ARGUMENT ARE ALL EQUAL. DOT COLORS WILL BE ATTRIBUTED ACCORDING THE LEVELS OF ", dot.categ, ", NOT ACCORDING TO THE ROWS OF ", dot.categ) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -if(length(dot.color) > 1 & ! (length(dot.color) == length(unique(data1[, dot.categ])) | length(dot.color) == length(data1[, dot.categ]))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN LENGTH OF THE dot.color ARGUMENT IS MORE THAN 1, IT MUST BE EQUAL TO THE NUMBER OF 1) ROWS OR 2) LEVELS OF dot.categ COLUMN (", dot.categ, "):\ndot.color: ", paste(dot.color, collapse = " "), "\ndot.categ LEVELS: ", paste(levels(data1[, dot.categ]), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if(length(dot.color) > 1 & length(dot.color) == length(unique(data1[, dot.categ]))){ -data1 <- data.frame(data1, dot.color = data1[, dot.categ], stringsAsFactors = TRUE) -data1$dot.color <- factor(data1$dot.color, labels = dot.color) # do not use labels = unique(dot.color). Otherwise, we can have green1 green2 when dot.color is c("green", "green") -}else if(length(dot.color) > 1 & length(dot.color) == length(data1[, dot.categ])){ -data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) -}else if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color -data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) -} -dot.color <- as.character(unique(data1$dot.color[order(data1[, dot.categ])])) # reorder the dot.color character vector -if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color -dot.color <- rep(dot.color, length(dot.categ.class.order)) -} -tempo.check <- unique(data1[ , c(dot.categ, "dot.color")]) -if(length(unique(data1[ , "dot.color"])) > 1 & ( ! (nrow(tempo.check) == length(unique(data1[ , "dot.color"])) & nrow(tempo.check) == length(unique(data1[ , dot.categ]))))){ # length(unique(data1[ , "dot.color"])) > 1 because if only one color, can be attributed to each class of dot.categ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF dot.categ (", dot.categ, ") COLUMN:\n", paste(unique(mapply(FUN = "paste", data1[ , dot.categ], data1[ ,"dot.color"])), collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN dot.categ ARGUMENT (", ini.dot.categ, "), THE FOLLOWING COLORS OF DOTS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(data1[, dot.categ]), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# dot.color is a character string representing the diff classes of dot.categ -# data1$dot.color is a factor with order of levels -> dot.categ -# end optional legend of dot colors -}else{ -categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 -if(length(dot.color) == length(levels(data1[, categ[categ.len]]))){ # here length(dot.color) is equal to the different number of categ -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -data1 <- data.frame(data1, dot.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) -data1$dot.color <- factor(data1$dot.color, labels = dot.color) -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", categ[categ.len], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else if(length(dot.color) == length(data1[, categ[categ.len]])){# here length(dot.color) is equal to nrow(data1) -> Modif to have length(dot.color) equal to the different number of categ (length(dot.color) == length(levels(data1[, categ[categ.len]]))) -data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) -}else if(length(dot.color)== 1L & ! all(dot.color == "same")){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) -dot.color <- rep(dot.color, length(levels(data1[, categ[categ.len]]))) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[categ.len], "\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(dot.color, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS AFTER NA/Inf REMOVAL, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[categ.len], " COLUMN. HERE IT IS COLOR LENGTH ", length(dot.color), " VERSUS CATEG LENGTH ", length(data1[, categ[categ.len]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[categ.len]])), "\nPRESENCE OF NA/Inf COULD BE THE PROBLEM") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end check the length of color -dot.color <- as.character(dot.color) -# dot.color is a character string representing the diff classes -data1$dot.color <- factor(data1$dot.color, levels = unique(dot.color)) # ok because if dot.color is a character string, the order make class 1, class 2, etc. If dot.color is a column of data1, then levels will be created, without incidence, except if dot.categ specified (see below). unique() because no duplicates allowed -# data1$dot.color is a factor with order of levels -> dot.color -} -# end optional legend of dot colors -}else if(is.null(dot.color) & ! (is.null(dot.categ) & is.null(dot.categ.class.order) & is.null(dot.legend.name))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") dot.categ OR dot.categ.class.order OR dot.legend.name ARGUMENT HAS BEEN SPECIFIED BUT dot.color ARGUMENT IS NULL (NO DOT PLOTTED)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# dot.color either NULL (no dot plotted) or character string (potentially representing the diff classes of dot.categ) -# data1$dot.color is either NA or a factor (with order of levels -> depending on dot.categ or categ[length(categ)], or other -if(is.null(dot.categ)){ -dot.categ.class.order <- NULL # because not used anyway -} -# dot.categ.class.order either NULL if dot.categ is NULL (no legend displayed) or character string (potentially representing the diff classes of dot.categ) -# end management of dot.color -if(is.null(dot.color) & box.fill == FALSE & dot.alpha <= 0.025){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE FOLLOWING ARGUMENTS WERE SET AS:\ndot.color = NULL (NOT ALL DOTS BUT ONLY POTENTIAL OUTLIER DOTS DISPLAYED)\nbox.fill = FALSE (NO FILLING COLOR FOR BOTH BOXES AND POTENTIAL OUTLIER DOTS)\ndot.alpha = ", fun_round(dot.alpha, 4), "\n-> POTENTIAL OUTLIER DOTS MIGHT NOT BE VISIBLE BECAUSE ALMOST TRANSPARENT") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -if(is.null(dot.color) & box.fill == FALSE & dot.border.size == 0){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE FOLLOWING ARGUMENTS WERE SET AS:\ndot.color = NULL (NOT ALL DOTS BUT ONLY POTENTIAL OUTLIER DOTS DISPLAYED)\nbox.fill = FALSE (NO FILLING COLOR FOR BOTH BOXES AND POTENTIAL OUTLIER DOTS)\ndot.border.size = 0 (NO BORDER FOR POTENTIAL OUTLIER DOTS)\n-> THESE SETTINGS ARE NOT ALLOWED BECAUSE THE POTENTIAL OUTLIER DOTS WILL NOT BE VISIBLE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# integer dot.border.color into gg_palette -if( ! is.null(dot.border.color)){ -tempo <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) -if(tempo$problem == FALSE){ # convert integers into colors -dot.border.color <- fun_gg_palette(max(dot.border.color, na.rm = TRUE))[dot.border.color] -} -} -# end integer dot.border.color into gg_palette -# na detection and removal (done now to be sure of the correct length of categ) -column.check <- c("categ.color", if( ! is.null(dot.color)){"dot.color"}) # -if(any(is.na(data1[, column.check]))){ # data1 used here instead of data1.ini in case of new NaN created by log conversion (neg values) # normally no NA with is.na -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS ", paste(column.check, collapse = " "), " OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -for(i2 in 1:length(column.check)){ -if(any(is.na(data1[, column.check[i2]]))){ # normally no NA with is.na -tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i2], " OF data1") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n", tempo.warn))) -} -} -tempo <- unique(unlist(lapply(lapply(c(data1[column.check]), FUN = is.na), FUN = which))) -removed.row.nb <- c(removed.row.nb, tempo) -removed.rows <- rbind(removed.rows, data1[tempo, ], stringsAsFactors = FALSE) # here data1 used because categorical columns tested -if(length(tempo) != 0){ -data1 <- data1[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former -data1.ini <- data1.ini[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former -for(i3 in 1:length(column.check)){ -if(any( ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]]), na.rm = TRUE)){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i3], " OF data1, THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA/Inf REMOVAL (IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[, column.check[i3]])[ ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]])], collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -} -for(i2 in 1:length(column.check)){ -if(column.check[i2] == "categ.color"){ -categ.color <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector -if(length(categ.color)== 1L & length(unlist(categ.class.order[length(categ)])) > 1){ # to deal with single color -categ.color <- rep(categ.color, length(unlist(categ.class.order[length(categ)]))) -} -data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(categ.color)) -} -if(column.check[i2] == "dot.color"){ -dot.color <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector -if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color. If dot.categ.class.order == NULL (which is systematically the case if dot.categ == NULL), no rep(dot.color, length(dot.categ.class.order) -dot.color <- rep(dot.color, length(dot.categ.class.order)) -} -data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(dot.color)) -} -} -} -# end na detection and removal (done now to be sure of the correct length of categ) -# From here, data1 and data.ini have no more NA or NaN -# end other checkings -# reserved word checking -#already done above -# end reserved word checking -# end second round of checking and data preparation - - -# package checking -fun_pack(req.package = c( -"ggplot2", -"gridExtra", -"lemon", -"scales" -), lib.path = lib.path) -# end package checking - - - - - -# main code -# y coordinates recovery (create ini.box.coord, dot.coord and modify data1) -if(length(categ)== 1L){ -# width commputations -box.width2 <- box.width -box.space <- 0 # to inactivate the shrink that add space between grouped boxes, because no grouped boxes here -# end width commputations -# data1 check categ order for dots coordinates recovery -data1 <- data.frame(data1, categ.check = data1[, categ[1]], stringsAsFactors = TRUE) -data1$categ.check <- as.integer(data1$categ.check) # to check that data1[, categ[1]] and dot.coord$group are similar, during merging -# end data1 check categ order for dots coordinates recovery -# per box dots coordinates recovery -tempo.gg.name <- "gg.indiv.plot." -tempo.gg.count <- 0 -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[1]), stroke = dot.border.size, size = dot.size, alpha = dot.alpha, shape = 21)) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(is.null(categ.color)){rep(NA, length(unique(data1[, categ[1]])))}else if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[1]])))}else{categ.color})) # categ.color used for dot colors because at that stage, we do not care about colors -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[1]), coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf})) # fill because this is what is used with geom_box # to easily have the equivalent of the grouped boxes -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[1]])))}else{categ.color})) -# end per box dots coordinates recovery -}else if(length(categ) == 2L){ -# width commputations -box.width2 <- box.width / length(unique(data1[, categ[length(categ)]])) # real width of each box in x-axis unit, among the set of grouped box. Not relevant if no grouped boxes length(categ)== 1L -# end width commputations -# data1 check categ order for dots coordinates recovery -tempo.factor <- paste0(data1[order(data1[, categ[2]], data1[, categ[1]]), categ[2]], "_", data1[order(data1[, categ[2]], data1[, categ[1]]), categ[1]]) -data1 <- data.frame(data1[order(data1[, categ[2]], data1[, categ[1]]), ], categ.check = factor(tempo.factor, levels = unique(tempo.factor)), stringsAsFactors = TRUE) -data1$categ.check <- as.integer(data1$categ.check) -# end data1 check categ order for dots coordinates recovery -# per box dots coordinates recovery -tempo.gg.name <- "gg.indiv.plot." -tempo.gg.count <- 0 -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[2]), stroke = dot.border.size, size = dot.size, alpha = dot.alpha, shape = 21)) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(is.null(categ.color)){rep(NA, length(unique(data1[, categ[2]])))}else if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[2]])))}else{categ.color})) # categ.color used for dot colors because at that stage, we do not care about colors -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[2]), coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf})) # fill because this is what is used with geom_box # to easily have the equivalent of the grouped boxes -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[2]])))}else{categ.color})) -# end per box dots coordinates recovery -}else{ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if( ! is.null(stat.pos)){ -stat.just <- fun_gg_just( -angle = stat.angle, -pos = ifelse( -vertical == TRUE, -ifelse(stat.pos == "top", "bottom", "top"), # "bottom" because we want justification for text that are below the ref point which is the top of the graph. The opposite for "above" -ifelse(stat.pos == "top", "left", "right") # "left" because we want justification for text that are on the left of the ref point which is the right border of the graph. The opposite for "above" -), -kind = "text" -) -} -# has in fact no interest because ggplot2 does not create room for geom_text() -tempo.data.max <- data1[which.max(data1[, y]), ] -tempo.data.max <- data.frame(tempo.data.max, label = formatC(tempo.data.max[, y], digit = 2, drop0trailing = TRUE, format = "f"), stringsAsFactors = TRUE) -# end has in fact no interest because ggplot2 does not create room for geom_text() -tempo.graph.info.ini <- ggplot2::ggplot_build(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if( ! is.null(stat.pos)){' + ggplot2::geom_text(data = tempo.data.max, mapping = ggplot2::aes_string(x = 1, y = y, label = "label"), size = stat.size, color = "black", angle = stat.angle, hjust = stat.just$hjust, vjust = stat.just$vjust)'})))) # added here to have room for annotation -dot.coord <- tempo.graph.info.ini$data[[1]] -dot.coord$x <- as.numeric(dot.coord$x) # because weird class -dot.coord$PANEL <- as.numeric(dot.coord$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? -tempo.mean <- aggregate(x = dot.coord$y, by = list(dot.coord$group, dot.coord$PANEL), FUN = mean, na.rm = TRUE) -names(tempo.mean)[names(tempo.mean) == "x"] <- "MEAN" -names(tempo.mean)[names(tempo.mean) == "Group.1"] <- "BOX" -names(tempo.mean)[names(tempo.mean) == "Group.2"] <- "PANEL" -dot.coord <- data.frame( -dot.coord[order(dot.coord$group, dot.coord$y), ], # dot.coord$PANEL deals below -y.check = as.double(data1[order(data1$categ.check, data1[, y]), y]), -categ.check = data1[order(data1$categ.check, data1[, y]), "categ.check"], -dot.color = if(is.null(dot.color)){NA}else{data1[order(data1$categ.check, data1[, y]), "dot.color"]}, -data1[order(data1$categ.check, data1[, y]), ][categ], # avoid the renaming below -stringsAsFactors = TRUE -) # y.check to be sure that the order is the same between the y of data1 and the y of dot.coord -# names(dot.coord)[names(dot.coord) == "tempo.categ1"] <- categ[1] -if( ! is.null(dot.categ)){ -dot.coord <- data.frame(dot.coord, data1[order(data1$categ.check, data1[, y]), ][dot.categ], stringsAsFactors = TRUE) # avoid the renaming -} -if( ! is.null(facet.categ)){ -dot.coord <- data.frame(dot.coord, data1[order(data1$categ.check, data1[, y]), ][facet.categ], stringsAsFactors = TRUE) # for facet panels -tempo.test <- NULL -for(i2 in 1:length(facet.categ)){ -tempo.test <- paste0(tempo.test, ".", formatC(as.numeric(dot.coord[, facet.categ[i2]]), width = nchar(max(as.numeric(dot.coord[, facet.categ[i2]]), na.rm = TRUE)), flag = "0")) # convert factor into numeric with leading zero for proper ranking # merge the formatC() to create a new factor. The convertion to integer should recreate the correct group number. Here as.numeric is used and not as.integer in case of numeric in facet.categ (because comes from add and not checked by fun_check, contrary to categ) -} -tempo.test <- as.integer(factor(tempo.test)) -if( ! identical(as.integer(dot.coord$PANEL), tempo.test)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nas.integer(dot.coord$PANEL) AND tempo.test MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -if(dot.tidy == TRUE){ -if( ! is.null(dot.categ)){ -dot.coord <- data.frame(dot.coord, tidy_group = data1[order(data1$categ.check, data1[, y]), ][, dot.categ], stringsAsFactors = TRUE) # avoid the renaming -# tidy_group_coord is to be able to fuse table when creating the table for dot coordinates -if(dot.categ %in% categ){ -dot.coord <- data.frame(dot.coord, tidy_group_coord = dot.coord$group, stringsAsFactors = TRUE) -}else{ -dot.coord <- data.frame(dot.coord, tidy_group_coord = as.integer(factor(paste0( -formatC(as.integer(dot.coord[, categ[1]]), width = nchar(max(as.integer(dot.coord[, categ[1]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking -".", -if(length(categ) == 2L){formatC(as.integer(dot.coord[, categ[2]]), width = nchar(max(as.integer(dot.coord[, categ[2]]), na.rm = TRUE)), flag = "0")}, # convert factor into numeric with leading zero for proper ranking -if(length(categ) == 2L){"."}, -formatC(as.integer(dot.coord[, dot.categ]), width = nchar(max(as.integer(dot.coord[, dot.categ]), na.rm = TRUE)), flag = "0") # convert factor into numeric with leading zero for proper ranking -)), stringsAsFactors = TRUE) # merge the 2 or 3 formatC() to create a new factor. The convertion to integer should recreate the correct group number -) # for tidy dot plots -} -}else{ -dot.coord <- data.frame(dot.coord, tidy_group = if(length(categ)== 1L){ -dot.coord[, categ]}else{as.integer(factor(paste0( -formatC(as.integer(dot.coord[, categ[1]]), width = nchar(max(as.integer(dot.coord[, categ[1]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking -".", -formatC(as.integer(dot.coord[, categ[2]]), width = nchar(max(as.integer(dot.coord[, categ[2]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking -)), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number -}) # for tidy dot plots -# tidy_group_coord is to be able to fuse table when creating the table for dot coordinates -dot.coord <- data.frame(dot.coord, tidy_group_coord = dot.coord$group, stringsAsFactors = TRUE) -} -} -if( ! (identical(dot.coord$y, dot.coord$y.check) & identical(dot.coord$group, dot.coord$categ.check))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\n(dot.coord$y AND dot.coord$y.check) AS WELL AS (dot.coord$group AND dot.coord$categ.check) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -if( ! identical(tempo.mean[order(tempo.mean$BOX, tempo.mean$PANEL), ]$BOX, unique(dot.coord[order(dot.coord$group, dot.coord$PANEL), c("group", "PANEL")])$group)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\n(tempo.mean$BOX, tempo.mean$PANEL) AND (dot.coord$group, dot.coord$PANEL) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -tempo <- unique(dot.coord[order(dot.coord$group, dot.coord$PANEL), c(categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){if(dot.categ != ini.dot.categ){dot.categ}}, if( ! is.null(facet.categ)){facet.categ}), drop = FALSE]) -# names(tempo) <- paste0(names(tempo), ".mean") -tempo.mean <- data.frame(tempo.mean[order(tempo.mean$BOX, tempo.mean$PANEL), ], tempo, stringsAsFactors = TRUE) -} -} -# at that stage, categ color and dot color are correctly attributed in data1, box.coord and dot.coord -# end y dot coordinates recovery (create ini.box.coord, dot.coord and modify data1) -# ylim range -if(is.null(y.lim)){ -y.lim <- tempo.graph.info.ini$layout$panel_params[[1]]$y.range # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only -if(any(( ! is.finite(y.lim)) | is.na(y.lim)) | length(y.lim) != 2){ # kept but normally no more Inf in data1 # normally no NA with is.finite, etc. -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\ntempo.graph.info.ini$layout$panel_params[[1]]$y.range[1] CONTAINS NA OR Inf OR HAS LENGTH 1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -}else if(y.log != "no"){ -y.lim <- get(y.log)(y.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -} -if(y.log != "no"){ -# normally this control is not necessary anymore -if(any( ! is.finite(y.lim))){ # normally no NA with is.finite -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -if(suppressWarnings(all(y.lim %in% c(Inf, -Inf)))){ # all() without na.rm -> ok because y.lim cannot be NA (tested above) -# normally this control is not necessary anymore -tempo.cat <- paste0("ERROR IN ", function.name, " y.lim CONTAINS Inf VALUES, MAYBE BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY OR BECAUSE OF LOG SCALE REQUIREMENT") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if(suppressWarnings(any(is.na(y.lim)))){ # normally no NA with is.na -# normally this control is not necessary anymore -tempo.cat <- paste0("ERROR IN ", function.name, " y.lim CONTAINS NA OR NaN VALUES, MAYBE BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY OR BECAUSE OF LOG SCALE REQUIREMENT") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -y.lim.order <- order(y.lim) # to deal with inverse axis -y.lim <- sort(y.lim) -y.lim[1] <- y.lim[1] - abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(y.lim.order) > 0 medians not inversed axis -y.lim[2] <- y.lim[2] + abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(y.lim.order) > 0 medians not inversed axis -if(y.include.zero == TRUE){ # no need to check y.log != "no" because done before -y.lim <- range(c(y.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only -} -y.lim <- y.lim[y.lim.order] -if(any(is.na(y.lim))){ # normally no NA with is.na -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 2") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end ylim range - - - - - - -# drawing -# constant part -tempo.gg.name <- "gg.indiv.plot." -tempo.gg.count <- 0 -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add is directly put here to deal with additional variable of data, like when using facet_grid. No problem if add is a theme, will be dealt below -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(x.lab)){categ[1]}else{x.lab})) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(y.lab)){y}else{y.lab})) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) -# text angle management -axis.just <- fun_gg_just(angle = x.angle, pos = ifelse(vertical == TRUE, "bottom", "left"), kind = "axis") -# end text angle management -add.check <- TRUE -if( ! is.null(add)){ # if add is NULL, then = 0 -if(grepl(pattern = "ggplot2\\s*::\\s*theme", add) == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT\n-> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER\n-> article ARGUMENT WILL BE IGNORED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -add.check <- FALSE -} -} -if(add.check == TRUE & article == TRUE){ -# WARNING: not possible to add theme()several times. NO message but the last one overwrites the others -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) -if(grid == TRUE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -line = ggplot2::element_line(size = 0.5), -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis -axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis -panel.grid.major.x = if(vertical == TRUE){NULL}else{ggplot2::element_line(colour = "grey85", size = 0.75)}, -panel.grid.major.y = if(vertical == TRUE){ggplot2::element_line(colour = "grey85", size = 0.75)}else{NULL}, -panel.grid.minor.y = if(vertical == TRUE){ggplot2::element_line(colour = "grey90", size = 0.25)}else{NULL}, -axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, -axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}, -strip.background = ggplot2::element_rect(fill = NA, colour = NA) # for facet background -)) -}else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -line = ggplot2::element_line(size = 0.5), -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -axis.line.y.left = ggplot2::element_line(colour = "black"), -axis.line.x.bottom = ggplot2::element_line(colour = "black"), -axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, -axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}, -strip.background = ggplot2::element_rect(fill = NA, colour = NA) -)) -} -}else if(add.check == TRUE & article == FALSE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -line = ggplot2::element_line(size = 0.5), -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -panel.background = ggplot2::element_rect(fill = "grey95"), -axis.line.y.left = ggplot2::element_line(colour = "black"), -axis.line.x.bottom = ggplot2::element_line(colour = "black"), -panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.minor.x = ggplot2::element_blank(), -panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), -strip.background = ggplot2::element_rect(fill = NA, colour = NA), -axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, -axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)} -)) -} -# Contrary to fun_gg_bar(), cannot plot the boxplot right now, because I need the dots plotted first -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, group = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), color = NA, width = box.width, fill = NA)) # this is to set the graph (i.e., a blanck boxplot to be able to use x coordinates to plot dots before boxes) -# end constant part - - - - -# graphic info recovery (including means) -tempo.graph.info <- ggplot2::ggplot_build(eval(parse(text = paste0(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, notch = box.notch, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}) + ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color})')))) # will be recovered later again, when ylim will be considered -tempo.yx.ratio <- (tempo.graph.info$layout$panel_params[[1]]$y.range[2] - tempo.graph.info$layout$panel_params[[1]]$y.range[1]) / (tempo.graph.info$layout$panel_params[[1]]$x.range[2] - tempo.graph.info$layout$panel_params[[1]]$x.range[1]) -box.coord <- tempo.graph.info$data[[2]] # to have the summary statistics of the plot. Contrary to ini.box.plot, now integrates ylim Here because can be required for stat.pos when just box are plotted -box.coord$x <- as.numeric(box.coord$x) # because x is of special class that block comparison of values using identical -box.coord$PANEL <- as.numeric(box.coord$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? -box.coord <- box.coord[order(box.coord$group, box.coord$PANEL), ] -if( ! (identical(tempo.mean$BOX, box.coord$group) & identical(tempo.mean$PANEL, box.coord$PANEL))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nidentical(tempo.mean$BOX, box.coord$group) & identical(tempo.mean$PANEL, box.coord$PANEL) DO NOT HAVE THE SAME VALUE ORDER") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -# tempo <- c(categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){if(dot.categ != ini.dot.categ){dot.categ}}, if( ! is.null(facet.categ)){facet.categ}) -if(any(names(tempo.mean) %in% names(box.coord), na.rm = TRUE)){ -names(tempo.mean)[names(tempo.mean) %in% names(box.coord)] <- paste0(names(tempo.mean)[names(tempo.mean) %in% names(box.coord)], ".mean") -} -box.coord <- data.frame(box.coord, tempo.mean, stringsAsFactors = TRUE) -} -# end graphic info recovery (including means) - - - -# stat output (will also serve for boxplot and mean display) -# x not added know to do not have them in stat.nolog -stat <- data.frame( -MIN = box.coord$ymin_final, -QUART1 = box.coord$lower, -MEDIAN = box.coord$middle, -MEAN = box.coord$MEAN, -QUART3 = box.coord$upper, -MAX = box.coord$ymax_final, -WHISK_INF = box.coord$ymin, -BOX_INF = box.coord$lower, -NOTCH_INF = box.coord$notchlower, -NOTCH_SUP = box.coord$notchupper, -BOX_SUP = box.coord$upper, -WHISK_SUP = box.coord$ymax, -OUTLIERS = box.coord["outliers"], -tempo.mean[colnames(tempo.mean) != "MEAN"], -COLOR = box.coord$fill, -stringsAsFactors = TRUE -) # box.coord["outliers"] written like this because it is a list. X coordinates not put now because several features to set -names(stat)[names(stat) == "outliers"] <- "OUTLIERS" -stat.nolog <- stat # stat.nolog ini will serve for outputs -if(y.log != "no"){ -stat.nolog[c("MIN", "QUART1", "MEDIAN", "MEAN", "QUART3", "MAX", "WHISK_INF", "BOX_INF", "NOTCH_INF", "NOTCH_SUP", "BOX_SUP", "WHISK_SUP")] <- ifelse(y.log == "log2", 2, 10)^(stat.nolog[c("MIN", "QUART1", "MEDIAN", "MEAN", "QUART3", "MAX", "WHISK_INF", "BOX_INF", "NOTCH_INF", "NOTCH_SUP", "BOX_SUP", "WHISK_SUP")]) -stat.nolog$OUTLIERS <- lapply(stat.nolog$OUTLIERS, FUN = function(X){ifelse(y.log == "log2", 2, 10)^X}) -} -# end stat output (will also serve for boxplot and mean display) - - - - - - -# x coordinates management (for random plotting and for stat display) -# width commputations -width.ini <- c(box.coord$xmax - box.coord$xmin)[1] # all the box widths are equal here. Only the first one taken -width.correct <- width.ini * box.space / 2 -if( ! (identical(stat$BOX, box.coord$group) & identical(stat$PANEL, box.coord$PANEL))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nidentical(stat$BOX, box.coord$group) & identical(stat$PANEL, box.coord$PANEL) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -stat <- data.frame( -stat, -X = box.coord$x, -X_BOX_INF = box.coord$xmin + width.correct, -X_BOX_SUP = box.coord$xmax - width.correct, -X_NOTCH_INF = box.coord$x - (box.coord$x - (box.coord$xmin + width.correct)) / 2, -X_NOTCH_SUP = box.coord$x + (box.coord$x - (box.coord$xmin + width.correct)) / 2, -X_WHISK_INF = box.coord$x - (box.coord$x - (box.coord$xmin + width.correct)) * box.whisker.width, -X_WHISK_SUP = box.coord$x + (box.coord$x - (box.coord$xmin + width.correct)) * box.whisker.width, -# tempo.mean[colnames(tempo.mean) != "MEAN"], # already added above -stringsAsFactors = TRUE -) -stat$COLOR <- factor(stat$COLOR, levels = unique(categ.color)) -if( ! all(stat$NOTCH_SUP < stat$BOX_SUP & stat$NOTCH_INF > stat$BOX_INF, na.rm = TRUE) & box.notch == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") SOME NOTCHES ARE BEYOND BOX HINGES. TRY ARGUMENT box.notch = FALSE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -dot.jitter <- c((box.coord$xmax - width.correct) - (box.coord$xmin + width.correct))[1] * dot.jitter # real dot.jitter. (box.coord$xmin + width.correct) - (box.coord$xmax - width.correct))[1] is the width of the box. Is equivalent to (box.coord$x - (box.coord$xmin + width.correct))[1] * 2 -# end width commputations -if( ! is.null(dot.color)){ -# random dots -if(dot.tidy == FALSE){ -dot.coord.rd1 <- merge(dot.coord, box.coord[c("fill", "PANEL", "group", "x")], by = c("PANEL", "group"), sort = FALSE) # rd for random. Send the coord of the boxes into the coord data.frame of the dots (in the column x.y). WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in box.coord. Thus, no need to consider fill column -if(nrow(dot.coord.rd1) != nrow(dot.coord)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd1 DATA FRAME. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -sampled.dot.jitter <- if(nrow(dot.coord.rd1)== 1L){runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2)}else{sample(x = runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2), size = nrow(dot.coord.rd1), replace = FALSE)} -dot.coord.rd2 <- data.frame(dot.coord.rd1, dot.x = dot.coord.rd1$x.y + sampled.dot.jitter, stringsAsFactors = TRUE) # set the dot.jitter thanks to runif and dot.jitter range. Then, send the coord of the boxes into the coord data.frame of the dots (in the column x.y) -if(length(categ)== 1L){ -tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(data1[, categ[1]]), stringsAsFactors = TRUE)) # categ[1] is factor -names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") -verif <- paste0(categ[1], ".check") -}else if(length(categ) == 2L){ -tempo.data1 <- unique( -data.frame( -data1[c(categ[1], categ[2])], -group = as.integer(factor(paste0( -formatC(as.integer(data1[, categ[2]]), width = nchar(max(as.integer(data1[, categ[2]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking -".", -formatC(as.integer(data1[, categ[1]]), width = nchar(max(as.integer(data1[, categ[1]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking -)), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number -) -) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis -names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") -names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") -verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) -}else{ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 3") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -dot.coord.rd3 <- merge(dot.coord.rd2, tempo.data1, by = intersect("group", "group"), sort = FALSE) # send the factors of data1 into coord. WARNING: I have replaced by = "group" by intersect("group", "group") because of an error due to wrong group group merging in dot.coord.rd3 -if(nrow(dot.coord.rd3) != nrow(dot.coord) | ( ! fun_comp_2d(dot.coord.rd3[categ], dot.coord.rd3[verif])$identical.content)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd3 DATA FRAME. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end random dots -} -# tidy dots -# coordinates are recovered during plotting (see dot.coord.tidy1 below) -# end tidy dots -} -# end x coordinates management (for random plotting and for stat display) - - - - - -# boxplot display before dot display if box.fill = TRUE -coord.names <- NULL -# creation of the data frame for (main box + legend) and data frame for means -if(box.notch == FALSE){ -for(i3 in 1:length(categ)){ -if(i3== 1L){ -tempo.polygon <- data.frame(GROUPX = c(t(stat[, rep(categ[i3], 5)])), stringsAsFactors = TRUE) -}else{ -tempo.polygon <- cbind(tempo.polygon, c(t(stat[, rep(categ[i3], 5)])), stringsAsFactors = TRUE) -} -} -names(tempo.polygon) <- categ -tempo.polygon <- data.frame(X = c(t(stat[, c("X_BOX_INF", "X_BOX_SUP", "X_BOX_SUP", "X_BOX_INF", "X_BOX_INF")])), Y = c(t(stat[, c("BOX_INF", "BOX_INF", "BOX_SUP", "BOX_SUP", "BOX_INF")])), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), BOX = as.character(c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX")]))), tempo.polygon, stringsAsFactors = TRUE) -if( ! is.null(facet.categ)){ -for(i4 in 1:length(facet.categ)){ -tempo.polygon <- data.frame(tempo.polygon, c(t(stat[, c(facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4])])), stringsAsFactors = TRUE) -names(tempo.polygon)[length(names(tempo.polygon))] <- facet.categ[i4] -} -} -}else{ -for(i3 in 1:length(categ)){ -if(i3== 1L){ -tempo.polygon <- data.frame(GROUPX = c(t(stat[, rep(categ[i3], 11)])), stringsAsFactors = TRUE) -}else{ -tempo.polygon <- cbind(tempo.polygon, c(t(stat[, rep(categ[i3], 11)])), stringsAsFactors = TRUE) -} -} -names(tempo.polygon) <- categ -tempo.polygon <- data.frame(X = c(t(stat[, c("X_BOX_INF", "X_BOX_SUP", "X_BOX_SUP", "X_NOTCH_SUP", "X_BOX_SUP", "X_BOX_SUP", "X_BOX_INF", "X_BOX_INF", "X_NOTCH_INF", "X_BOX_INF", "X_BOX_INF")])), Y = c(t(stat[, c("BOX_INF", "BOX_INF", "NOTCH_INF", "MEDIAN", "NOTCH_SUP", "BOX_SUP", "BOX_SUP", "NOTCH_SUP", "MEDIAN", "NOTCH_INF", "BOX_INF")])), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), BOX = as.character(c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX")]))), tempo.polygon, stringsAsFactors = TRUE) -if( ! is.null(facet.categ)){ -for(i4 in 1:length(facet.categ)){ -tempo.polygon <- data.frame(tempo.polygon, c(t(stat[, c(facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4])])), stringsAsFactors = TRUE) -names(tempo.polygon)[length(names(tempo.polygon))] <- facet.categ[i4] -} -} -} -tempo.polygon$COLOR <- factor(tempo.polygon$COLOR, levels = unique(categ.color)) -if( ! is.null(categ.class.order)){ -for(i3 in 1:length(categ)){ -tempo.polygon[, categ[i3]] <- factor(tempo.polygon[, categ[i3]], levels = categ.class.order[[i3]]) -} -} -# modified name of dot.categ column (e.g., "Categ1_DOT") must be included for boxplot using ridy dots -if( ! is.null(dot.color) & ! is.null(dot.categ)){ -if(dot.categ != ini.dot.categ){ -tempo.polygon <- data.frame(tempo.polygon, GROUPX = tempo.polygon[, ini.dot.categ], stringsAsFactors = TRUE) -names(tempo.polygon)[names(tempo.polygon) == "GROUPX"] <- dot.categ - -} -} -tempo.diamon.mean <- data.frame(X = c(t(stat[, c("X", "X_NOTCH_INF", "X", "X_NOTCH_SUP", "X")])), Y = c(t(cbind(stat["MEAN"] - (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stat["MEAN"], stat["MEAN"] + (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stat["MEAN"], stat["MEAN"] - (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stringsAsFactors = TRUE))), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), GROUP = c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX")])), stringsAsFactors = TRUE) # stringsAsFactors = TRUE for cbind() because stat["MEAN"] is a data frame. Otherwise, stringsAsFactors is not an argument for cbind() on vectors -if( ! is.null(facet.categ)){ -for(i3 in 1:length(facet.categ)){ -tempo.diamon.mean <- data.frame(tempo.diamon.mean, c(t(stat[, c(facet.categ[i3], facet.categ[i3], facet.categ[i3], facet.categ[i3], facet.categ[i3])])), stringsAsFactors = TRUE) -names(tempo.diamon.mean)[length(names(tempo.diamon.mean))] <- facet.categ[i3] -} -} -tempo.diamon.mean$COLOR <- factor(tempo.diamon.mean$COLOR, levels = unique(categ.color)) -# end creation of the data frame for (main box + legend) and data frame for means -if(box.fill == TRUE){ -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[length(categ)], fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, size = box.line.size, notch = box.notch, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}, alpha = box.alpha, outlier.shape = if( ! is.null(dot.color)){NA}else{21}, outlier.color = if( ! is.null(dot.color)){NA}else{dot.border.color}, outlier.fill = if( ! is.null(dot.color)){NA}else{NULL}, outlier.size = if( ! is.null(dot.color)){NA}else{dot.size}, outlier.stroke = if( ! is.null(dot.color)){NA}else{dot.border.size}, outlier.alpha = if( ! is.null(dot.color)){NA}else{dot.alpha})) # the color, size, etc. of the outliers are dealt here. outlier.color = NA to do not plot outliers when dots are already plotted. Finally, boxplot redrawn (see below) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_polygon( -data = tempo.polygon, -mapping = ggplot2::aes_string(x = "X", y = "Y", group = "BOX", fill = categ[length(categ)], color = categ[length(categ)]), -size = box.line.size, -alpha = box.alpha # works only for fill, not for color -)) -coord.names <- c(coord.names, "main.box") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha)) # -coord.names <- c(coord.names, "sup.whisker") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_INF, yend = WHISK_INF, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha)) # -coord.names <- c(coord.names, "inf.whisker") -if(box.whisker.width > 0){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha, lineend = "round")) # -coord.names <- c(coord.names, "sup.whisker.edge") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_INF, yend = WHISK_INF, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha, lineend = "round")) # -coord.names <- c(coord.names, "inf.whisker.edge") -} -if(box.mean == TRUE){ -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = stat, mapping = ggplot2::aes_string(x = "X", y = "MEAN", group = categ[length(categ)]), shape = 23, stroke = box.line.size * 2, fill = stat$COLOR, size = box.mean.size, color = "black", alpha = box.alpha)) # group used in aesthetic to do not have it in the legend -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_polygon( -data = tempo.diamon.mean, -mapping = ggplot2::aes(x = X, y = Y, group = GROUP), -fill = tempo.diamon.mean[, "COLOR"], -color = hsv(0, 0, 0, alpha = box.alpha), # outline of the polygon in black but with alpha -size = box.line.size, -alpha = box.alpha -)) -coord.names <- c(coord.names, "mean") -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = if(box.notch == FALSE){X_BOX_INF}else{X_NOTCH_INF}, xend = if(box.notch == FALSE){X_BOX_SUP}else{X_NOTCH_SUP}, y = MEDIAN, yend = MEDIAN, group = categ[length(categ)]), color = "black", size = box.line.size * 2, alpha = box.alpha)) # -coord.names <- c(coord.names, "median") -} -# end boxplot display before dot display if box.fill = TRUE - - - - - - -# dot display -if( ! is.null(dot.color)){ -if(dot.tidy == FALSE){ -if(is.null(dot.categ)){ -if(dot.border.size == 0){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( -data = dot.coord.rd3, -mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), -size = dot.size, -shape = 19, -color = dot.coord.rd3$dot.color, -alpha = dot.alpha -)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic -}else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( -data = dot.coord.rd3, -mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), -shape = 21, -stroke = dot.border.size, -color = if(is.null(dot.border.color)){dot.coord.rd3$dot.color}else{rep(dot.border.color, nrow(dot.coord.rd3))}, -size = dot.size, -fill = dot.coord.rd3$dot.color, -alpha = dot.alpha -)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic -} -}else{ -if(dot.border.size == 0){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( -data = dot.coord.rd3, -mapping = ggplot2::aes_string(x = "dot.x", y = "y", alpha = dot.categ), -size = dot.size, -shape = 19, -color = dot.coord.rd3$dot.color -)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic -}else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( -data = dot.coord.rd3, -mapping = ggplot2::aes_string(x = "dot.x", y = "y", alpha = dot.categ), -size = dot.size, -shape = 21, -stroke = dot.border.size, -color = if(is.null(dot.border.color)){dot.coord.rd3$dot.color}else{rep(dot.border.color, nrow(dot.coord.rd3))}, -fill = dot.coord.rd3$dot.color -)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = dot.legend.name, values = rep(dot.alpha, length(dot.categ.class.order)), guide = ggplot2::guide_legend(override.aes = list(fill = dot.color, color = if(is.null(dot.border.color)){dot.color}else{dot.border.color}, stroke = dot.border.size, alpha = dot.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -} -coord.names <- c(coord.names, "dots") -}else if(dot.tidy == TRUE){ -# here plot using group -> no scale -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_dotplot( -data = dot.coord, -mapping = ggplot2::aes_string(x = categ[1], y = "y", group = "group"), # not dot.categ here because the classes of dot.categ create new separations -position = ggplot2::position_dodge(width = box.width), -binpositions = "all", -binaxis = "y", -stackdir = "center", -alpha = dot.alpha, -fill = dot.coord$dot.color, -stroke = dot.border.size, -color = if(is.null(dot.border.color)){dot.coord$dot.color}else{rep(dot.border.color, nrow(dot.coord))}, -show.legend = FALSE, # WARNING: do not use show.legend = TRUE because it uses the arguments outside aes() as aesthetics (here color and fill). Thus I must find a way using ggplot2::scale_discrete_manual() -binwidth = (y.lim[2] - y.lim[1]) / dot.tidy.bin.nb -)) # geom_dotplot ggplot2 v3.3.0: I had to remove rev() in fill and color # very weird behavior of geom_dotplot ggplot2 v3.2.1, (1) because with aes group = (to avoid legend), the dot plotting is not good in term of coordinates, and (2) because data1 seems reorderer according to x = categ[1] before plotting. Thus, I have to use fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"] to have the good corresponding colors # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) -coord.names <- c(coord.names, "dots") -if( ! is.null(dot.categ)){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_dotplot( -data = dot.coord, -mapping = ggplot2::aes_string(x = categ[1], y = "y", alpha = dot.categ), # not dot.categ here because the classes of dot.categ create new separations -position = ggplot2::position_dodge(width = box.width), -binpositions = "all", -binaxis = "y", -stackdir = "center", -fill = NA, -stroke = NA, -color = NA, -# WARNING: do not use show.legend = TRUE because it uses the arguments outside aes() as aesthetics (here color and fill). Thus I must find a way using ggplot2::scale_discrete_manual() -binwidth = (y.lim[2] - y.lim[1]) / dot.tidy.bin.nb -)) # geom_dotplot ggplot2 v3.3.0: I had to remove rev() in fill and color # very weird behavior of geom_dotplot ggplot2 v3.2.1, (1) because with aes group = (to avoid legend), the dot plotting is not good in term of coordinates, and (2) because data1 seems reorderer according to x = categ[1] before plotting. Thus, I have to use fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"] to have the good corresponding colors # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "linetype", name = dot.legend.name, values = rep(1, length(categ.color)))) # values = rep("black", length(categ.color)) are the values of color (which is the border color of dots), and this modify the border color on the plot. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -coord.names <- c(coord.names, "bad_remove") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = dot.legend.name, values = rep(dot.alpha, length(dot.categ.class.order)), labels = dot.categ.class.order, guide = ggplot2::guide_legend(title = if(ini.dot.categ == categ[length(categ)]){dot.categ}else{ini.dot.categ}, override.aes = list(fill = levels(dot.coord$dot.color), color = if(is.null(dot.border.color)){levels(dot.coord$dot.color)}else{dot.border.color}, stroke = dot.border.size, alpha = dot.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -} -# coordinates of tidy dots -tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data # to have the tidy dot coordinates -if(length(which(sapply(X = tempo.coord, FUN = function(X){any(names(X) == "binwidth", na.rm = TRUE)}))) != 1){ # detect the compartment of tempo.coord which is the binned data frame -# if(length(which(sapply(tempo.coord, FUN = nrow) == nrow(data1))) > if(is.null(dot.categ)){1}else{2}){ # this does not work if only one dot per class, thus replaced by above # if(is.null(dot.categ)){1}else{2} because 1 dotplot if dot.categ is NULL and 2 dotplots if not, with the second being a blank dotplot with wrong coordinates. Thus take the first in that situation -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nEITHER MORE THAN 1 OR NO COMPARTMENT HAVING A DATA FRAME WITH binwidth AS COLUMN NAME IN THE tempo.coord LIST (FOR TIDY DOT COORDINATES). CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -# dot.coord.tidy1 <- tempo.coord[[which(sapply(tempo.coord, FUN = nrow) == nrow(data1))[1]]] # this does not work if only one dot per class, thus replaced by above # the second being a blank dotplot with wrong coordinates. Thus take the first whatever situation -dot.coord.tidy1 <- tempo.coord[[which(sapply(X = tempo.coord, FUN = function(X){any(names(X) == "binwidth", na.rm = TRUE)}))]] # detect the compartment of tempo.coord which is the binned data frame -dot.coord.tidy1$x <- as.numeric(dot.coord.tidy1$x) # because weird class -dot.coord.tidy1$PANEL <- as.numeric(dot.coord.tidy1$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? -} -# tempo.box.coord <- merge(box.coord, unique(dot.coord[, c("PANEL", "group", categ)]), by = c("PANEL", "group"), sort = FALSE) # not required anymore because box.coord already contains categ do not add dot.categ and tidy_group_coord here because the coordinates are for stats. Add the categ in box.coord. WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in box.coord. Thus, no need to consider fill column -# below inactivated because not true when dealing with dot.categ different from categ -# if(nrow(tempo.box.coord) != nrow(box.coord)){ -# tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT tempo.box.coord DATA FRAME. CODE HAS TO BE MODIFIED") -# stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -# } -dot.coord.tidy2 <- merge(dot.coord.tidy1, box.coord[c("fill", "PANEL", "group", "x", categ)], by = c("PANEL", "group"), sort = FALSE) # send the coord of the boxes into the coord data.frame of the dots (in the column x.y).WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in tempo.box.coord. Thus, no need to consider fill colum # DANGER: from here the fill.y and x.y (from tempo.box.coord) are not good in dot.coord.tidy2. It is ok because Categ1 Categ2 from tempo.box.coord are ok with the group column from dot.coord.tidy1. This is due to the fact that dot.coord.tidy resulting from geom_dotplot does not make the same groups as the other functions -if(nrow(dot.coord.tidy2) != nrow(dot.coord)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy2 DATA FRAME. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# From here, check for dot.coord.tidy3 which wil be important for stat over the plot. WARNING: dot.categ has nothing to do here for stat coordinates. Thus, not in tempo.data1 -if(length(categ)== 1L){ -tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(data1[, categ[1]]), stringsAsFactors = TRUE)) # categ[1] is factor -names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") -verif <- paste0(categ[1], ".check") -}else if(length(categ) == 2L){ -tempo.data1 <- unique( -data.frame( -data1[c(categ[1], categ[2])], -group = as.integer(factor(paste0( -formatC(as.integer(data1[, categ[2]]), width = nchar(max(as.integer(data1[, categ[2]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking -".", -formatC(as.integer(data1[, categ[1]]), width = nchar(max(as.integer(data1[, categ[1]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking -)), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number -) -) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis -names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") -names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") -verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) -}else{ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 4") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -dot.coord.tidy3 <- merge(dot.coord.tidy2, tempo.data1, by = intersect("group", "group"), sort = FALSE) # send the factors of data1 into coord. WARNING: I have tested intersect("group", "group") instead of by = "group". May be come back to by = "group" in case of error. But I did this because of an error in dot.coord.rd3 above -if(nrow(dot.coord.tidy3) != nrow(dot.coord) | ( ! fun_comp_2d(dot.coord.tidy3[categ], dot.coord.tidy3[verif])$identical.content)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy3 DATA FRAME. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end coordinates of tidy dots -} -} -# end dot display - - - -# boxplot display (if box.fill = FALSE, otherwise, already plotted above) -if(box.fill == TRUE){ -# overcome "work only for the filling of boxes, not for the frame. See https://github.com/tidyverse/ggplot2/issues/252" -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color}, guide = ggplot2::guide_legend(order = 1))) #, guide = ggplot2::guide_legend(override.aes = list(fill = levels(tempo.polygon$COLOR), color = "black")))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = rep(hsv(0, 0, 0, alpha = box.alpha), length(unique(data1[, categ[length(categ)]]))), guide = ggplot2::guide_legend(order = 1))) # , guide = ggplot2::guide_legend(override.aes = list(color = "black", alpha = box.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor # outline of the polygon in black but with alpha -}else{ -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[length(categ)], fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, size = box.line.size, notch = box.notch, alpha = box.alpha, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}, outlier.shape = if( ! is.null(dot.color)){NA}else{21}, outlier.color = if( ! is.null(dot.color)){NA}else{if(dot.border.size == 0){NA}else{dot.border.color}}, outlier.fill = if( ! is.null(dot.color)){NA}else{NULL}, outlier.size = if( ! is.null(dot.color)){NA}else{dot.size}, outlier.stroke = if( ! is.null(dot.color)){NA}else{dot.border.size}, outlier.alpha = if( ! is.null(dot.color)){NA}else{dot.alpha})) # the color, size, etc. of the outliers are dealt here. outlier.color = NA to do not plot outliers when dots are already plotted -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_path( -data = tempo.polygon, -mapping = ggplot2::aes_string(x = "X", y = "Y", group = "BOX", color = categ[length(categ)]), -size = box.line.size, -alpha = box.alpha, -lineend = "round", -linejoin = "round" -)) -coord.names <- c(coord.names, "main.box") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = if(box.notch == FALSE){X_BOX_INF}else{X_NOTCH_INF}, xend = if(box.notch == FALSE){X_BOX_SUP}else{X_NOTCH_SUP}, y = MEDIAN, yend = MEDIAN, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size * 2, alpha = box.alpha)) # -coord.names <- c(coord.names, "median") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha)) # -coord.names <- c(coord.names, "sup.whisker") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_INF, yend = WHISK_INF, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha)) # -coord.names <- c(coord.names, "inf.whisker") -if(box.whisker.width > 0){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha, lineend = "round")) # -coord.names <- c(coord.names, "sup.whisker.edge") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_INF, yend = WHISK_INF, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha, lineend = "round")) # -coord.names <- c(coord.names, "inf.whisker.edge") -} -if(box.mean == TRUE){ -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = stat, mapping = ggplot2::aes_string(x = "X", y = "MEAN", group = categ[length(categ)]), shape = 23, stroke = box.line.size * 2, color = stat$COLOR, size = box.mean.size, fill = NA, alpha = box.alpha)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_path( -data = tempo.diamon.mean, -mapping = ggplot2::aes(x = X, y = Y, group = GROUP), -color = tempo.diamon.mean[, "COLOR"], -size = box.line.size, -alpha = box.alpha, -lineend = "round", -linejoin = "round" -)) -coord.names <- c(coord.names, "mean") -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = rep(NA, length(unique(data1[, categ[length(categ)]]))))) #, guide = ggplot2::guide_legend(override.aes = list(color = categ.color)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color}, guide = ggplot2::guide_legend(override.aes = list(alpha = if(plot == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list()) == 0L & Sys.info()["sysname"] == "Windows"))){1}else{box.alpha})))) # , guide = ggplot2::guide_legend(override.aes = list(color = as.character(categ.color))))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -if(plot == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list()) == 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -# to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(box.alpha == 0){ # remove box legend because no boxes drawn -# add this after the scale_xxx_manual() for boxplots -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE)) # inactivate the legend -} -# end boxplot display (if box.fill = FALSE, otherwise, already plotted above) - - - - -# stat display -# layer after dots but ok, behind dots on the plot -if( ! is.null(stat.pos)){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NUMBERS DISPLAYED ARE ", ifelse(stat.mean == FALSE, "MEDIANS", "MEANS")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -if(stat.pos == "top"){ -tempo.stat <- data.frame(stat, Y = y.lim[2], stringsAsFactors = TRUE) # I had to create a data frame for geom_tex() so that facet is taken into account, (ggplot2::annotate() does not deal with facet because no data and mapping arguments). Of note, facet.categ is in tempo.stat, via tempo.mean, via dot.coord -if(stat.mean == FALSE){tempo.stat$MEDIAN <- formatC(stat.nolog$MEDIAN, digit = 2, drop0trailing = TRUE, format = "f")}else{tempo.stat$MEAN <- formatC(stat.nolog$MEAN, digit = 2, drop0trailing = TRUE, format = "f")} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( -data = tempo.stat, -mapping = ggplot2::aes_string(x = "X", y = "Y", label = ifelse(stat.mean == FALSE, "MEDIAN", "MEAN")), -size = stat.size, -color = "black", -angle = stat.angle, -hjust = stat.just$hjust, -vjust = stat.just$vjust -)) # stat$X used here because identical to stat.nolog but has the X. WARNING: no need of order() for labels because box.coord$x set the order. For justification, see https://stackoverflow.com/questions/7263849/what-do-hjust-and-vjust-do-when-making-a-plot-using-ggplot -coord.names <- c(coord.names, "stat.pos") -}else if(stat.pos == "above"){ -# stat coordinates -if( ! is.null(dot.color)){ # for text just above max dot -if(dot.tidy == FALSE){ -tempo.stat.ini <- dot.coord.rd3 -}else if(dot.tidy == TRUE){ -tempo.stat.ini <- dot.coord.tidy3 -tempo.stat.ini$x.y <- tempo.stat.ini$x.x # this is just to be able to use tempo.stat.ini$x.y for untidy or tidy dots (remember that dot.coord.tidy3$x.y is not good, see above) -} -stat.coord1 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ)== 1L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ)== 1L){c("group", "PANEL", "x.y", categ[1])}else if(length(categ) == 2L){c("group", "PANEL", "x.y", categ[1], categ[2])} ; x.env}, FUN = min, na.rm = TRUE) -names(stat.coord1)[names(stat.coord1) == "y"] <- "dot.min" -stat.coord2 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ)== 1L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ)== 1L){c("group", "PANEL", "x.y", categ[1])}else if(length(categ) == 2L){c("group", "PANEL", "x.y", categ[1], categ[2])} ; x.env}, FUN = max, na.rm = TRUE) -names(stat.coord2) <- paste0(names(stat.coord2), "_from.dot.max") -names(stat.coord2)[names(stat.coord2) == "y_from.dot.max"] <- "dot.max" -stat.coord3 <- cbind(box.coord[order(box.coord$group, box.coord$PANEL), ], stat.coord1[order(stat.coord1$group, stat.coord1$x.y), ], stat.coord2[order(stat.coord2$group, stat.coord2$x.y), ], stringsAsFactors = TRUE) # -if( ! all(identical(round(stat.coord3$x, 9), round(as.numeric(stat.coord3$x.y), 9)), na.rm = TRUE)){ # as.numeric() because stat.coord3$x is class "mapped_discrete" "numeric" -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nFUSION OF box.coord, stat.coord1 AND stat.coord2 ACCORDING TO box.coord$x, stat.coord1$x.y AND stat.coord2$x.y IS NOT CORRECT. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# text.coord <- stat.coord3[, c("x", "group", "dot.min", "dot.max")] -# names(text.coord)[names(text.coord) == "dot.min"] <- "text.min.pos" -#names(text.coord)[names(text.coord) == "dot.max"] <- "text.max.pos" -box.coord <- box.coord[order(box.coord$x, box.coord$group, box.coord$PANEL), ] -# text.coord <- text.coord[order(text.coord$x), ] # to be sure to have the two objects in the same order for x. WARNING: cannot add identical(as.integer(text.coord$group), as.integer(box.coord$group)) because with error, the correspondence between x and group is not the same -stat.coord3 <- stat.coord3[order(stat.coord3$x, stat.coord3$group, stat.coord3$PANEL), ] # to be sure to have the two objects in the same order for x. WARNING: cannot add identical(as.integer(text.coord$group), as.integer(box.coord$group)) because with error, the correspondence between x and group is not the same -if( ! (identical(box.coord$x, stat.coord3$x) & identical(box.coord$group, stat.coord3$group) & identical(box.coord$PANEL, stat.coord3$PANEL))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\ntext.coord AND box.coord DO NOT HAVE THE SAME x, group AND PANEL COLUMN CONTENT") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -}else{ -stat.coord3 <- box.coord -} -stat.coord3 <- data.frame( -stat.coord3, -Y = stat.coord3[, ifelse( -is.null(dot.color), -ifelse(diff(y.lim) > 0, "ymax", "ymin"), -ifelse(diff(y.lim) > 0, "ymax_final", "ymin_final") -)], -stringsAsFactors = TRUE -) # ymax is top whisker, ymax_final is top dot -# stat.coord3 <- data.frame(stat.coord3, Y = vector("numeric", length = nrow(stat.coord3)), stringsAsFactors = TRUE) -# check.Y <- as.logical(stat.coord3$Y) # convert everything in Y into FALSE (because Y is full of zero) -# end stat coordinates -# stat display -# performed twice: first for y values >=0, then y values < 0, because only a single value allowed for hjust anf vjust -if(stat.mean == FALSE){ -tempo.center.ref <- "middle" -}else{ -tempo.center.ref <- "MEAN" -} -# if(is.null(dot.color)){ -# tempo.low.ref <- "ymin" -# tempo.high.ref <- "ymax" -# }else{ -# tempo.low.ref <- "ymin_final" -# tempo.high.ref <- "ymax_final" -# } -# tempo.log.high <- if(diff(y.lim) > 0){stat.coord3[, tempo.center.ref] >= 0}else{stat.coord3[, tempo.center.ref] < 0} -# tempo.log.low <- if(diff(y.lim) > 0){stat.coord3[, tempo.center.ref] < 0}else{stat.coord3[, tempo.center.ref] >= 0} -# stat.coord3$Y[tempo.log.high] <- stat.coord3[tempo.log.high, tempo.high.ref] -# stat.coord3$Y[tempo.log.low] <- stat.coord3[tempo.log.low, tempo.low.ref] -# add distance -stat.coord3$Y <- stat.coord3$Y + diff(y.lim) * stat.dist / 100 -# end add distance -# correct median or mean text format -if(y.log != "no"){ -stat.coord3[, tempo.center.ref] <- ifelse(y.log == "log2", 2, 10)^(stat.coord3[, tempo.center.ref]) -} -stat.coord3[, tempo.center.ref] <- formatC(stat.coord3[, tempo.center.ref], digit = 2, drop0trailing = TRUE, format = "f") -# end correct median or mean text format -# if(any(tempo.log.high) == TRUE){ -# tempo.stat <- stat.coord3[tempo.log.high,] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( -data = stat.coord3, -mapping = ggplot2::aes_string(x = "x", y = "Y", label = tempo.center.ref), -size = stat.size, -color = "black", -angle = stat.angle, -hjust = stat.just$hjust, -vjust = stat.just$vjust -)) # WARNING: no need of order() for labels because box.coord$x set the order -coord.names <- c(coord.names, "stat.pos") -# } -# if(any(tempo.log.low) == TRUE){ -# tempo.stat <- stat.coord3[tempo.log.low,] -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( -# data = tempo.stat, -# mapping = ggplot2::aes_string(x = "x", y = "Y", label = tempo.center.ref), -# size = stat.size, -# color = "black", -# hjust = ifelse(vertical == TRUE, 0.5, 0.5 + stat.dist), -# vjust = ifelse(vertical == TRUE, 0.5 + stat.dist, 0.5) -# )) # WARNING: no need of order() for labels because box.coord$x set the order -# coord.names <- c(coord.names, "stat.pos.negative") -# } -# end stat display -}else{ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 5") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -# end stat display -# legend management -if(legend.show == FALSE){ # must be here because must be before bef.final.plot <- -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE, alpha = FALSE)) # inactivate the initial legend -} -# end legend management - - - -# y scale management (cannot be before dot plot management) -# the rescaling aspect is complicated and not intuitive. See: -# explaination: https://github.com/tidyverse/ggplot2/issues/3948 -# the oob argument of scale_y_continuous() https://ggplot2.tidyverse.org/reference/scale_continuous.html -# see also https://github.com/rstudio/cheatsheets/blob/master/data-visualization-2.1.pdf -# secondary ticks -bef.final.plot <- ggplot2::ggplot_build(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + if(vertical == TRUE){ggplot2::scale_y_continuous(expand = c(0, 0), limits = sort(y.lim), oob = scales::rescale_none)}else{ggplot2::coord_flip(ylim = y.lim)}')))) # here I do not need the x-axis and y-axis orientation, I just need the number of main ticks and the legend. I DI NOT UNDERSTAND THE COMMENT HERE BECAUSE WE NEED COORD_FLiP -tempo.coord <- bef.final.plot$layout$panel_params[[1]] -# y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non NULL or if y.log argument is different from "no") -if(y.log != "no"){ # integer main ticks for log2 and log10 -tempo.scale <- (as.integer(min(y.lim, na.rm = TRUE)) - 1):(as.integer(max(y.lim, na.rm = TRUE)) + 1) -}else{ -tempo <- if(is.null(attributes(tempo.coord$y$breaks))){tempo.coord$y$breaks}else{unlist(attributes(tempo.coord$y$breaks))} -if(all(is.na(tempo))){# all() without na.rm -> ok because is.na() cannot be NA -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$y$breaks") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -tempo.scale <- fun_scale(lim = y.lim, n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) # in ggplot 3.3.0, tempo.coord$y.major_source replaced by tempo.coord$y$breaks. If fact: n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) replaced by n = ifelse(is.null(y.tick.nb), 4, y.tick.nb)) -} -y.second.tick.values <- NULL -y.second.tick.pos <- NULL -if(y.log != "no"){ -tempo <- fun_inter_ticks(lim = y.lim, log = y.log) -y.second.tick.values <- tempo$values -y.second.tick.pos <- tempo$coordinates -# if(vertical == TRUE){ # do not remove in case the bug is fixed -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = y.second.tick.pos, yend = y.second.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) -# }else{ # not working because of the ggplot2 bug -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = y.second.tick.pos, xend = y.second.tick.pos, y = tempo.coord$y.range[1], yend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) -# } -coord.names <- c(coord.names, "y.second.tick.positions") -}else if(( ! is.null(y.second.tick.nb)) & y.log == "no"){ -# if(y.second.tick.nb > 0){ #inactivated because already checked before -if(length(tempo.scale) < 2){ -tempo.cat1 <- c("y.tick.nb", "y.second.tick.nb") -tempo.cat2 <- sapply(list(y.tick.nb, y.second.tick.nb), FUN = paste0, collapse = " ") -tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") -tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE Y-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -tempo <- fun_inter_ticks(lim = y.lim, log = y.log, breaks = tempo.scale, n = y.second.tick.nb) -} -y.second.tick.values <- tempo$values -y.second.tick.pos <- tempo$coordinates -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( -geom = "segment", -y = y.second.tick.pos, -yend = y.second.tick.pos, -x = if(vertical == TRUE){tempo.coord$x.range[1]}else{tempo.coord$y.range[1]}, -xend = if(vertical == TRUE){tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80}else{tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80} -)) -coord.names <- c(coord.names, "y.second.tick.positions") -} -# end y.second.tick.positions -# for the ggplot2 bug with y.log, this does not work: eval(parse(text = ifelse(vertical == FALSE & y.log == "log10", "ggplot2::scale_x_continuous", "ggplot2::scale_y_continuous"))) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( -breaks = tempo.scale, -minor_breaks = y.second.tick.pos, -labels = if(y.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(y.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(y.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 6") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, # == in stop() to be able to add several messages between == -expand = c(0, 0), # remove space after after axis limits -limits = sort(y.lim), # NA indicate that limits must correspond to data limits but ylim() already used -oob = scales::rescale_none, -trans = ifelse(diff(y.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() but create the problem of y-axis label disappearance with y.lim decreasing. Thus, do not use. Use ylim() below and after this -)) -if(vertical == TRUE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(ylim = y.lim)) # problem of ggplot2::ylim() is that it redraws new breaks # coord_cartesian(ylim = y.lim)) not used because bug -> y-axis label disappearance with y.lim decreasing I DO NOT UNDERSTAND THIS MESSAGE WHILE I USE COORD_CARTESIAN # clip = "off" to have secondary ticks outside plot region does not work -}else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_flip(ylim = y.lim)) # clip = "off" to have secondary ticks outside plot region does not work # create the problem of y-axis label disappearance with y.lim decreasing. IDEM ABOVE - -} -# end y scale management (cannot be before dot plot management) - - -# legend management -if( ! is.null(legend.width)){ -legend.final <- fun_gg_get_legend(ggplot_built = bef.final.plot, fun.name = function.name, lib.path = lib.path) # get legend -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE, alpha = FALSE)) # inactivate the initial legend -if(is.null(legend.final) & plot == TRUE){ # even if any(unlist(legend.disp)) is TRUE -legend.final <- ggplot2::ggplot()+ggplot2::theme_void() # empty graph instead of legend -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON NULL legend.width ARGUMENT\n") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end legend management - - -# drawing -fin.plot <- suppressMessages(suppressWarnings(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))) -grob.save <- NULL -if(plot == TRUE){ -# following lines inactivated because of problem in warn.recov and message.recov -# assign("env_fun_get_message", new.env()) -# assign("tempo.gg.name", tempo.gg.name, envir = env_fun_get_message) -# assign("tempo.gg.count", tempo.gg.count, envir = env_fun_get_message) -# assign("add", add, envir = env_fun_get_message) -# two next line: for the moment, I cannot prevent the warning printing -# warn.recov <- fun_get_message(paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add}), kind = "warning", header = FALSE, print.no = FALSE, env = env_fun_get_message) # for recovering warnings printed by ggplot() functions -# message.recov <- fun_get_message('print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add}))))', kind = "message", header = FALSE, print.no = FALSE, env = env_fun_get_message) # for recovering messages printed by ggplot() functions -# if( ! (return == TRUE & return.ggplot == TRUE)){ # because return() plots when return.ggplot is TRUE # finally not used -> see return.ggplot description -if(is.null(legend.width)){ -grob.save <- suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot))) -}else{ -grob.save <-suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot, legend.final, ncol=2, widths=c(1, legend.width)))) -} -# } -# suppressMessages(suppressWarnings(print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add})))))) -}else{ -# following lines inactivated because of problem in warn.recov and message.recov -# message.recov <- NULL -# warn.recov <- NULL -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") PLOT NOT SHOWN AS REQUESTED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# end drawing - - - -# output -# following lines inactivated because of problem in warn.recov and message.recov -# if( ! (is.null(warn) & is.null(warn.recov) & is.null(message.recov))){ -# warn <- paste0(warn, "\n\n", if(length(warn.recov) > 0 | length(message.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", ifelse( ! is.null(warn.recov), unique(message.recov), ""), ifelse( ! is.null(message.recov), unique(message.recov), ""), collapse = "\n\n"), "\n\n")}) -# }else if( ! (is.null(warn) & is.null(warn.recov)) & is.null(message.recov)){ -# warn <- paste0(warn, "\n\n", if(length(warn.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", unique(warn.recov), collapse = "\n\n"), "\n\n")}) -# }else if( ! (is.null(warn) & is.null(message.recov)) & is.null(warn.recov)){ -# warn <- paste0(warn, "\n\n", if(length(message.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", unique(message.recov), collapse = "\n\n"), "\n\n")}) -# } -if(warn.print == TRUE & ! is.null(warn)){ -on.exit(warning(paste0("FROM ", function.name, ":\n\n", warn), call. = FALSE)) -} -on.exit(exp = options(warning.length = ini.warning.length), add = TRUE) -if(return == TRUE){ -tempo.output <- ggplot2::ggplot_build(fin.plot) -tempo.output$data <- tempo.output$data[-1] # remove the first data because corresponds to the initial empty boxplot -if(length(tempo.output$data) != length(coord.names)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nlength(tempo.output$data) AND length(coord.names) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -names(tempo.output$data) <- coord.names -tempo.output$data <- tempo.output$data[coord.names != "bad_remove"] -} -tempo <- tempo.output$layout$panel_params[[1]] -output <- list( -data = data1.ini, -stat = stat.nolog, -removed.row.nb = removed.row.nb, -removed.rows = removed.rows, -plot = c(tempo.output$data, y.second.tick.values = list(y.second.tick.values)), -panel = facet.categ, -axes = list( -x.range = tempo$x.range, -x.labels = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{tempo$x$scale$get_labels()}, # is.null(attributes(tempo$x$breaks)) test if it is number (TRUE) or character (FALSE) -x.positions = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{unlist(attributes(tempo$x$breaks))}, -y.range = tempo$y.range, -y.labels = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{tempo$y$scale$get_labels()}, -y.positions = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{unlist(attributes(tempo$y$breaks))} -), -warn = paste0("\n", warn, "\n\n"), -ggplot = if(return.ggplot == TRUE){fin.plot}else{NULL}, # fin.plot plots the graph if return == TRUE -gtable = if(return.gtable == TRUE){grob.save}else{NULL} -) -return(output) # this plots the graph if return.ggplot is TRUE and if no assignment -} -# end output -# end main code -} - - - - - -# add density -# rasterise all kind: https://cran.r-project.org/web/packages/ggrastr/vignettes/Raster_geoms.html -# log not good: do not convert as in boxplot - -fun_gg_scatter <- function( -data1, -x, -y, -categ = NULL, -categ.class.order = NULL, -color = NULL, -geom = "geom_point", -geom.step.dir = "hv", -geom.stick.base = NULL, -alpha = 0.5, -dot.size = 2, -dot.shape = 21, -dot.border.size = 0.5, -dot.border.color = NULL, -line.size = 0.5, -line.type = "solid", -x.lim = NULL, -x.lab = NULL, -x.log = "no", -x.tick.nb = NULL, -x.second.tick.nb = NULL, -x.include.zero = FALSE, -x.left.extra.margin = 0.05, -x.right.extra.margin = 0.05, -x.text.angle = 0, -y.lim = NULL, -y.lab = NULL, -y.log = "no", -y.tick.nb = NULL, -y.second.tick.nb = NULL, -y.include.zero = FALSE, -y.top.extra.margin = 0.05, -y.bottom.extra.margin = 0.05, -y.text.angle = 0, -raster = FALSE, -raster.ratio = 1, -raster.threshold = NULL, -text.size = 12, -title = "", -title.text.size = 12, -legend.show = TRUE, -legend.width = 0.5, -legend.name = NULL, -article = TRUE, -grid = FALSE, -add = NULL, -return = FALSE, -return.ggplot = FALSE, -return.gtable = TRUE, -plot = TRUE, -warn.print = FALSE, -lib.path = NULL -){ -# AIM -# Plot ggplot2 scatterplot with the possibility to overlay dots from up to 3 different data frames (-> three different legends) and lines from up to 3 different data frames (-> three different legends) -> up to 6 overlays totally -# For ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html -# WARNINGS -# Rows containing NA in data1[, c(x, y, categ)] will be removed before processing, with a warning (see below) -# Size arguments (dot.size, dot.border.size, line.size, text.size and title.text.size) are in mm. See Hadley comment in https://stackoverflow.com/questions/17311917/ggplot2-the-unit-of-size. See also http://sape.inf.usi.ch/quick-reference/ggplot2/size). Unit object are not accepted, but conversion can be used (e.g., grid::convertUnit(grid::unit(0.2, "inches"), "mm", valueOnly = TRUE)) -# ARGUMENTS -# data1: a dataframe compatible with ggplot2, or a list of data frames. Order matters for the order of the legend and for the layer staking (starting from below to top) -# x: single character string of the data1 column name for x-axis coordinates. If data1 is a list, then x must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Write NULL for each "geom_hline" in geom argument -# y: single character string of the data1 column name for y-axis coordinates. If data1 is a list, then y must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Write NULL for each "geom_vline" in geom argument -# categ: either NULL or a single character string or a list of single character strings, indicating the data1 column names to use for categories which creates legend display -# If categ == NULL, no categories -> no legend displayed -# If data1 is a data frame, categ must be a single character string of the data1 column name for categories -# If data1 is a list, then categ must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL (no legend display for these compartments), and other not -# categ.class.order: either (1) NULL or (2) a vector of character strings or (3) a list of these vectors, setting the order of the classes of categ in the legend display -# If categ.class.order is NULL, classes are represented according to the alphabetical order -# If data1 is a data frame, categ.class.order must be a vector of character strings specifying the different classes in the categ column name of data1 -# If data1 is a list, then categ.class.order must be a list of vector of character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL (alphabetical order for these compartments), and other not -# color: either (1) NULL, or (2) a vector of character strings or integers, or (3) a list of vectors of character strings or integers -# If color is NULL, default colors of ggplot2 -# If data1 is a data frame, color argument can be either: -# (1) a single color string. All the dots of the corresponding data1 will have this color, whatever the categ value (NULL or not) -# (2) if categ is non-null, a vector of string colors, one for each class of categ. Each color will be associated according to the categ.class.order argument if specified, or to the alphabetical order of categ classes otherwise -# (3) if categ is non-null, a vector or factor of string colors, like if it was one of the column of data1 data frame. WARNING: a single color per class of categ and a single class of categ per color must be respected -# Positive integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the max integer value among all the integers in color (see fun_gg_palette()) -# If data1 is a list, then color argument must be either: -# (1) a list of character strings or integers, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. -# (2) a single character string or a single integer -# With a list (first possibility), the rules described for when data1 is a data frame apply to each compartment of the list. Some of the compartments can be NULL. In that case, a different grey color will be used for each NULL compartment. With a single value (second possibility), the same color will be used for all the dots and lines, whatever the data1 list -# geom: single character string of the kind of plot, or a list of single character strings -# Either: -# "geom_point" (scatterplot) -# "geom_line" (coordinates plotted then line connection, from the lowest to highest x coordinates first and from the lowest to highest y coordinates thenafter) -# "geom_path" (coordinates plotted then line connection respecting the row order in data1) -# "geom_step" coordinates plotted then line connection respecting the row order in data1 but drawn in steps). See the geom.step.dir argument -# "geom_hline" (horizontal line, no x value provided) -# "geom_vline" (vertical line, no y value provided) -# "geom_stick" (dots as vertical bars) -# If data1 is a list, then geom must be either: -# (1) a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. -# (2) a single character string. In that case the same kind of plot will apply for the different compartments of the data1 list -# WARNING concerning "geom_hline" or "geom_vline": -# (1) x or y argument must be NULL, respectively -# (2) x.lim or y.lim argument must NOT be NULL, respectively, if only these kind of lines are drawn (if other geom present, then x.lim = NULL and y.lim = NULL will generate x.lim and y.lim defined by these other geom, which is not possible with "geom_hline" or "geom_vline" alone) -# (3) the function will draw n lines for n values in the x argument column name of the data1 data frame. If several colors required, the categ argument must be specified and the corresponding categ column name must exist in the data1 data frame with a different class name for each row -# geom.step.dir: single character string indicating the direction when using "geom_step" of the geom argument, or a list of single character strings -# Either: -# "vh" (vertical then horizontal) -# "hv" (horizontal then vertical) -# "mid" (step half-way between adjacent x-values) -# See https://ggplot2.tidyverse.org/reference/geom_path.html -# If data1 is a list, then geom.step.dir must be either: -# (1) a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. The value in compartments related to other geom values than "geom_step" will be ignored -# (2) a single character string, which will be used for all the "geom_step" values of the geom argument, whatever the data1 list -# geom.stick.base: either (1) NULL or (2) a single numeric value or (3) a list of single numeric values, setting the base of the sticks when using "geom_stick" of the geom argument -# If geom.stick.base is NULL, the bottom limit of the y-axis is taken as the base -# If data1 is a list, then geom.stick.base must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the values in compartments related to other geom values than "geom_stick" will be ignored. With a single value (latter possibility), the same base will be used for all the sticks, whatever the data1 list -# Warning: the y-axis limits are not modified by the value of geom.stick.base, meaning that this value can be outside of the range of y.lim. Add the value of geom.stick.base also in the y.lim argument if required -# Warning: if geom.stick.base is NULL, the bottom limit of the y-axis is taken as the base. Thus, be careful with inverted y-axis -# alpha: single numeric value (from 0 to 1) of transparency. If data1 is a list, then alpha must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. In that case the same transparency will apply for the different compartments of the data1 list -# dot.size: single numeric value of dot shape radius? in mm. If data1 is a list, then dot.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.size will be used for all the dots, whatever the data1 list -# dot.shape: value indicating the shape of the dots (see https://ggplot2.tidyverse.org/articles/ggplot2-specs.html) If data1 is a list, then dot.shape must be either (1) a list of single shape values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single shape value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.shape will be used for all the dots, whatever the data1 list -# dot.border.size: single numeric value of border dot width in mm. Write zero for no dot border. If data1 is a list, then dot.border.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.border.size will be used for all the dots, whatever the data1 list -# dot.border.color: single character color string defining the color of the dot border (same border color for all the dots, whatever their categories). If dot.border.color == NULL, the border color will be the same as the dot color. A single integer is also accepted instead of a character string, that will be processed by fun_gg_palette() -# line.size: single numeric value of line width in mm. If data1 is a list, then line.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to dots will be ignored. With a single value (latter possibility), the same line.size will be used for all the lines, whatever the data1 list -# line.type: value indicating the kind of lines (see https://ggplot2.tidyverse.org/articles/ggplot2-specs.html) If data1 is a list, then line.type must be either (1) a list of single line kind values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single line kind value. With a list (former possibility), the value in compartments related to dots will be ignored. With a single value (latter possibility), the same line.type will be used for all the lines, whatever the data1 list -# x.lim: 2 numeric values setting the x-axis range. Order of the 2 values matters (for inverted axis). If NULL, the range of the x column name of data1 will be used -# x.lab: a character string or expression for x-axis label. If NULL, will use the first value of x (x column name of the first data frame in data1). Warning message if the elements in x are different between data frames in data1 -# x.log: either "no", "log2" (values in the x column name of the data1 data frame will be log2 transformed and x-axis will be log2 scaled) or "log10" (values in the x column name of the data1 data frame will be log10 transformed and x-axis will be log10 scaled) -# x.tick.nb: approximate number of desired values labeling the x-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if x.log is "no", then the number of labeling values is set by ggplot2. If NULL and if x.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the x.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for x.lim = c(9, 1200)). WARNING: if non-NULL and if x.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) -# x.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if x.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$x.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks -# x.include.zero: logical. Does x.lim range include 0? Ignored if x.log is "log2" or "log10" -# x.left.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to x.lim. If different from 0, add the range of the axis multiplied by x.left.extra.margin (e.g., abs(x.lim[2] - x.lim[1]) * x.left.extra.margin) to the left of x-axis -# x.right.extra.margin: idem as x.left.extra.margin but to the right of x-axis -# x.text.angle: integer value of the text angle for the x-axis labeling values, using the same rules as in ggplot2. Use positive value for clockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Use negative values for counterclockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. -# y.lim: 2 numeric values setting the y-axis range. Order of the 2 values matters (for inverted axis). If NULL, the range of the y column name of data1 will be used -# y.lab: a character string or expression for y-axis label. If NULL, will use the first value of y (y column name of the first data frame in data1). Warning message if the elements in y are different between data frames in data1 -# y.log: either "no", "log2" (values in the y column name of the data1 data frame will be log2 transformed and y-axis will be log2 scaled) or "log10" (values in the y column name of the data1 data frame will be log10 transformed and y-axis will be log10 scaled) -# y.tick.nb: approximate number of desired values labeling the y-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if y.log is "no", then the number of labeling values is set by ggplot2. If NULL and if y.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the y.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for y.lim = c(9, 1200)). WARNING: if non-NULL and if y.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) -# y.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if y.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$y.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks -# y.include.zero: logical. Does y.lim range include 0? Ignored if y.log is "log2" or "log10" -# y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to y.lim. If different from 0, add the range of the axis multiplied by y.top.extra.margin (e.g., abs(y.lim[2] - y.lim[1]) * y.top.extra.margin) to the top of y-axis -# y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis -# y.text.angle: integer value of the text angle for the y-axis labeling values, using the same rules as in ggplot2. Use positive value for clockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Use negative values for counterclockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. -# raster: logical. Dots in raster mode? If FALSE, dots from each "geom_point" from geom argument are plotted in vectorial mode (bigger pdf and long to display if lots of dots). If TRUE, dots from each "geom_point" from geom argument are plotted in matricial mode (smaller pdf and easy display if lots of dots, but it takes time to generate the layer). If TRUE, the raster.ratio argument is used to avoid an ellipsoid representation of the dots. If TRUE, solve the transparency problem with some GUI. Overriden by the non-NULL raster.threshold argument -# raster.ratio: single numeric value indicating the height / width ratio of the graphic device used (for instance provided by the $dim compartment in the output of the fun_open() function). The default value is 1 because by default R opens a square graphic device. But this argument has to be set when using other device dimensions. Ignored if raster == FALSE -# raster.threshold: positive integer value indicating the limit of the dot number above which "geom_point" layers from the geom argument switch from vectorial mode to matricial mode (see the raster argument). If any layer is matricial, then the raster.ratio argument is used to avoid an ellipsoid representation of the dots. If non-NULL, it overrides the raster argument -# text.size: numeric value of the font size of the (1) axis numbers and axis legends and (2) texts in the graphic legend (in mm) -# title: character string of the graph title -# title.text.size: numeric value of the title font size in mm -# legend.show: logical. Show legend? Not considered if categ argument is NULL, because this already generate no legend, excepted if legend.width argument is non-NULL. In that specific case (categ is NULL, legend.show is TRUE and legend.width is non-NULL), an empty legend space is created. This can be useful when desiring graphs of exactly the same width, whatever they have legends or not -# legend.width: single proportion (between 0 and 1) indicating the relative width of the legend sector (on the right of the plot) relative to the width of the plot. Value 1 means that the window device width is split in 2, half for the plot and half for the legend. Value 0 means no room for the legend, which will overlay the plot region. Write NULL to inactivate the legend sector. In such case, ggplot2 will manage the room required for the legend display, meaning that the width of the plotting region can vary between graphs, depending on the text in the legend -# legend.name: character string of the legend title. If legend.name is NULL and categ argument is not NULL, then legend.name <- categ. If data1 is a list, then legend.name must be a list of character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL, and other not -# article: logical. If TRUE, use an article theme (article like). If FALSE, use a classic related ggplot theme. Use the add argument (e.g., add = "+ggplot2::theme_classic()" for the exact classic ggplot theme -# grid: logical. Draw lines in the background to better read the box values? Not considered if article == FALSE (grid systematically present) -# add: character string allowing to add more ggplot2 features (dots, lines, themes, facet, etc.). Ignored if NULL -# WARNING: (1) the string must start with "+", (2) the string must finish with ")" and (3) each function must be preceded by "ggplot2::". Example: "+ ggplot2::coord_flip() + ggplot2::theme_bw()" -# If the character string contains the "ggplot2::theme" string, then the article argument of fun_gg_scatter() (see above) is ignored with a warning -# Handle the add argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions -# WARNING: the call of objects inside the quotes of add can lead to an error if the name of these objects are some of the fun_gg_scatter() arguments. Indeed, the function will use the internal argument instead of the global environment object. Example article <- "a" in the working environment and add = '+ ggplot2::ggtitle(article)'. The risk here is to have TRUE as title. To solve this, use add = '+ ggplot2::ggtitle(get("article", envir = .GlobalEnv))' -# return: logical. Return the graph parameters? -# return.ggplot: logical. Return the ggplot object in the output list? Ignored if return argument is FALSE. WARNING: always assign the fun_gg_scatter() function (e.g., a <- fun_gg_scatter()) if return.ggplot argument is TRUE, otherwise, double plotting is performed. See $ggplot in the RETURN section below for more details -# return.gtable: logical. Return the ggplot object as gtable of grobs in the output list? Ignored if plot argument is FALSE. Indeed, the graph must be plotted to get the grobs dispositions. See $gtable in the RETURN section below for more details -# plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting -# warn.print: logical. Print warnings at the end of the execution? ? If FALSE, warning messages are never printed, but can still be recovered in the returned list. Some of the warning messages (those delivered by the internal ggplot2 functions) are not apparent when using the argument plot = FALSE -# lib.path: character string indicating the absolute path of the required packages (see below). if NULL, the function will use the R library default folders -# RETURN -# a scatter plot if plot argument is TRUE -# a list of the graph info if return argument is TRUE: -# $data: the initial data with graphic information added. WARNING: if the x.log or y.log argument is not "no", x or y argument column of the data1 data frame are log2 or log10 converted in $data, respectively. Use 2^values or 10^$values to recover the initial values -# $removed.row.nb: a list of the removed rows numbers in data frames (because of NA). NULL if no row removed -# $removed.rows: a list of the removed rows in data frames (because of NA). NULL if no row removed -# $plot: the graphic box and dot coordinates -# $dots: dot coordinates -# y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non-null or if y.log argument is different from "no") -# y.second.tick.values: values of secondary ticks. NULL except if y.second.tick.nb argument is non-null or if y.log argument is different from "no") -# $panel: the variable names used for the panels (NULL if no panels). WARNING: NA can be present according to ggplot2 upgrade to v3.3.0 -# $axes: the x-axis and y-axis info -# $warn: the warning messages. Use cat() for proper display. NULL if no warning. WARNING: warning messages delivered by the internal ggplot2 functions are not apparent when using the argument plot = FALSE -# $ggplot: ggplot object that can be used for reprint (use print($ggplot) or update (use $ggplot + ggplot2::...). NULL if return.ggplot argument is FALSE. Of note, a non-null $ggplot in the output list is sometimes annoying as the manipulation of this list prints the plot -# $gtable: gtable object that can be used for reprint (use gridExtra::grid.arrange(...$ggplot) or with additionnal grobs (see the grob decomposition in the examples). NULL if return.ggplot argument is FALSE. Contrary to $ggplot, a non-NULL $gtable in the output list is not annoying as the manipulation of this list does not print the plot -# REQUIRED PACKAGES -# ggplot2 -# gridExtra -# lemon (in case of use in the add argument) -# scales -# if raster plots are drawn (see the raster and raster.threshold arguments): -# Cairo -# grid -# REQUIRED FUNCTIONS FROM THE cute PACKAGE -# fun_gg_empty_graph() -# fun_gg_palette() -# fun_gg_point_rast() -# fun_pack() -# fun_check() -# fun_round() -# fun_scale() -# fun_inter_ticks() -# EXAMPLES -# set.seed(1) ; obs1 <- data.frame(Km = c(2, 1, 6, 5, 4, 7), Time = c(2, 1, 6, 5, 4, 7)^2, Car = c("TUUT", "TUUT", "TUUT", "WIIM", "WIIM", "WIIM"), Color1 = rep(c("coral", "lightblue"), each = 3), stringsAsFactors = TRUE) ; fun_gg_scatter(data1 = obs1, x = "Km", y = "Time") -# DEBUGGING -# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500), stringsAsFactors = TRUE) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500), stringsAsFactors = TRUE) ; set.seed(NULL) ; obs1$km[2:3] <- NA ; data1 = list(L1 = obs1, L2 = obs2) ; x = list(L1 = "km", L2 = "km") ; y = list(L1 = "time", L2 = "time") ; categ = list(L1 = "group1", L2 = "group2") ; categ = NULL ; categ.class.order = NULL ; color = NULL ; geom = "geom_point" ; geom.step.dir = "hv" ; geom.stick.base = NULL, alpha = 0.5 ; dot.size = 2 ; dot.shape = 21 ; dot.border.size = 0.5 ; dot.border.color = NULL ; line.size = 0.5 ; line.type = "solid" ; x.lim = NULL ; x.lab = NULL ; x.log = "no" ; x.tick.nb = NULL ; x.second.tick.nb = NULL ; x.include.zero = FALSE ; x.left.extra.margin = 0.05 ; x.right.extra.margin = 0.05 ; x.text.angle = 0 ; y.lim = NULL ; y.lab = NULL ; y.log = "no" ; y.tick.nb = NULL ; y.second.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0.05 ; y.text.angle = 0 ; raster = FALSE ; raster.ratio = 1 ; raster.threshold = NULL ; text.size = 12 ; title = "" ; title.text.size = 12 ; legend.show = TRUE ; legend.width = 0.5 ; legend.name = NULL ; article = TRUE ; grid = FALSE ; add = NULL ; return = FALSE ; return.ggplot = FALSE ; return.gtable = TRUE ; plot = TRUE ; warn.print = FALSE ; lib.path = NULL -# function name -function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") -arg.names <- names(formals(fun = sys.function(sys.parent(n = 2)))) # names of all the arguments -arg.user.setting <- as.list(match.call(expand.dots=FALSE))[-1] # list of the argument settings (excluding default values not provided by the user) -# end function name -# required function checking -req.function <- c( -"fun_check", -"fun_gg_just", -"fun_gg_empty_graph", -"fun_gg_palette", -"fun_gg_point_rast", -"fun_round", -"fun_pack", -"fun_scale", -"fun_inter_ticks" -) -tempo <- NULL -for(i1 in req.function){ -if(length(find(i1, mode = "function"))== 0L){ -tempo <- c(tempo, i1) -} -} -if( ! is.null(tempo)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nREQUIRED cute FUNCTION", ifelse(length(tempo) > 1, "S ARE", " IS"), " MISSING IN THE R ENVIRONMENT:\n", paste0(tempo, collapse = "()\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end required function checking -# reserved words to avoid bugs (used in this function) -reserved.words <- c("fake_x", "fake_y", "fake_categ") -# end reserved words to avoid bugs (used in this function) -# arg with no default values -mandat.args <- c( -"data1", -"x", -"y" -) -tempo <- eval(parse(text = paste0("missing(", paste0(mandat.args, collapse = ") | missing("), ")"))) -if(any(tempo)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nFOLLOWING ARGUMENT", ifelse(length(mandat.args) > 1, "S HAVE", "HAS"), " NO DEFAULT VALUE AND REQUIRE ONE:\n", paste0(mandat.args, collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end arg with no default values -# argument primary checking -arg.check <- NULL # -text.check <- NULL # -checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools -ee <- expression(arg.check <- c(arg.check, tempo$problem) , text.check <- c(text.check, tempo$text) , checked.arg.names <- c(checked.arg.names, tempo$object.name)) -tempo1 <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = data1, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OR A LIST OF DATA FRAMES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -if( ! is.null(x)){ -tempo1 <- fun_check(data = x, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = x, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(y)){ -tempo1 <- fun_check(data = y, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = y, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(categ)){ -tempo1 <- fun_check(data = categ, class = "vector", mode = "character", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = categ, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = categ, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(categ.class.order)){ -if(is.null(categ)){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT IS NOT NULL, BUT categ IS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = categ.class.order, class = "vector", mode = "character", fun.name = function.name) -tempo2 <- fun_check(data = categ.class.order, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A VECTOR OF CHARACTER STRINGS OR A LIST OF VECTOR OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = categ.class.order, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(legend.name)){ -tempo1 <- fun_check(data = legend.name, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = legend.name, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = legend.name, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(color)){ -tempo1 <- fun_check(data = color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = color, class = "factor", na.contain = TRUE, fun.name = function.name) -tempo3 <- fun_check(data = color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name) -tempo4 <- fun_check(data = color, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo4$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE & tempo4$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT MUST BE A VECTOR (OF CHARACTER STRINGS OR INTEGERS) OR A FACTOR OR A LIST OF THESE POSSIBILITIES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = color, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo1 <- fun_check(data = geom, class = "vector", mode = "character", na.contain = FALSE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = geom, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = geom.step.dir, options = c("vh", "hv", "mid"), na.contain = FALSE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = geom.step.dir, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT MUST BE A SINGLE CHARACTER STRING (\"vh\" OR \"hv\" OR \"mid\") OR A LIST OF THESE CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -if( ! is.null(geom.stick.base)){ -tempo1 <- fun_check(data = geom.stick.base, class = "vector", mode = "numeric", na.contain = FALSE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = color, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = geom.stick.base, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo1 <- fun_check(data = alpha, prop = TRUE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = alpha, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT MUST BE A SINGLE NUMERIC VALUE BETWEEN 0 AND 1 OR A LIST OF SUCH VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) -tempo2 <- fun_check(data = dot.size, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = dot.shape, class = "vector", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = dot.shape, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT MUST BE A SINGLE SHAPE VALUE OR A LIST OF SINGLE SHAPE VALUES (SEE https://ggplot2.tidyverse.org/articles/ggplot2-specs.html)") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) -tempo2 <- fun_check(data = dot.border.size, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -if( ! is.null(dot.border.color)){ -tempo1 <- fun_check(data = dot.border.color, class = "vector", mode = "character", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -# integer colors -> gg_palette -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color MUST BE A SINGLE CHARACTER STRING OF COLOR OR A SINGLE INTEGER VALUE") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.border.color, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo1 <- fun_check(data = line.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) -tempo2 <- fun_check(data = line.size, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = line.type, class = "vector", typeof = "integer", double.as.integer.allowed = FALSE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = line.type, class = "vector", mode = "character", length = 1, fun.name = function.name) -tempo3 <- fun_check(data = line.type, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo3$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT MUST BE A SINGLE LINE KIND VALUE OR A LIST OF SINGLE LINE KIND VALUES (SEE https://ggplot2.tidyverse.org/articles/ggplot2-specs.html)") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -if( ! is.null(x.lim)){ -tempo <- fun_check(data = x.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & any(x.lim %in% c(Inf, -Inf))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x.lim, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(x.lab)){ -if(all(class(x.lab) %in% "expression")){ # to deal with math symbols -tempo <- fun_check(data = x.lab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) -}else{ -tempo <- fun_check(data = x.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x.lab, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = x.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(x.tick.nb)){ -tempo <- fun_check(data = x.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & x.tick.nb < 0){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(x.second.tick.nb)){ -tempo <- fun_check(data = x.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & x.second.tick.nb <= 0){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x.second.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x.second.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = x.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = x.left.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = x.right.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = x.text.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) -if( ! is.null(y.lim)){ -tempo <- fun_check(data = y.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & any(y.lim %in% c(Inf, -Inf))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.lim, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(y.lab)){ -if(all(class(y.lab) %in% "expression")){ # to deal with math symbols -tempo <- fun_check(data = y.lab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) -}else{ -tempo <- fun_check(data = y.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.lab, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = y.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(y.tick.nb)){ -tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & y.tick.nb < 0){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(y.second.tick.nb)){ -tempo <- fun_check(data = y.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & y.second.tick.nb <= 0){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y.second.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.second.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y.text.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = raster, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = raster.ratio, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -if( ! is.null(raster.threshold)){ -tempo <- fun_check(data = raster.threshold, class = "vector", typeof = "integer", neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = raster.threshold, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = legend.show, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(legend.width)){ -tempo <- fun_check(data = legend.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = legend.width, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = article, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(add)){ -tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = add, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = return.ggplot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = return.gtable, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(lib.path)){ -tempo <- fun_check(data = lib.path, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if( ! all(dir.exists(lib.path))){ # separation to avoid the problem of tempo$problem == FALSE and lib.path == NA -tempo.cat <- paste0("ERROR IN ", function.name, ": DIRECTORY PATH INDICATED IN THE lib.path ARGUMENT DOES NOT EXISTS:\n", paste(lib.path, collapse = "\n")) -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = lib.path, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if(any(arg.check) == TRUE){ -stop(paste0("\n\n================\n\n", paste(text.check[arg.check], collapse = "\n"), "\n\n================\n\n"), call. = FALSE) # -} -# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.7/r_debugging_tools-v1.7.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() -# end argument primary checking - - -# second round of checking and data preparation -# management of NA arguments -tempo.arg <- names(arg.user.setting) # values provided by the user -tempo.log <- suppressWarnings(sapply(lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.na), FUN = any)) & lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = length)== 1L # no argument provided by the user can be just NA -if(any(tempo.log) == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT JUST BE NA") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end management of NA arguments -# management of NULL arguments -tempo.arg <-c( -"data1", -# "x", # inactivated because of hline or vline -# "y", # inactivated because of hline or vline -"geom", -"geom.step.dir", -# "geom.stick.base", # inactivated because can be null -"alpha", -"dot.size", -"dot.shape", -"dot.border.size", -"line.size", -"line.type", -"x.log", -"x.include.zero", -"x.left.extra.margin", -"x.right.extra.margin", -"x.text.angle", -"y.log", -"y.include.zero", -"y.top.extra.margin", -"y.bottom.extra.margin", -"y.text.angle", -"raster", -"raster.ratio", -"text.size", -"title", -"title.text.size", -"legend.show", -# "legend.width", # inactivated because can be null -"article", -"grid", -"return", -"return.ggplot", -"return.gtable", -"plot", -"warn.print" -) -tempo.log <- sapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.null) -if(any(tempo.log) == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT BE NULL") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end management of NULL arguments -# code that protects set.seed() in the global environment -# end code that protects set.seed() in the global environment -# warning initiation -ini.warning.length <- options()$warning.length -options(warning.length = 8170) -warn <- NULL -warn.count <- 0 -# end warning initiation -# other checkings -# check list lengths (and names of data1 compartments if present) -list.color <- NULL -list.geom <- NULL -list.geom.step.dir <- NULL -list.geom.stick.base <- NULL -list.alpha <- NULL -list.dot.size <- NULL -list.dot.shape <- NULL -list.dot.border.size <- NULL -list.dot.border.color <- NULL -list.line.size <- NULL -list.line.type <- NULL -if(all(class(data1) == "list")){ -if(length(data1) > 6){ -tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A LIST OF 6 DATA FRAMES MAXIMUM (6 OVERLAYS MAX)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(is.null(names(data1))){ -names(data1) <- paste0("L", 1:length(data1)) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL NAME COMPARTMENT OF data1 LIST -> NAMES RESPECTIVELY ATTRIBUTED TO EACH COMPARTMENT:\n", paste(names(data1), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -if( ! is.null(x)){ -if( ! (all(class(x) == "list") & length(data1) == length(x))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -}else{ -x <- vector("list", length(data1)) -} -if( ! is.null(y)){ -if( ! (all(class(y) == "list") & length(data1) == length(y))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -}else{ -y <- vector("list", length(data1)) -} -if( ! is.null(categ)){ -if( ! (all(class(categ) == "list") & length(data1) == length(categ))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if( ! is.null(categ.class.order)){ -if( ! (all(class(categ.class.order) == "list") & length(data1) == length(categ.class.order))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if( ! is.null(color)){ -if( ! ((all(class(color) == "list") & length(data1) == length(color)) | ((all(mode(color) == "character") | all(mode(color) == "numeric")) & length(color)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER STRING OR INTEGER") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if((all(mode(color) == "character") | all(mode(color) == "numeric")) & length(color)== 1L){ # convert the single value into a list of single value -list.color <- vector(mode = "list", length = length(data1)) -list.color[] <- color -} -} -if( ! ((all(class(geom) == "list") & length(data1) == length(geom)) | (all(mode(geom) == "character") & length(geom)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(geom) == "character") & length(geom)== 1L){ # convert the single value into a list of single value -list.geom <- vector(mode = "list", length = length(data1)) -list.geom[] <- geom -} -if( ! ((all(class(geom.step.dir) == "list") & length(data1) == length(geom.step.dir)) | (all(mode(geom.step.dir) == "character") & length(geom.step.dir)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(geom.step.dir) == "character") & length(geom.step.dir)== 1L){ # convert the single value into a list of single value -list.geom.step.dir <- vector(mode = "list", length = length(data1)) -list.geom.step.dir[] <- geom.step.dir -} -if( ! is.null(geom.stick.base)){ -if( ! ((all(class(geom.stick.base) == "list") & length(data1) == length(geom.stick.base)) | (all(mode(geom.stick.base) == "numeric") & length(geom.stick.base)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(geom.stick.base) == "numeric") & length(geom.stick.base)== 1L){ # convert the single value into a list of single value -list.geom.stick.base <- vector(mode = "list", length = length(data1)) -list.geom.stick.base[] <- geom.stick.base -} -} -if( ! ((all(class(alpha) == "list") & length(data1) == length(alpha)) | (all(mode(alpha) == "numeric") & length(alpha)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(alpha) == "numeric") & length(alpha)== 1L){ # convert the single value into a list of single value -list.alpha <- vector(mode = "list", length = length(data1)) -list.alpha[] <- alpha -} -if( ! ((all(class(dot.size) == "list") & length(data1) == length(dot.size)) | (all(mode(dot.size) == "numeric") & length(dot.size)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(dot.size) == "numeric") & length(dot.size)== 1L){ # convert the single value into a list of single value -list.dot.size <- vector(mode = "list", length = length(data1)) -list.dot.size[] <- dot.size -} -if( ! ((all(class(dot.shape) == "list") & length(data1) == length(dot.shape)) | (all(mode(dot.shape) != "list") & length(dot.shape)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE SHAPE VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(dot.shape) != "list") & length(dot.shape)== 1L){ # convert the single value into a list of single value -list.dot.shape <- vector(mode = "list", length = length(data1)) -list.dot.shape[] <- dot.shape -} -if( ! ((all(class(dot.border.size) == "list") & length(data1) == length(dot.border.size)) | (all(mode(dot.border.size) == "numeric") & length(dot.border.size)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(dot.border.size) == "numeric") & length(dot.border.size)== 1L){ # convert the single value into a list of single value -list.dot.border.size <- vector(mode = "list", length = length(data1)) -list.dot.border.size[] <- dot.border.size -} -if( ! is.null(dot.border.color)){ -if( ! ((all(class(dot.border.color) == "list") & length(data1) == length(dot.border.color)) | ((all(mode(dot.border.color) == "character") | all(mode(dot.border.color) == "numeric")) & length(dot.border.color)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER STRING OR INTEGER") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if((all(mode(dot.border.color) == "character") | all(mode(dot.border.color) == "numeric")) & length(dot.border.color)== 1L){ # convert the single value into a list of single value -list.dot.border.color <- vector(mode = "list", length = length(data1)) -list.dot.border.color[] <- dot.border.color -} -} -if( ! ((all(class(line.size) == "list") & length(data1) == length(line.size)) | (all(mode(line.size) == "numeric") & length(line.size)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(line.size) == "numeric") & length(line.size)== 1L){ # convert the single value into a list of single value -list.line.size <- vector(mode = "list", length = length(data1)) -list.line.size[] <- line.size -} -if( ! ((all(class(line.type) == "list") & length(data1) == length(line.type)) | (all(mode(line.type) != "list") & length(line.type)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE LINE KIND VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(line.type) != "list") & length(line.type)== 1L){ # convert the single value into a list of single value -list.line.type <- vector(mode = "list", length = length(data1)) -list.line.type[] <- line.type -} -if( ! is.null(legend.name)){ -if( ! (all(class(legend.name) == "list") & length(data1) == length(legend.name))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -} -# end check list lengths (and names of data1 compartments if present) -# conversion into lists -if(all(is.data.frame(data1))){ -data1 <- list(L1 = data1) -if(all(class(x) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -x <- list(L1 = x) -} -if(all(class(y) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -y <- list(L1 = y) -} -if( ! is.null(categ)){ -if(all(class(categ) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -categ <- list(L1 = categ) -} -} -if( ! is.null(categ.class.order)){ -if(all(class(categ.class.order) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -categ.class.order <- list(L1 = categ.class.order) -} -} -if( ! is.null(color)){ -if(all(class(color) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -color <- list(L1 = color) -} -} -if(all(class(geom) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -geom <- list(L1 = geom) -} -if(all(class(geom.step.dir) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -geom.step.dir <- list(L1 = geom.step.dir) -} -if( ! is.null(geom.stick.base)){ -if(all(class(geom.stick.base) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -geom.stick.base <- list(L1 = geom.stick.base) -} -} -if(all(class(alpha) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -alpha <- list(L1 = alpha) -} -if(all(class(dot.size) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -dot.size <- list(L1 = dot.size) -} -if(all(class(dot.shape) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -dot.shape <- list(L1 = dot.shape) -} -if(all(class(dot.border.size) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -dot.border.size <- list(L1 = dot.border.size) -} -if( ! is.null(dot.border.color)){ -if(all(class(dot.border.color) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -dot.border.color <- list(L1 = dot.border.color) -} -} -if(all(class(line.size) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -line.size <- list(L1 = line.size) -} -if(all(class(line.type) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -line.type <- list(L1 = line.type) -} -if( ! is.null(legend.name)){ -if(all(class(legend.name) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -legend.name <- list(L1 = legend.name) -} -} -}else if( ! all(sapply(data1, FUN = "class") == "data.frame")){ # if not a data frame, data1 can only be a list, as tested above -tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OR A LIST OF DATA FRAMES") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -# single value converted into list now reattributed to the argument name -if( ! is.null(color)){ -if( ! is.null(list.color)){ -color <- list.color -} -} -if( ! is.null(list.geom)){ -geom <- list.geom -} -if( ! is.null(list.geom.step.dir)){ -geom.step.dir <- list.geom.step.dir -} -if( ! is.null(geom.stick.base)){ -if( ! is.null(list.geom.stick.base)){ -geom.stick.base <- list.geom.stick.base -} -} -if( ! is.null(list.alpha)){ -alpha <- list.alpha -} -if( ! is.null(list.dot.size)){ -dot.size <- list.dot.size -} -if( ! is.null(list.dot.shape)){ -dot.shape <- list.dot.shape -} -if( ! is.null(list.dot.border.size)){ -dot.border.size <- list.dot.border.size -} -if( ! is.null(dot.border.color)){ -if( ! is.null(list.dot.border.color)){ -dot.border.color <- list.dot.border.color -} -} -if( ! is.null(list.line.size)){ -line.size <- list.line.size -} -if( ! is.null(list.line.type)){ -line.type <- list.line.type -} -# end single value converted into list now reattributed to the argument name -# data, x, y, geom, alpha, dot.size, shape, dot.border.size, line.size, line.type, legend.name are list now -# if non-null, categ, categ.class.order, legend.name, color, dot.border.color are list now -# end conversion into lists -# verif of add -if( ! is.null(add)){ -if( ! grepl(pattern = "^\\s*\\+", add)){ # check that the add string start by + -tempo.cat <- paste0("ERROR IN ", function.name, ": add ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) - -}else if( ! grepl(pattern = "(ggplot2|lemon)\\s*::", add)){ # -tempo.cat <- paste0("ERROR IN ", function.name, ": FOR EASIER FUNCTION DETECTION, add ARGUMENT MUST CONTAIN \"ggplot2::\" OR \"lemon::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if( ! grepl(pattern = ")\\s*$", add)){ # check that the add string finished by ) -tempo.cat <- paste0("ERROR IN ", function.name, ": add ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -# end verif of add -# management of add containing facet -facet.categ <- NULL -if( ! is.null(add)){ -facet.check <- TRUE -tempo <- unlist(strsplit(x = add, split = "\\s*\\+\\s*(ggplot2|lemon)\\s*::\\s*")) # -tempo <- sub(x = tempo, pattern = "^facet_wrap", replacement = "ggplot2::facet_wrap") -tempo <- sub(x = tempo, pattern = "^facet_grid", replacement = "ggplot2::facet_grid") -tempo <- sub(x = tempo, pattern = "^facet_rep", replacement = "lemon::facet_rep") -if(length(data1) > 1 & (any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")) | grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid"))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nfacet PANELS CANNOT BE USED IF MORE THAN ONE DATA FRAME IN THE data1 ARGUMENT\nPLEASE REWRITE THE add STRING AND RERUN") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -if(any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap"))){ -tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")]))) -facet.categ <- list(names(tempo1$params$facets)) # list of length 1 -tempo.text <- "facet_wrap OR facet_rep_wrap" -facet.check <- FALSE -}else if(grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")){ -tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")]))) -facet.categ <- list(c(names(tempo1$params$rows), names(tempo1$params$cols))) # list of length 1 -tempo.text <- "facet_grid OR facet_rep_grid" -facet.check <- FALSE -} -if(facet.check == FALSE & ! all(facet.categ %in% names(data1[[1]]))){ # WARNING: all(facet.categ %in% names(data1)) is TRUE when facet.categ is NULL -tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF \"", tempo.text, "\" STRING IN THE add ARGUMENT BUT PROBLEM OF VARIABLE DETECTION (COLUMN NAMES OF data1)\nTHE DETECTED VARIABLES ARE:\n", paste(facet.categ, collapse = " "), "\nTHE data1 COLUMN NAMES ARE:\n", paste(names(data1[[1]]), collapse = " "), "\nPLEASE REWRITE THE add STRING AND RERUN") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -} -# if facet.categ is not NULL, it is a list of length 1 now -# end management of add containing facet -# legend name filling -if(is.null(legend.name) & ! is.null(categ)){ -legend.name <- categ -}else if(is.null(legend.name) & is.null(categ)){ -legend.name <- vector("list", length(data1)) # null list -} -# legend.name not NULL anymore (list) -# end legend name filling -# ini categ for legend display -fin.lg.disp <- vector("list", 6) # will be used at the end to display or not legends -fin.lg.disp[] <- FALSE -legend.disp <- vector("list", length(data1)) -if(is.null(categ) | legend.show == FALSE){ -legend.disp[] <- FALSE -}else{ -for(i2 in 1:length(data1)){ -if(is.null(categ[[i2]])){ -legend.disp[[i2]] <- FALSE -}else{ -legend.disp[[i2]] <- TRUE -} -} -} -# end ini categ for legend display -# integer colors into gg_palette -tempo.check.color <- NULL -for(i1 in 1:length(data1)){ -if(any(is.na(color[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), ": color ARGUMENT CANNOT CONTAIN NA") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo.check.color <- c(tempo.check.color, fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem) -} -tempo.check.color <- ! tempo.check.color # invert TRUE and FALSE because if integer, then problem = FALSE -if(any(tempo.check.color == TRUE)){ # convert integers into colors -tempo.integer <- unlist(color[tempo.check.color]) -tempo.color <- fun_gg_palette(max(tempo.integer, na.rm = TRUE)) -for(i1 in 1:length(data1)){ -if(tempo.check.color[i1] == TRUE){ -color[[i1]] <-tempo.color[color[[i1]]] -} -} -} -# end integer colors into gg_palette -# loop (checking inside list compartment) -compart.null.color <- 0 # will be used to attribute a color when color is non-null but a compartment of color is NULL -data1.ini <- data1 # to report NA removal -removed.row.nb <- vector("list", length = length(data1)) # to report NA removal. Contains NULL -removed.rows <- vector("list", length = length(data1)) # to report NA removal. Contains NULL -for(i1 in 1:length(data1)){ -tempo <- fun_check(data = data1[[i1]], data.name = ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "data.frame", na.contain = TRUE, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -# reserved word checking -if(any(names(data1[[i1]]) %in% reserved.words)){ # I do not use fun_name_change() because cannot control y before creating "fake_y". But ok because reserved are not that common -tempo.cat <- paste0("ERROR IN ", function.name, ": COLUMN NAMES OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " ARGUMENT CANNOT BE ONE OF THESE WORDS\n", paste(reserved.words, collapse = " "), "\nTHESE ARE RESERVED FOR THE ", function.name, " FUNCTION") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if( ! (is.null(add))){ -if(any(sapply(X = reserved.words, FUN = grepl, x = add))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF COLUMN NAMES OF data1 IN THE add ARGUMENT STRING, THAT CORRESPOND TO RESERVED STRINGS FOR ", function.name, "\nFOLLOWING COLUMN NAMES HAVE TO BE CHANGED:\n", paste(arg.names[sapply(X = reserved.words, FUN = grepl, x = add)], collapse = "\n"), "\nFOR INFORMATION, THE RESERVED WORDS ARE:\n", paste(reserved.words, collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(any(sapply(X = arg.names, FUN = grepl, x = add))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NAMES OF ", function.name, " ARGUMENTS DETECTED IN THE add STRING:\n", paste(arg.names[sapply(X = arg.names, FUN = grepl, x = add)], collapse = "\n"), "\nRISK OF WRONG OBJECT USAGE INSIDE ", function.name) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end reserved word checking -# check of geom now because required for y argument -tempo <- fun_check(data = geom[[i1]], data.name = ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), options = c("geom_point", "geom_line", "geom_path", "geom_step", "geom_hline", "geom_vline", "geom_stick"), length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(geom[[i1]] == "geom_step" & is.null(geom.step.dir[[i1]])){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(geom.step.dir)== 1L, "geom.step.dir", paste0("ELEMENT ", i1, " OF geom.step.dir ARGUMENT")), ": geom.step.dir ARGUMENT CANNOT BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("ELEMENT ", i1, " OF geom")), " ARGUMENT IS \"geom_step\"\nHERE geom.step.dir ARGUMENT IS: ", paste(geom.step.dir[[i1]], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(geom[[i1]] == "geom_step" & ! is.null(geom.step.dir[[i1]])){ -tempo <- fun_check(data = geom.step.dir[[i1]], data.name = ifelse(length(geom.step.dir)== 1L, "geom.step.dir", paste0("geom.step.dir NUMBER ", i1)), options = c("vh", "hv", "mid"), length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if( ! (is.null(geom.stick.base))){ -if(geom[[i1]] == "geom_stick" & ! is.null(geom.stick.base[[i1]])){ -tempo <- fun_check(data = geom.stick.base[[i1]], data.name = ifelse(length(geom.stick.base)== 1L, "geom.stick.base", paste0("geom.stick.base NUMBER ", i1)), mode = "numeric", length = 1, na.contain = FALSE, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -} -# end check of geom now because required for y argument -if(is.null(x[[i1]])){ -if(all(geom[[i1]] != "geom_hline")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": x ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom)== 1L, "x", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -x[[i1]] <- "fake_x" -data1[[i1]] <- cbind(data1[[i1]], fake_x = NA, stringsAsFactors = TRUE) -data1[[i1]][, "fake_x"] <- as.numeric(data1[[i1]][, "fake_x"]) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", NAMED \"fake_x\" FOR FINAL DRAWING") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else{ -if(all(geom[[i1]] == "geom_hline")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": x ARGUMENT MUST BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo <- fun_check(data = x[[i1]], data.name = ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), class = "vector", mode = "character", length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(is.null(y[[i1]])){ -if(all(geom[[i1]] != "geom_vline")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": y ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom)== 1L, "y", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -y[[i1]] <- "fake_y" -data1[[i1]] <- cbind(data1[[i1]], fake_y = NA, stringsAsFactors = TRUE) -data1[[i1]][, "fake_y"] <- as.numeric(data1[[i1]][, "fake_y"]) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", NAMED \"fake_y\" FOR FINAL DRAWING") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else{ -if(all(geom[[i1]] == "geom_vline")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": y ARGUMENT MUST BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo <- fun_check(data = y[[i1]], data.name = ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), class = "vector", mode = "character", length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -# x[[i1]] and y[[i1]] not NULL anymore -if( ! (x[[i1]] %in% names(data1[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(x[[i1]], collapse = " ")))) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if( ! (y[[i1]] %in% names(data1[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(y[[i1]], collapse = " ")))) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo <- fun_check(data = data1[[i1]][, x[[i1]]], data.name = ifelse(length(x)== 1L, "x ARGUMENT (AS COLUMN NAME OF data1 DATA FRAME)", paste0("ELEMENT ", i1, " OF x ARGUMENT", " (AS COLUMN NAME OF data1 DATA FRAME NUMBER ", i1, ")")), class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo <- fun_check(data = data1[[i1]][, y[[i1]]], data.name = ifelse(length(y)== 1L, "y ARGUMENT (AS COLUMN NAME OF data1 DATA FRAME)", paste0("ELEMENT ", i1, " OF y ARGUMENT", " (AS COLUMN NAME OF data1 DATA FRAME NUMBER ", i1, ")")), class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(x[[i1]] == "fake_x" & y[[i1]] == "fake_y"){ # because the code cannot accept to be both "fake_x" and "fake_y" at the same time -tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 2\nTHE CODE CANNOT ACCEPT x AND y TO BE \"fake_x\" AND \"fake_y\" IN THE SAME DATA FRAME ", i1, " ") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} - -if(( ! is.null(categ)) & ( ! is.null(categ[[i1]]))){ # is.null(categ[[i1]]) works even if categ is NULL # is.null(categ[[i1]]) works even if categ is NULL # if categ[[i1]] = NULL, fake_categ will be created later on -tempo <- fun_check(data = categ[[i1]], data.name = ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")),, class = "vector", mode = "character", length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if( ! (categ[[i1]] %in% names(data1[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(categ[[i1]], collapse = " ")))) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo1 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "factor", na.contain = TRUE, fun.name = function.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " MUST BE A FACTOR OR CHARACTER VECTOR") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(tempo1$problem == FALSE){ -data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) - -} -if(geom[[i1]] == "geom_vline" | geom[[i1]] == "geom_hline"){ -if(length(unique(data1[[i1]][, categ[[i1]]])) != nrow(data1[[i1]])){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(geom)== 1L, "geom OF data1 ARGUMENT", paste0("geom NUMBER ", i1, " OF DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " ARGUMENT IS ", geom[[i1]], ", MEANING THAT ", ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " MUST HAVE A DIFFERENT CLASS PER LINE OF data1 (ONE x VALUE PER CLASS)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -}else if(( ! is.null(categ)) & is.null(categ[[i1]])){ # is.null(categ[[i1]]) works even if categ is NULL # if categ[[i1]] = NULL, fake_categ will be created. WARNING: is.null(categ[[i1]]) means no legend display (see above), because categ has not been precised. This also means a single color for data1[[i1]] -if(length(color[[i1]]) > 1){ # 0 means is.null(color[[i1]]) or is.null(color) and 1 is ok -> single color for data1[[i1]] -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT BUT CORRESPONDING COLORS IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " HAS LENGTH OVER 1\n", paste(color[[i1]], collapse = " "), "\nWHICH IS NOT COMPATIBLE WITH NULL CATEG -> COLOR RESET TO A SINGLE COLOR") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -color[i1] <- list(NULL) # will provide a single color below # Warning color[[i1]] <- NULL removes the compartment -} -categ[[i1]] <- "fake_categ" -data1[[i1]] <- cbind(data1[[i1]], fake_categ = "", stringsAsFactors = TRUE) -# inactivated because give a different color to different "Line_" categ while a single color for all the data1[[i1]] required. Thus, put back after the color management -# if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ -# data1[[i1]][, "fake_categ"] <- paste0("Line_", 1:nrow(data1[[i1]])) -# }else{ -data1[[i1]][, "fake_categ"] <- data1[[i1]][, "fake_categ"] # as.numeric("") create a vector of NA but class numeric -# } -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT -> FOR DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT:", paste0("NUMBER ", i1, " OF data1 ARGUMENT:")), "\n- FAKE \"fake_categ\" COLUMN ADDED FILLED WITH \"\"(OR WITH \"Line_...\" FOR LINES)\n- SINGLE COLOR USED FOR PLOTTING\n- NO LEGEND DISPLAYED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# OK: if categ is not NULL, all the non-null categ columns of data1 are factors from here - -# management of log scale and Inf removal -if(x[[i1]] != "fake_x"){ -if(any(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN ", ifelse(length(categ)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(y[[i1]] != "fake_y"){ -if(any(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN ", ifelse(length(categ)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# log conversion -if(x.log != "no"){ -tempo1 <- ! is.finite(data1[[i1]][, x[[i1]]]) # where are initial NA and Inf -data1[[i1]][, x[[i1]]] <- suppressWarnings(get(x.log)(data1[[i1]][, x[[i1]]]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -if(any( ! (tempo1 | is.finite(data1[[i1]][, x[[i1]]])))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN ", ifelse(length(categ)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(y.log != "no"){ -tempo1 <- ! is.finite(data1[[i1]][, y[[i1]]]) # where are initial NA and Inf -data1[[i1]][, y[[i1]]] <- suppressWarnings(get(y.log)(data1[[i1]][, y[[i1]]]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -if(any( ! (tempo1 | is.finite(data1[[i1]][, y[[i1]]])))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN ", ifelse(length(categ)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# Inf removal -# removed.row.nb[[i1]] <- NULL # already NULL and Warning this removes the compartment -removed.rows[[i1]] <- data.frame(stringsAsFactors = FALSE) -if(any(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])) detects only Inf -removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], which(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))) -} -if(any(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])) detects only Inf -removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], which(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))) -} -if( ! is.null(removed.row.nb[[i1]])){ -removed.row.nb[[i1]] <- unique(removed.row.nb[[i1]]) # to remove the duplicated positions (NA in both x and y) -removed.rows[[i1]] <- rbind(removed.rows[[i1]], data1.ini[[i1]][removed.row.nb[[i1]], ]) # here data1.ini used to have the y = O rows that will be removed because of Inf creation after log transformation -data1[[i1]] <- data1[[i1]][-removed.row.nb[[i1]], ] -data1.ini[[i1]] <- data1.ini[[i1]][-removed.row.nb[[i1]], ] # -} -# From here, data1 and data.ini have no more Inf -# end Inf removal -# x.lim and y.lim dealt later on, after the end f the loop -# end management of log scale and Inf removal -# management of log scale -if(x.log != "no"){ -data1[[i1]][, x[[i1]]] <- suppressWarnings(get(x.log)(data1[[i1]][, x[[i1]]])) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -} -if(y.log != "no"){ -data1[[i1]][, y[[i1]]] <- suppressWarnings(get(y.log)(data1[[i1]][, y[[i1]]])) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -} -# end management of log scale -# na detection and removal -column.check <- unique(unlist(c( # unlist because creates a list -if(x[[i1]] == "fake_x"){NULL}else{x[[i1]]}, -if(y[[i1]] == "fake_y"){NULL}else{y[[i1]]}, -if( ! is.null(categ)){if(is.null(categ[[i1]])){NULL}else{categ[[i1]]}}, -if( ! is.null(facet.categ)){if(is.null(facet.categ[[i1]])){NULL}else{facet.categ[[i1]]}} -))) # dot.categ because can be a 3rd column of data1 -if(any(is.na(data1[[i1]][, column.check]))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS ", paste(column.check, collapse = " "), " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -for(i3 in 1:length(column.check)){ -if(any(is.na(data1[[i1]][, column.check[i3]]))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i3], " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT"))) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -tempo <- unique(unlist(lapply(lapply(c(data1[[i1]][column.check]), FUN = is.na), FUN = which))) -removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], tempo) -removed.rows[[i1]] <- rbind(removed.rows[[i1]], data1.ini[[i1]][tempo, ]) # # tempo used because removed.row.nb is not empty. Here data1.ini used to have the non NA rows that will be removed because of NAN creation after log transformation (neg values for instance) -column.check <- column.check[ ! (column.check == x[[i1]] | column.check == y[[i1]])] # remove x and y to keep quali columns -if(length(tempo) != 0){ -data1[[i1]] <- data1[[i1]][-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former -data1.ini[[i1]] <- data1.ini[[i1]][-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers than the former -for(i4 in 1:length(column.check)){ -if(any( ! unique(removed.rows[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]]))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i4], " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA REMOVAL\n(IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[[i1]][, column.check[i4]])[ ! unique(removed.rows[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]])], collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -tempo.levels <- levels(data1[[i1]][, column.check[i4]])[levels(data1[[i1]][, column.check[i4]]) %in% unique(as.character(data1[[i1]][, column.check[i4]]))] -data1[[i1]][, column.check[i4]] <- factor(as.character(data1[[i1]][, column.check[i4]]), levels = tempo.levels) -if(column.check[i4] %in% categ[[i1]] & ! is.null(categ.class.order)){ -categ.class.order[[i1]] <- levels(data1[[i1]][, column.check[i4]])[levels(data1[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]])] # remove the absent class in the categ.class.order vector -data1[[i1]][, column.check[i4]] <- factor(as.character(data1[[i1]][, column.check[i4]]), levels = unique(categ.class.order[[i1]])) -} -} -} -} -} -# end na detection and removal -# From here, data1 and data.ini have no more NA or NaN in x, y, categ (if categ != NULL) and facet.categ (if categ != NULL) -if( ! is.null(categ.class.order)){ -# the following check will be done several times but I prefer to keep it here, after the creation of categ -if(is.null(categ[[i1]]) & ! is.null(categ.class.order[[i1]])){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ ARGUMENT CANNOT BE NULL IF COMPARTMENT ", i1, " OF categ.class.order ARGUMENT IS NOT NULL: ", paste(categ.class.order, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -if(is.null(categ.class.order[[i1]])){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE categ.class.order COMPARTMENT ", i1, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -data1[[i1]][, categ[[i1]]] <- factor(as.character(data1[[i1]][, categ[[i1]]])) # if already a factor, change nothing, if characters, levels according to alphabetical order -categ.class.order[[i1]] <- levels(data1[[i1]][, categ[[i1]]]) # character vector that will be used later -}else{ -tempo <- fun_check(data = categ.class.order[[i1]], data.name = paste0("COMPARTMENT ", i1 , " OF categ.class.order ARGUMENT"), class = "vector", mode = "character", length = length(levels(data1[[i1]][, categ[[i1]]])), fun.name = function.name) # length(data1[, categ[i1]) -> if data1[, categ[i1] was initially character vector, then conversion as factor after the NA removal, thus class number ok. If data1[, categ[i1] was initially factor, no modification after the NA removal, thus class number ok -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(any(duplicated(categ.class.order[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i1]], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if( ! (all(categ.class.order[[i1]] %in% unique(data1[[i1]][, categ[[i1]]])) & all(unique(data1[[i1]][, categ[[i1]]]) %in% categ.class.order[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ.class.order ARGUMENT MUST BE CLASSES OF COMPARTMENT ", i1, " OF categ ARGUMENT\nHERE IT IS:\n", paste(categ.class.order[[i1]], collapse = " "), "\nFOR COMPARTMENT ", i1, " OF categ.class.order AND IT IS:\n", paste(unique(data1[[i1]][, categ[[i1]]]), collapse = " "), "\nFOR COLUMN ", categ[[i1]], " OF data1 NUMBER ", i1) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]], levels = categ.class.order[[i1]]) # reorder the factor -} -names(categ.class.order)[i1] <- categ[[i1]] -} -} -# OK: if categ.class.order is not NULL, all the NULL categ.class.order columns of data1 are character from here - -if( ! is.null(legend.name[[i1]])){ -tempo <- fun_check(data = legend.name[[i1]], data.name = ifelse(length(legend.name)== 1L, "legend.name", paste0("legend.name NUMBER ", i1)),, class = "vector", mode = "character", length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if( ! is.null(color)){ # if color is NULL, will be filled later on -# check the nature of color -if(is.null(color[[i1]])){ -compart.null.color <- compart.null.color + 1 -color[[i1]] <- grey(compart.null.color / 8) # cannot be more than 7 overlays. Thus 7 different greys. 8/8 is excluded because white dots -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL COLOR IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " ASSOCIATED TO ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", SINGLE COLOR ", paste(color[[i1]], collapse = " "), " HAS BEEN ATTRIBUTED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -tempo1 <- fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) # na.contain = TRUE in case of colum of data1 -tempo2 <- fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "factor", na.contain = TRUE, fun.name = function.name) # idem -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR") # integer possible because dealt above -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if( ! (all(color[[i1]] %in% colors() | grepl(pattern = "^#", color[[i1]])))){ # check that all strings of low.color start by # -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(color[[i1]]), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(any(is.na(color[[i1]]))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), ", THE COLORS:\n", paste(unique(color[[i1]]), collapse = " "), "\nCONTAINS NA") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# end check the nature of color -# check the length of color -if(is.null(categ) & length(color[[i1]]) != 1){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A SINGLE COLOR IF categ IS NULL") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if( ! is.null(categ)){ -# No problem of NA management by ggplot2 because already removed -if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A SINGLE COLOR IF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IS NULL") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(length(color[[i1]]) == length(unique(data1[[i1]][, categ[[i1]]]))){ # here length(color) is equal to the different number of categ -data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE FOLLOWING COLORS:\n", paste(color[[i1]], collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else if(length(color[[i1]]) == length(data1[[i1]][, categ[[i1]]])){# here length(color) is equal to nrow(data1[[i1]]) -> Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) -data1[[i1]] <- cbind(data1[[i1]], color = color[[i1]], stringsAsFactors = TRUE) -tempo.check <- unique(data1[[i1]][ , c(categ[[i1]], "color")]) -if( ! (nrow(data1[[i1]]) == length(color[[i1]]) & nrow(tempo.check) == length(unique(data1[[i1]][ , categ[[i1]]])))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color")), " ARGUMENT HAS THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF THIS categ:\n", paste(unique(mapply(FUN = "paste", data1[[i1]][ ,categ[[i1]]], data1[[i1]][ ,"color"])), collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order -color[[i1]] <- unique(color[[i1]][order(data1[[i1]][, categ[[i1]]])]) # Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count, ") FROM FUNCTION ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " HAS THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " COLUMN VALUES\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ AS:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\n", paste(color[[i1]], collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else if(length(color[[i1]])== 1L){ -data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order -color[[i1]] <- rep(color[[i1]], length(levels(data1[[i1]][, categ[[i1]]]))) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", COLOR HAS LENGTH 1 MEANING THAT ALL THE DIFFERENT CLASSES OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), "\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(color[[i1]], collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE\n(1) LENGTH 1\nOR (2) THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " COLUMN VALUES\nOR (3) THE LENGTH OF THE CLASSES IN THIS COLUMN\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LENGTH ", length(data1[[i1]][, categ[[i1]]]), " AND CATEG CLASS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\nPRESENCE OF NA IN THE COLUMN x, y OR categ OF data1 COULD BE THE PROBLEME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -} -if((geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline") & ! is.null(categ[[i1]])){ # add here after the color management, to deal with the different lines to plot inside any data[[i1]] -if(categ[[i1]] == "fake_categ"){ -data1[[i1]][, "fake_categ"] <- factor(paste0("Line_", formatC(1:nrow(data1[[i2]]), width = nchar(nrow(data1[[i2]])), flag = "0"))) -} -} -tempo <- fun_check(data = alpha[[i1]], data.name = ifelse(length(alpha)== 1L, "alpha", paste0("alpha NUMBER ", i1)), prop = TRUE, length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -# end loop (checking inside list compartment) -if(length(data1) > 1){ -if(length(unique(unlist(x)[ ! x == "fake_x"])) > 1){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE x ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(x), collapse = " "), "\nX-AXIS OVERLAYING DIFFERENT VARIABLES?") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(length(data1) > 1){ -if(length(unique(unlist(y)[ ! y == "fake_y"])) > 1){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE y ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(y), collapse = " "), "\nY-AXIS OVERLAYING DIFFERENT VARIABLES?") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(sum(geom %in% "geom_point") > 3){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE \"geom_point\" ELEMENTS") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(length(geom) - sum(geom %in% "geom_point") > 3){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE LINE ELEMENTS") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -# x.lim management before transfo by x.log -if(x.log != "no" & ! is.null(x.lim)){ -if(any(x.lim <= 0)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE x.log ARGUMENT SET TO ", x.log, ":\n", paste(x.lim, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(any( ! is.finite(if(x.log == "log10"){log10(x.lim)}else{log2(x.lim)}))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT RETURNS INF/NA WITH THE x.log ARGUMENT SET TO ", x.log, "\nAS SCALE COMPUTATION IS ", ifelse(x.log == "log10", "log10", "log2"), ":\n", paste(if(x.log == "log10"){log10(x.lim)}else{log2(x.lim)}, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(x.log != "no" & x.include.zero == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") x.log ARGUMENT SET TO ", x.log, " AND x.include.zero ARGUMENT SET TO TRUE -> x.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -x.include.zero <- FALSE -} -# end x.lim management before transfo by x.log -# y.lim management before transfo by y.log -if(y.log != "no" & ! is.null(y.lim)){ -if(any(y.lim <= 0)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(any( ! is.finite(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT RETURNS INF/NA WITH THE y.log ARGUMENT SET TO ", y.log, "\nAS SCALE COMPUTATION IS ", ifelse(y.log == "log10", "log10", "log2"), ":\n", paste(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(y.log != "no" & y.include.zero == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") y.log ARGUMENT SET TO ", y.log, " AND y.include.zero ARGUMENT SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -y.include.zero <- FALSE -} -# end y.lim management before transfo by y.log -# end other checkings -# reserved word checking -#already done above -# end reserved word checking -# end second round of checking and data preparation - - -# package checking -fun_pack(req.package = c( -"gridExtra", -"ggplot2", -"lemon", -"scales" -), lib.path = lib.path) -# packages Cairo and grid tested by fun_gg_point_rast() -# end package checking - - - - -# main code -# axes management -if(is.null(x.lim)){ -if(any(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE x COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -x.lim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. y.lim added here. If NULL, ok if y argument has values -}else if(x.log != "no"){ -x.lim <- get(x.log)(x.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -} -if(x.log != "no"){ -if(any( ! is.finite(x.lim))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE x.log ARGUMENT SET TO ", x.log, ":\n", paste(x.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(suppressWarnings(all(x.lim %in% c(Inf, -Inf)))){ # happen when x is only NULL -if(all(unlist(geom) %in% c("geom_vline", "geom_stick"))){ -tempo.cat <- paste0("ERROR IN ", function.name, " NOT POSSIBLE TO DRAW geom_vline OR geom_stick KIND OF LINES ALONE IF x.lim ARGUMENT IS SET TO NULL, SINCE NO X-AXIS DEFINED (", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, " x.lim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(x.lim, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -x.lim.order <- order(x.lim) # to deal with inverse axis -# print(x.lim.order) -x.lim <- sort(x.lim) -x.lim[1] <- x.lim[1] - abs(x.lim[2] - x.lim[1]) * ifelse(diff(x.lim.order) > 0, x.right.extra.margin, x.left.extra.margin) # diff(x.lim.order) > 0 means not inversed axis -x.lim[2] <- x.lim[2] + abs(x.lim[2] - x.lim[1]) * ifelse(diff(x.lim.order) > 0, x.left.extra.margin, x.right.extra.margin) # diff(x.lim.order) > 0 means not inversed axis -if(x.include.zero == TRUE){ # no need to check x.log != "no" because done before -x.lim <- range(c(x.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only -} -x.lim <- x.lim[x.lim.order] -if(any(is.na(x.lim))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 3") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(is.null(y.lim)){ -if(any(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE y COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -y.lim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. y.lim added here. If NULL, ok if y argument has values -}else if(y.log != "no"){ -y.lim <- get(y.log)(y.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -} -if(y.log != "no"){ -if(any( ! is.finite(y.lim))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(suppressWarnings(all(y.lim %in% c(Inf, -Inf)))){ # happen when y is only NULL -if(all(unlist(geom) == "geom_vline")){ -tempo.cat <- paste0("ERROR IN ", function.name, " NOT POSSIBLE TO DRAW geom_vline KIND OF LINES ALONE IF y.lim ARGUMENT IS SET TO NULL, SINCE NO Y-AXIS DEFINED (", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, " y.lim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(y.lim, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -y.lim.order <- order(y.lim) # to deal with inverse axis -y.lim <- sort(y.lim) -y.lim[1] <- y.lim[1] - abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(y.lim.order) > 0 means not inversed axis -y.lim[2] <- y.lim[2] + abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(y.lim.order) > 0 means not inversed axis -if(y.include.zero == TRUE){ # no need to check y.log != "no" because done before -y.lim <- range(c(y.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only -} -y.lim <- y.lim[y.lim.order] -if(any(is.na(y.lim))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 4") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -# end axes management - - - - -# create a fake categ if NULL to deal with legend display -if(is.null(categ)){ -categ <- vector("list", length(data1)) -categ[] <- "fake_categ" -for(i2 in 1:length(data1)){ -data1[[i2]] <- cbind(data1[[i2]], fake_categ = "", stringsAsFactors = TRUE) -if(geom[[i2]] == "geom_hline" | geom[[i2]] == "geom_vline"){ -data1[[i2]][, "fake_categ"] <- factor(paste0("Line_", 1:nrow(data1[[i2]]))) -} -} -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL categ ARGUMENT -> FAKE \"fake_categ\" COLUMN ADDED TO EACH DATA FRAME OF data1, AND FILLED WITH \"\"") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# categ is not NULL anymore -if(is.null(categ.class.order)){ -categ.class.order <- vector("list", length = length(data1)) -tempo.categ.class.order <- NULL -for(i2 in 1:length(categ.class.order)){ -categ.class.order[[i2]] <- levels(data1[[i2]][, categ[[i2]]]) -names(categ.class.order)[i2] <- categ[[i2]] -tempo.categ.class.order <- c(tempo.categ.class.order, ifelse(i2 != 1, "\n", ""), categ.class.order[[i2]]) -} -if(any(unlist(legend.disp))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR CLASS ORDERING:\n", paste(tempo.categ.class.order, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end create a fake categ if NULL to deal with legend display -# categ.class.order is not NULL anymore - - -# vector of color with length as in levels(categ) of data1 -if(is.null(color)){ -color <- vector("list", length(data1)) -length.categ.list <- lapply(lapply(mapply(FUN = "[[", data1, categ, SIMPLIFY = FALSE), FUN = unique), FUN = function(x){length(x[ ! is.na(x)])}) -length.categ.list[sapply(categ, FUN = "==", "fake_categ")] <- 1 # when is.null(color), a single color for all the dots or lines of data[[i1]] that contain "fake_categ" category -total.categ.length <- sum(unlist(length.categ.list), na.rm = TRUE) -tempo.color <- fun_gg_palette(total.categ.length) -tempo.count <- 0 -for(i2 in 1:length(data1)){ -color[[i2]] <- tempo.color[(1:length.categ.list[[i2]]) + tempo.count] -tempo.count <- tempo.count + length.categ.list[[i2]] -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i2, " OF categ ARGUMENT")), " (", categ[[i2]], ") IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i2, " OF data1 ARGUMENT")), ":\n", paste(color[[i2]], collapse = " "), "\n", paste(if(all(levels(data1[[i2]][, categ[[i2]]]) == "")){'\"\"'}else{levels(data1[[i2]][, categ[[i2]]])}, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end vector of color with length as in levels(categ) of data1 -# color is not NULL anymore - - - - - -# last check -for(i1 in 1:length(data1)){ -if(categ[[i1]] != "fake_categ" & length(color[[i1]]) != length(unique(data1[[i1]][, categ[[i1]]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\nREMINDER: A SINGLE COLOR PER CLASS OF CATEG AND A SINGLE CLASS OF CATEG PER COLOR MUST BE RESPECTED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ -tempo.cat <- paste0("ERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE LENGTH 1 WHEN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IS NULL\nHERE IT IS COLOR LENGTH ", length(color[[i1]])) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -# end last check - - - - - -# conversion of geom_hline and geom_vline -for(i1 in 1:length(data1)){ -if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ -final.data.frame <- data.frame() -for(i3 in 1:nrow(data1[[i1]])){ -tempo.data.frame <- rbind(data1[[i1]][i3, ], data1[[i1]][i3, ], stringsAsFactors = TRUE) -if(geom[[i1]] == "geom_hline"){ -tempo.data.frame[, x[[i1]]] <- x.lim -}else if(geom[[i1]] == "geom_vline"){ -tempo.data.frame[, y[[i1]]] <- y.lim -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 5") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -# 3 lines below inactivated because I put that above -# if(is.null(categ[[i1]])){ -# data1[, "fake_categ"] <- paste0("Line_", i3) -# } -final.data.frame <- rbind(final.data.frame, tempo.data.frame, stringsAsFactors = TRUE) -} -data1[[i1]] <- final.data.frame -geom[[i1]] <- "geom_line" -if(length(color[[i1]])== 1L){ -color[[i1]] <- rep(color[[i1]], length(unique(data1[[i1]][ , categ[[i1]]]))) -}else if(length(color[[i1]]) != length(unique(data1[[i1]][ , categ[[i1]]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, " geom_hline AND geom_vline CONVERSION TO FIT THE XLIM AND YLIM LIMITS OF THE DATA: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]]))) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} + # AIM + # Plot ggplot2 boxplots + dots + means + # For ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html + # WARNINGS + # Rows containing NA in data1[, c(y, categ)] will be removed before processing, with a warning (see below) + # Hinges are not computed like in the classical boxplot() function of R. See https://ggplot2.tidyverse.org/reference/geom_boxplot.html + # To have a single box, please create a factor column with a single class and specify the name of this column in the categ argument. For a single set of grouped boxes, create a factor column with a single class and specify this column in categ argument as first element (i.e., as categ1, knowing that categ2 must also be specified in this situation). See categ argument below + # The dot.alpha argument can alter the display of the color boxes when using pdf output + # Size arguments (box.line.size, dot.size, dot.border.size, stat.size, text.size and title.text.size) are in mm. See Hadley comment in https://stackoverflow.com/questions/17311917/ggplot2-the-unit-of-size. See also http://sape.inf.usi.ch/quick-reference/ggplot2/size). Unit object are not accepted, but conversion can be used (e.g., grid::convertUnit(grid::unit(0.2, "inches"), "mm", valueOnly = TRUE)) + # Display seems to be done twice on Windows devices (like a blink). However, no double plots on pdf devices. Thus, the blink remains mysterious + # To remove boxes and have only dots, use box.alpha = 0 + # ARGUMENTS + # data1: data frame containing one column of quantitative values (see the y argument below) and one or two columns of categories (see the categ argument below). Duplicated column names are not allowed + # y: character string of the data1 column name for y-axis (column containing numeric values). Numeric values will be split according to the classes of the column names indicated in the categ argument to generate the boxes and will also be used to plot the dots + # categ: vector of character strings of the data1 column name for categories (column of characters or factors). Must be either one or two column names. If a single column name (further referred to as categ1), then one box per class of categ1. If two column names (further referred to as categ1 and categ2), then one box per class of categ2, which form a group of boxes in each class of categ1. WARNING: no empty classes allowed. To have a single box, create a factor column with a single class and specify the name of this column in the categ argument (here, no categ2 in categ argument). For a single set of grouped boxes, create a factor column with a single class and specify this column in categ argument as first element (i.e., as categ1), in addition to the already used category (as categ2 in this situation) + # categ.class.order: list indicating the order of the classes of categ1 and categ2 represented on the boxplot (the first compartment for categ1 and and the second for categ2). If categ.class.order == NULL, classes are represented according to the alphabetical order. Some compartments can be NULL and others not. See the categ argument for categ1 and categ2 description + # categ.color: vector of color character string for box frames (see the categ argument for categ1 and categ2 description) + # If categ.color == NULL, default colors of ggplot2, whatever categ1 and categ2 + # If categ.color is non-null and only categ1 in categ argument, categ.color can be either: + # (1) a single color string. All the boxes will have this color, whatever the number of classes of categ1 + # (2) a vector of string colors, one for each class of categ1. Each color will be associated according to categ.class.order of categ1 + # (3) a vector or factor of string colors, like if it was one of the column of data1 data frame. WARNING: a single color per class of categ1 and a single class of categ1 per color must be respected + # Color functions, like grey(), hsv(), etc., are also accepted + # Positive integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the maximal integer value among all the integers in categ.color (see fun_gg_palette()) + # If categ.color is non-null and categ1 and categ2 are specified, all the rules described above will apply to categ2 instead of categ1 (colors will be determined for boxes inside a group of boxes) + # box.legend.name: character string of the legend title. If box.legend.name is NULL, then box.legend.name <- categ1 if only categ1 is present, and box.legend.name <- categ2 if categ1 and categ2 are present in the categ argument. Write "" if no legend required. See the categ argument for categ1 and categ2 description + # box.fill: logical. Fill the box? If TRUE, the categ.color argument will be used to generate filled boxplots (the box frames being black) as well as filled outlier dots (the dot border being controlled by the dot.border.color argument). If all the dots are plotted (argument dot.color other than NULL), they will be over the boxes. If FALSE, the categ.color argument will be used to color the box frames and the outlier dot borders. If all the dots are plotted, they will be beneath the boxes + # box.width: single numeric value (from 0 to 1) of width of either boxes or group of boxes + # When categ argument has a single categ1 element (i.e., separate boxes. See the categ argument for categ1 and categ2 description), then each class of categ1 is represented by a single box. In that case, box.width argument defines each box width, from 0 (no box width) to 1 (max box width), but also the space between boxes (the code uses 1 - box.width for the box spaces). Of note, xmin and xmax of the fun_gg_boxplot() output report the box boundaries (around x-axis unit 1, 2, 3, etc., for each box) + # When categ argument has a two categ1 and categ2 elements (i.e., grouped boxes), box.width argument defines the width allocated for each set of grouped boxes, from 0 (no group width) to 1 (max group width), but also the space between grouped boxes (the code uses 1 - box.width for the spaces). Of note, xmin and xmax of the fun_gg_boxplot() output report the box boundaries (around x-axis unit 1, 2, 3, etc., for each set of grouped box) + # box.space: single numeric value (from 0 to 1) indicating the box separation inside grouped boxes, when categ argument has a two categ1 and categ2 elements. 0 means no space and 1 means boxes shrunk to a vertical line. Ignored if categ argument has a single categ1 element + # box.line.size: single numeric value of line width of boxes and whiskers in mm + # box.notch: logical. Notched boxplot? It TRUE, display notched boxplot, notches corresponding approximately to the 95% confidence interval of the median (the notch interval is exactly 1.58 x Inter Quartile Range (IQR) / sqrt(n), with n the number of values that made the box). If notch intervals between two boxes do not overlap, it can be interpreted as significant median differences + # box.alpha: single numeric value (from 0 to 1) of box transparency (full transparent to full opaque, respectively). To remove boxplots, use box.alpha = 0 + # box.mean: logical. Add mean value? If TRUE, a diamond-shaped dot, with the horizontal diagonal corresponding to the mean value, is displayed over each boxplot + # box.whisker.kind: range of the whiskers. Either "no" (no whiskers), or "std" (length of each whisker equal to 1.5 x Inter Quartile Range (IQR)), or "max" (length of the whiskers up or down to the most distant dot) + # box.whisker.width: single numeric value (from 0 to 1) of the whisker width, with 0 meaning no whiskers and 1 meaning a width equal to the box width + # dot.color: vector of color character string ruling the dot colors and the dot display. See the example section below for easier understanding of the rules described here + # If NULL, no dots plotted + # If "same", the dots will have the same colors as the respective boxplots + # Otherwise, as in the rule (1), (2) or (3) described in the categ.color argument, except that in the possibility (3), the rule "a single color per class of categ and a single class of categ per color", does not have to be respected (for instance, each dot can have a different color). Colors will also depend on the dot.categ argument. If dot.categ is NULL, then colors will be applied to each class of the last column name specified in categ. If dot.categ is non-NULL, colors will be applied to each class of the column name specified in dot.categ. See examples + # dot.categ: optional single character string of a column name (further referred to as categ3) of the data1 argument. This column of data1 will be used to generate a legend for dots, in addition to the legend for boxes. See the dot.color argument for details about the way the legend is built using the two dot.categ and dot.color arguments. If NULL, no legend created and the colors of dots will depend on dot.color and categ arguments (as explained in the dot.color argument) + # dot.categ.class.order: optional vector of character strings indicating the order of the classes of categ3 (see the dot.categ argument). If dot.categ is non-NULL and dot.categ.class.order is NULL, classes are displayed in the legend according to the alphabetical order. Ignored if dot.categ is NULL + # dot.legend.name: optional character string of the legend title for categ3 (see the dot.categ argument). If dot.legend.name == NULL, dot.categ value is used (name of the column in data1). Write "" if no legend required. Ignored if dot.categ is NULL + # dot.tidy: logical. Nice dot spreading? If TRUE, use the geom_dotplot() function for a nice representation. WARNING: change the true quantitative coordinates of dots (i.e., y-axis values for vertical display) because of binning. Thus, the gain in aestheticism is associated with a loss in precision that can be very important. If FALSE, dots are randomly spread on the qualitative axis, using the dot.jitter argument (see below) keeping the true quantitative coordinates + # dot.tidy.bin.nb: positive integer indicating the number of bins (i.e., nb of separations) of the y.lim range. Each dot will then be put in one of the bin, with a diameter of the width of the bin. In other words, increase the number of bins to have smaller dots. Not considered if dot.tidy is FALSE + # dot.jitter: numeric value (from 0 to 1) of random dot horizontal dispersion (for vertical display), with 0 meaning no dispersion and 1 meaning dispersion in the corresponding box width interval. Not considered if dot.tidy is TRUE + # dot.seed: integer value that set the random seed. Using the same number will generate the same dot jittering. Write NULL to have different jittering each time the same instruction is run. Ignored if dot.tidy is TRUE + # dot.size: numeric value of dot diameter in mm. Not considered if dot.tidy is TRUE + # dot.alpha: numeric value (from 0 to 1) of dot transparency (full transparent to full opaque, respectively) + # dot.border.size: numeric value of border dot width in mm. Write zero for no dot border. If dot.tidy is TRUE, value 0 remove the border and other values leave the border without size control (geom_doplot() feature) + # dot.border.color: single character color string defining the color of the dot border (same color for all the dots, whatever their categories). If dot.border.color == NULL, the border color will be the same as the dot color. A single integer is also accepted instead of a character string, that will be processed by fun_gg_palette() + # x.lab: a character string or expression for x-axis legend. If NULL, character string of categ1 (see the categ argument for categ1 and categ2 description) + # x.angle: integer value of the text angle for the x-axis numbers, using the same rules as in ggplot2. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. + # y.lab: a character string or expression for y-axis legend. If NULL, character string of the y argument + # y.lim: 2 numeric values indicating the range of the y-axis. Order matters (for inverted axis). If NULL, the range of the x column name of data1 will be used. + # y.log: either "no", "log2" (values in the y argument column of the data1 data frame will be log2 transformed and y-axis will be log2 scaled) or "log10" (values in the y argument column of the data1 data frame will be log10 transformed and y-axis will be log10 scaled). WARNING: not possible to have horizontal boxes with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) + # y.tick.nb: approximate number of desired values labeling the y-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if y.log is "no", then the number of labeling values is set by ggplot2. If NULL and if y.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the y.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for y.lim = c(9, 1200)). WARNING: if non-NULL and if y.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) + # y.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if y.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$y.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks + # y.include.zero: logical. Does y.lim range include 0? Ignored if y.log is "log2" or "log10" + # y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to y.lim. If different from 0, add the range of the axis multiplied by y.top.extra.margin (e.g., abs(y.lim[2] - y.lim[1]) * y.top.extra.margin) to the top of y-axis + # y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis + # stat.pos: add the median number above the corresponding box. Either NULL (no number shown), "top" (at the top of the plot region) or "above" (above each box) + # stat.mean: logical. Display mean numbers instead of median numbers? Ignored if stat.pos is NULL + # stat.size: numeric value of the stat font size in mm. Ignored if stat.pos is NULL + # stat.dist: numeric value of the stat distance in percentage of the y-axis range (stat.dist = 5 means move the number displayed at 5% of the y-axis range). Ignored if stat.pos is NULL or "top" + # stat.angle: integer value of the angle of stat, using the same rules as in ggplot2. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. + # vertical: logical. Vertical boxes? WARNING: will be automatically set to TRUE if y.log argument is other than "no". Indeed, not possible to have horizontal boxes with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) + # text.size: numeric value of the font size of the (1) axis numbers, (2) axis labels and (3) texts in the graphic legend (in mm) + # title: character string of the graph title + # title.text.size: numeric value of the title font size in mm + # legend.show: logical. Show legend? Not considered if categ argument is NULL, because this already generate no legend, excepted if legend.width argument is non-NULL. In that specific case (categ is NULL, legend.show is TRUE and legend.width is non-NULL), an empty legend space is created. This can be useful when desiring graphs of exactly the same width, whatever they have legends or not + # legend.width: single proportion (between 0 and 1) indicating the relative width of the legend sector (on the right of the plot) relative to the width of the plot. Value 1 means that the window device width is split in 2, half for the plot and half for the legend. Value 0 means no room for the legend, which will overlay the plot region. Write NULL to inactivate the legend sector. In such case, ggplot2 will manage the room required for the legend display, meaning that the width of the plotting region can vary between graphs, depending on the text in the legend + # article: logical. If TRUE, use an article theme (article like). If FALSE, use a classic related ggplot theme. Use the add argument (e.g., add = "+ggplot2::theme_classic()" for the exact classic ggplot theme + # grid: logical. Draw lines in the background to better read the box values? Not considered if article == FALSE (grid systematically present) + # add: character string allowing to add more ggplot2 features (dots, lines, themes, facet, etc.). Ignored if NULL + # WARNING: (1) the string must start with "+", (2) the string must finish with ")" and (3) each function must be preceded by "ggplot2::". Example: "+ ggplot2::coord_flip() + ggplot2::theme_bw()" + # If the character string contains the "ggplot2::theme" string, then the article argument of fun_gg_boxplot() (see above) is ignored with a warning + # Handle the add argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions + # WARNING: the call of objects inside the quotes of add can lead to an error if the name of these objects are some of the fun_gg_boxplot() arguments. Indeed, the function will use the internal argument instead of the global environment object. Example article <- "a" in the working environment and add = '+ ggplot2::ggtitle(article)'. The risk here is to have TRUE as title. To solve this, use add = '+ ggplot2::ggtitle(get("article", envir = .GlobalEnv))' + # return: logical. Return the graph parameters? + # return.ggplot: logical. Return the ggplot object in the output list? Ignored if return argument is FALSE. WARNING: always assign the fun_gg_boxplot() function (e.g., a <- fun_gg_boxplot()) if return.ggplot argument is TRUE, otherwise, double plotting is performed. See $ggplot in the RETURN section below for more details + # return.gtable: logical. Return the ggplot object as gtable of grobs in the output list? Ignored if plot argument is FALSE. Indeed, the graph must be plotted to get the grobs dispositions. See $gtable in the RETURN section below for more details + # plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting + # warn.print: logical. Print warnings at the end of the execution? ? If FALSE, warning messages are never printed, but can still be recovered in the returned list. Some of the warning messages (those delivered by the internal ggplot2 functions) are not apparent when using the argument plot = FALSE + # lib.path: character string indicating the absolute path of the required packages (see below). if NULL, the function will use the R library default folders + # RETURN + # A boxplot if plot argument is TRUE + # A list of the graph info if return argument is TRUE: + # $data: the initial data with graphic information added + # $stat: the graphic statistics (mostly equivalent to ggplot_build()$data[[2]]) + # $removed.row.nb: which rows have been removed due to NA/Inf detection in y and categ columns (NULL if no row removed) + # $removed.rows: removed rows (NULL if no row removed) + # $plot: the graphic box and dot coordinates + # $dots: dot coordinates + # $main.box: coordinates of boxes + # $median: median coordinates + # $sup.whisker: coordinates of top whiskers (y for base and y.end for extremities) + # $inf.whisker: coordinates of bottom whiskers (y for base and y.end for extremities) + # $sup.whisker.edge: coordinates of top whisker edges (x and xend) + # $inf.whisker.edge: coordinates of bottom whisker edges(x and xend) + # $mean: diamond mean coordinates (only if box.mean argument is TRUE) + # $stat.pos: coordinates of stat numbers (only if stat.pos argument is not NULL) + # y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non-NULL or if y.log argument is different from "no") + # y.second.tick.values: values of secondary ticks. NULL except if y.second.tick.nb argument is non-NULL or if y.log argument is different from "no") + # $panel: the variable names used for the panels (NULL if no panels). WARNING: NA can be present according to ggplot2 upgrade to v3.3.0 + # $axes: the x-axis and y-axis info + # $warn: the warning messages. Use cat() for proper display. NULL if no warning. WARNING: warning messages delivered by the internal ggplot2 functions are not apparent when using the argument plot = FALSE + # $ggplot: ggplot object that can be used for reprint (use print(...$ggplot) or update (use ...$ggplot + ggplot2::...). NULL if return.ggplot argument is FALSE. Of note, a non-NULL $ggplot in the output list is sometimes annoying as the manipulation of this list prints the plot + # $gtable: gtable object that can be used for reprint (use gridExtra::grid.arrange(...$ggplot) or with additionnal grobs (see the grob decomposition in the examples). NULL if return.ggplot argument is FALSE. Contrary to $ggplot, a non-NULL $gtable in the output list is not annoying as the manipulation of this list does not print the plot + # REQUIRED PACKAGES + # ggplot2 + # gridExtra + # lemon (in case of use in the add argument) + # scales + # REQUIRED FUNCTIONS FROM THE cute PACKAGE + # fun_check() + # fun_comp_1d() + # fun_comp_2d() + # fun_gg_just() + # fun_gg_palette() + # fun_inter_ticks() + # fun_name_change() + # fun_pack() + # fun_round() + # fun_scale() + # EXAMPLE + # set.seed(1) ; obs1 <- data.frame(Time = c(rnorm(20, 100, 10), rnorm(20, 200, 50), rnorm(20, 500, 60), rnorm(20, 100, 50)), Categ1 = rep(c("CAT", "DOG"), times = 40), Categ2 = rep(c("A", "B", "C", "D"), each = 20), Color1 = rep(c("coral", "lightblue"), times = 40), Color2 = rep(c("#9F2108", "#306100", "#007479", "#8500C0"), each = 20), stringsAsFactors = TRUE) ; set.seed(NULL) ; fun_gg_boxplot(data1 = obs1, y = "Time", categ = "Categ1") + # see http + # DEBUGGING + # set.seed(1) ; obs1 <- data.frame(Time = c(rnorm(10), rnorm(10) + 2), Categ1 = rep(c("G", "H"), each = 10), stringsAsFactors = TRUE) ; set.seed(NULL) ; obs1$Time[1:10] <- NA ; data1 = obs1 ; y = "Time" ; categ = c("Categ1") ; categ.class.order = NULL ; categ.color = NULL ; box.legend.name = NULL ; box.fill = FALSE ; box.width = 0.5 ; box.space = 0.1 ; box.line.size = 0.75 ; box.notch = FALSE ; box.alpha = 1 ; box.mean = TRUE ; box.whisker.kind = "std" ; box.whisker.width = 0 ; dot.color = grey(0.25) ; dot.categ = NULL ; dot.categ.class.order = NULL ; dot.legend.name = NULL ; dot.tidy = FALSE ; dot.tidy.bin.nb = 50 ; dot.jitter = 0.5 ; dot.seed = 2 ; dot.size = 3 ; dot.alpha = 0.5 ; dot.border.size = 0.5 ; dot.border.color = NULL ; x.lab = NULL ; x.angle = 0 ; y.lab = NULL ; y.lim = NULL ; y.log = "no" ; y.tick.nb = NULL ; y.second.tick.nb = 1 ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0.05 ; stat.pos = "top" ; stat.mean = FALSE ; stat.size = 4 ; stat.dist = 5 ; stat.angle = 0 ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; legend.show = TRUE ; legend.width = 0.5 ; article = TRUE ; grid = FALSE ; add = NULL ; return = FALSE ; return.ggplot = FALSE ; return.gtable = TRUE ; plot = TRUE ; warn.print = FALSE ; lib.path = NULL + # function name + function.name <- paste0(as.list(match.call(expand.dots = FALSE))[[1]], "()") + arg.names <- names(formals(fun = sys.function(sys.parent(n = 2)))) # names of all the arguments + arg.user.setting <- as.list(match.call(expand.dots = FALSE))[-1] # list of the argument settings (excluding default values not provided by the user) + # end function name + # required function checking + req.function <- c( + "fun_comp_2d", + "fun_gg_just", + "fun_gg_palette", + "fun_name_change", + "fun_pack", + "fun_check", + "fun_round", + "fun_scale", + "fun_inter_ticks" + ) + tempo <- NULL + for(i1 in req.function){ + if(length(find(i1, mode = "function")) == 0L){ + tempo <- c(tempo, i1) + } + } + if( ! is.null(tempo)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nREQUIRED cute FUNCTION", ifelse(length(tempo) > 1, "S ARE", " IS"), " MISSING IN THE R ENVIRONMENT:\n", paste0(tempo, collapse = "()\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end required function checking + # reserved words to avoid bugs (names of dataframe columns used in this function) + reserved.words <- c("categ.check", "categ.color", "dot.color", "dot.categ", "dot.max", "dot.min", "group", "PANEL", "group.check", "MEAN", "tempo.categ1", "tempo.categ2", "text.max.pos", "text.min.pos", "x", "x.y", "y", "y.check", "y_from.dot.max", "ymax", "tidy_group", "binwidth") + # end reserved words to avoid bugs (used in this function) + # arg with no default values + mandat.args <- c( + "data1", + "y", + "categ" + ) + tempo <- eval(parse(text = paste0("missing(", paste0(mandat.args, collapse = ") | missing("), ")"))) + if(any(tempo)){ # normally no NA for missing() output + tempo.cat <- paste0("ERROR IN ", function.name, "\nFOLLOWING ARGUMENT", ifelse(length(mandat.args) > 1, "S HAVE", "HAS"), " NO DEFAULT VALUE AND REQUIRE ONE:\n", paste0(mandat.args, collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end arg with no default values + # argument primary checking + arg.check <- NULL # + text.check <- NULL # + checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools + ee <- expression(arg.check <- c(arg.check, tempo$problem) , text.check <- c(text.check, tempo$text) , checked.arg.names <- c(checked.arg.names, tempo$object.name)) + tempo <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = categ, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) + if( ! is.null(categ.class.order)){ + tempo <- fun_check(data = categ.class.order, class = "list", fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = categ.class.order, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(box.legend.name)){ + tempo <- fun_check(data = box.legend.name, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = box.legend.name, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(categ.color)){ + tempo1 <- fun_check(data = categ.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = categ.color, class = "factor", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.check.color <- fun_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, neg.values = FALSE, fun.name = function.name)$problem + if(tempo.check.color == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + }else if(any(categ.color == 0L, na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = categ.color, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = box.fill, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.space, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.line.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.notch, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.mean, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.whisker.kind, options = c("no", "std", "max"), length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.whisker.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(dot.color)){ + tempo1 <- fun_check(data = dot.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = dot.color, class = "factor", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.check.color <- fun_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, neg.values = FALSE, fun.name = function.name)$problem + if(tempo.check.color == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + }else if(any(dot.color == 0L, na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.color, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(dot.categ)){ + tempo <- fun_check(data = dot.categ, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.categ, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(dot.categ.class.order)){ + tempo <- fun_check(data = dot.categ.class.order, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.categ.class.order, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(dot.legend.name)){ + tempo <- fun_check(data = dot.legend.name, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.legend.name, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = dot.tidy, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = dot.tidy.bin.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if(dot.tidy.bin.nb == 0L){ # length and NA checked above + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.tidy.bin.nb ARGUMENT MUST BE A NON-NULL AND POSITVE INTEGER VALUE") # integer possible because dealt above + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + tempo <- fun_check(data = dot.jitter, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(dot.seed)){ + tempo <- fun_check(data = dot.seed, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = TRUE, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.seed, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = dot.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + if( ! is.null(dot.border.color)){ + tempo1 <- fun_check(data = dot.border.color, class = "vector", mode = "character", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.border.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR STRING STARTING BY #, OR (2) A COLOR NAME GIVEN BY colors(), OR (3) AN INTEGER VALUE") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + }else if(tempo1$problem == FALSE & tempo2$problem == TRUE){ + if( ! all(dot.border.color %in% colors() | grepl(pattern = "^#", dot.border.color), na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.border.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR STRING STARTING BY #, OR (2) A COLOR NAME GIVEN BY colors(), OR (3) AN INTEGER VALUE") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.border.color, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(x.lab)){ + tempo1 <- fun_check(data = x.lab, class = "expression", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = x.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lab ARGUMENT MUST BE A SINGLE CHARACTER STRING OR EXPRESSION") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x.lab, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = x.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) + if( ! is.null(y.lab)){ + tempo1 <- fun_check(data = y.lab, class = "expression", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = y.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lab ARGUMENT MUST BE A SINGLE CHARACTER STRING OR EXPRESSION") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.lab, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(y.lim)){ + tempo <- fun_check(data = y.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if(any(is.infinite(y.lim))){ # normally no NA for is.infinite() output + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.lim, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = y.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(y.tick.nb)){ + tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if(y.tick.nb < 0){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(y.second.tick.nb)){ + tempo <- fun_check(data = y.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if(y.second.tick.nb <= 0){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.second.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.second.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(stat.pos)){ + tempo <- fun_check(data = stat.pos, options = c("top", "above"), length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = stat.pos, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = stat.mean, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = stat.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = stat.dist, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = stat.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = vertical, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = legend.show, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(legend.width)){ + tempo <- fun_check(data = legend.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = legend.width, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = article, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(add)){ + tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = add, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = return.ggplot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = return.gtable, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(lib.path)){ + tempo <- fun_check(data = lib.path, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if( ! all(dir.exists(lib.path), na.rm = TRUE)){ # separation to avoid the problem of tempo$problem == FALSE and lib.path == NA + tempo.cat <- paste0("ERROR IN ", function.name, "\nDIRECTORY PATH INDICATED IN THE lib.path ARGUMENT DOES NOT EXISTS:\n", paste(lib.path, collapse = "\n")) + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = lib.path, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if(any(arg.check) == TRUE){ # normally no NA + stop(paste0("\n\n================\n\n", paste(text.check[arg.check], collapse = "\n"), "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == # + } + # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.7/r_debugging_tools-v1.7.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() + # end argument primary checking + # second round of checking and data preparation + # management of NA arguments + tempo.arg <- names(arg.user.setting) # values provided by the user + tempo.log <- suppressWarnings(sapply(lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.na), FUN = any)) & lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = length) == 1L # no argument provided by the user can be just NA + if(any(tempo.log) == TRUE){ # normally no NA because is.na() used here + tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT JUST BE NA") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end management of NA arguments + # management of NULL arguments + tempo.arg <-c( + "data1", + "y", + "categ", + "box.fill", + "box.width", + "box.space", + "box.line.size", + "box.notch", + "box.alpha", + "box.mean", + "box.whisker.kind", + "box.whisker.width", + # "dot.color", # inactivated because can be null + "dot.tidy", + "dot.tidy.bin.nb", + "dot.jitter", + # "dot.seed", # inactivated because can be null + "dot.size", + "dot.alpha", + "dot.border.size", + "x.angle", + "y.log", + # "y.second.tick.nb", # inactivated because can be null + "y.include.zero", + "y.top.extra.margin", + "y.bottom.extra.margin", + # "stat.pos", # inactivated because can be null + "stat.mean", + "stat.size", + "stat.dist", + "stat.angle", + "vertical", + "text.size", + "title", + "title.text.size", + "legend.show", + # "legend.width", # inactivated because can be null + "article", + "grid", + "return", + "return.ggplot", + "return.gtable", + "plot", + "warn.print" + ) + tempo.log <- sapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.null) + if(any(tempo.log) == TRUE){# normally no NA with is.null() + tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT BE NULL") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end management of NULL arguments + # code that protects set.seed() in the global environment + # see also Protocol 100-rev0 Parallelization in R.docx + if(exists(".Random.seed", envir = .GlobalEnv)){ # if .Random.seed does not exists, it means that no random operation has been performed yet in any R environment + tempo.random.seed <- .Random.seed + on.exit(assign(".Random.seed", tempo.random.seed, env = .GlobalEnv)) + }else{ + on.exit(set.seed(NULL)) # inactivate seeding -> return to complete randomness + } + set.seed(dot.seed) + # end code that protects set.seed() in the global environment + # warning initiation + ini.warning.length <- options()$warning.length + options(warning.length = 8170) + warn <- NULL + warn.count <- 0 + # end warning initiation + # other checkings + if(any(duplicated(names(data1)), na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nDUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if( ! (y %in% names(data1))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny ARGUMENT MUST BE A COLUMN NAME OF data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + tempo <- fun_check(data = data1[, y], data.name = "y COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) + if(tempo$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny ARGUMENT MUST BE NUMERIC COLUMN IN data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + if(length(categ) > 2){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg ARGUMENT CANNOT HAVE MORE THAN 2 COLUMN NAMES OF data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! all(categ %in% names(data1))){ # all() without na.rm -> ok because categ cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(categ, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if(length(dot.categ) > 1){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT CANNOT HAVE MORE THAN 1 COLUMN NAMES OF data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! all(dot.categ %in% names(data1))){ # all() without na.rm -> ok because dot.categ cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(dot.categ, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # reserved word checking + if(any(names(data1) %in% reserved.words, na.rm = TRUE)){ + if(any(duplicated(names(data1)), na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nDUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if( ! is.null(dot.categ)){ + if(dot.categ %in% categ){ + reserved.words <- c(reserved.words, paste0(dot.categ, "_DOT")) # paste0(dot.categ, "_DOT") is added to the reserved words because in such situation, a new column will be added to data1 that is named paste0(dot.categ, "_DOT") + } + } + tempo.output <- fun_name_change(names(data1), reserved.words) + for(i2 in 1:length(tempo.output$ini)){ # a loop to be sure to take the good ones + names(data1)[names(data1) == tempo.output$ini[i2]] <- tempo.output$post[i2] + if(any(y == tempo.output$ini[i2])){ # any() without na.rm -> ok because y cannot be NA (tested above) + y[y == tempo.output$ini[i2]] <- tempo.output$post[i2] + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN y ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN y ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # WARNING: names of y argument potentially replaced + if(any(categ == tempo.output$ini[i2])){ # any() without na.rm -> ok because categ cannot be NA (tested above) + categ[categ == tempo.output$ini[i2]] <- tempo.output$post[i2] + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN categ ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN categ ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # WARNING: names of categ argument potentially replaced + if( ! is.null(dot.categ)){ + if(any(dot.categ == tempo.output$ini[i2])){ # any() without na.rm -> ok because dot.categ cannot be NA (tested above) + dot.categ[dot.categ == tempo.output$ini[i2]] <- tempo.output$post[i2] + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN dot.categ ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN dot.categ ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # WARNING: names of dot.categ argument potentially replaced + } + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") REGARDING COLUMN NAMES REPLACEMENT, THE NAMES\n", paste(tempo.output$ini, collapse = " "), "\nHAVE BEEN REPLACED BY\n", paste(tempo.output$post, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + if( ! (is.null(add) | is.null(tempo.output$ini))){ + if(grepl(x = add, pattern = paste(tempo.output$ini, collapse = "|"))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF COLUMN NAMES OF data1 IN THE add ARGUMENT STRING, THAT CORRESPOND TO RESERVED STRINGS FOR ", function.name, "\nCOLUMN NAMES HAVE TO BE CHANGED\nTHE PROBLEMATIC COLUMN NAMES ARE SOME OF THESE NAMES:\n", paste(tempo.output$ini, collapse = " "), "\nIN THE DATA FRAME OF data1 AND IN THE STRING OF add ARGUMENT, TRY TO REPLACE NAMES BY:\n", paste(tempo.output$post, collapse = " "), "\n\nFOR INFORMATION, THE RESERVED WORDS ARE:\n", paste(reserved.words, collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + } + if( ! (is.null(add))){ + if(any(sapply(X = arg.names, FUN = grepl, x = add), na.rm = TRUE)){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NAMES OF ", function.name, " ARGUMENTS DETECTED IN THE add STRING:\n", paste(arg.names[sapply(X = arg.names, FUN = grepl, x = add)], collapse = "\n"), "\nRISK OF WRONG OBJECT USAGE INSIDE ", function.name) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end reserved word checking + # verif of add + if( ! is.null(add)){ + if( ! grepl(pattern = "^\\s*\\+", add)){ # check that the add string start by + + tempo.cat <- paste0("ERROR IN ", function.name, "\nadd ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! grepl(pattern = "(ggplot2|lemon)\\s*::", add)){ # + tempo.cat <- paste0("ERROR IN ", function.name, "\nFOR EASIER FUNCTION DETECTION, add ARGUMENT MUST CONTAIN \"ggplot2::\" OR \"lemon::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! grepl(pattern = ")\\s*$", add)){ # check that the add string finished by ) + tempo.cat <- paste0("ERROR IN ", function.name, "\nadd ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + # end verif of add + # management of add containing facet + facet.categ <- NULL + if( ! is.null(add)){ + facet.check <- TRUE + tempo <- unlist(strsplit(x = add, split = "\\s*\\+\\s*(ggplot2|lemon)\\s*::\\s*")) # + tempo <- sub(x = tempo, pattern = "^facet_wrap", replacement = "ggplot2::facet_wrap") + tempo <- sub(x = tempo, pattern = "^facet_grid", replacement = "ggplot2::facet_grid") + tempo <- sub(x = tempo, pattern = "^facet_rep", replacement = "lemon::facet_rep") + if(any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap"), na.rm = TRUE)){ + tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")]))) + facet.categ <- names(tempo1$params$facets) + tempo.text <- "facet_wrap OR facet_rep_wrap" + facet.check <- FALSE + }else if(grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")){ + tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")]))) + facet.categ <- c(names(tempo1$params$rows), names(tempo1$params$cols)) + tempo.text <- "facet_grid OR facet_rep_grid" + facet.check <- FALSE + } + if(facet.check == FALSE & ! all(facet.categ %in% names(data1))){ # WARNING: all(facet.categ %in% names(data1)) is TRUE when facet.categ is NULL # all() without na.rm -> ok because facet.categ cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF \"", tempo.text, "\" STRING IN THE add ARGUMENT BUT PROBLEM OF VARIABLE DETECTION (COLUMN NAMES OF data1)\nTHE DETECTED VARIABLES ARE:\n", paste(facet.categ, collapse = " "), "\nTHE data1 COLUMN NAMES ARE:\n", paste(names(data1), collapse = " "), "\nPLEASE REWRITE THE add STRING AND RERUN") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + # end management of add containing facet + # conversion of categ columns in data1 into factors + for(i1 in 1:length(categ)){ + tempo1 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\n", paste0("categ NUMBER ", i1, " OF data1"), " MUST BE A FACTOR OR CHARACTER VECTOR") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if(tempo1$problem == FALSE){ # character vector + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN categ NUMBER ", i1, " IN data1, THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR, WITH LEVELS ACCORDING TO THE ALPHABETICAL ORDER") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + data1[, categ[i1]] <- factor(data1[, categ[i1]]) # if already a factor, change nothing, if characters, levels according to alphabetical order + } + # OK: all the categ columns of data1 are factors from here + # end conversion of categ columns in data1 into factors + + + + # management of log scale and Inf removal + if(any(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf # normally no NA with is.finite0() and is.na() + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN THE ", y, " COLUMN OF THE data1 ARGUMENT AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + data1.ini <- data1 # strictly identical to data1 except that in data1 y is log converted if and only if y.log != "no" + if(y.log != "no"){ + tempo1 <- ! is.finite(data1[, y]) # where are initial NA and Inf + data1[, y] <- suppressWarnings(get(y.log)(data1[, y]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + if(any( ! (tempo1 | is.finite(data1[, y])))){ # normally no NA with is.finite + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN THE ", y, " COLUMN OF THE data1 ARGUMENT AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # Inf removal + if(any(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf # normally no NA with is.finite + removed.row.nb <- which(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y]))) + removed.rows <- data1.ini[removed.row.nb, ] # here data1.ini used to have the y = O rows that will be removed because of Inf creation after log transformation + data1 <- data1[-removed.row.nb, ] # + data1.ini <- data1.ini[-removed.row.nb, ] # + }else{ + removed.row.nb <- NULL + removed.rows <- data.frame(stringsAsFactors = FALSE) + } + # From here, data1 and data.ini have no more Inf + # end Inf removal + if(y.log != "no" & ! is.null(y.lim)){ + if(any(y.lim <= 0)){ # any() without na.rm -> ok because y.lim cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if(any( ! is.finite(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}))){ # normally no NA with is.finite + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT RETURNS INF/NA WITH THE y.log ARGUMENT SET TO ", y.log, "\nAS SCALE COMPUTATION IS ", ifelse(y.log == "log10", "log10", "log2"), ":\n", paste(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + if(y.log != "no" & y.include.zero == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") y.log ARGUMENT SET TO ", y.log, " AND y.include.zero ARGUMENT SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + y.include.zero <- FALSE + } + if(y.log != "no" & vertical == FALSE){ + vertical <- TRUE + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") BECAUSE OF A BUG IN ggplot2, CANNOT FLIP BOXES HORIZONTALLY WITH A Y.LOG SCALE -> vertical ARGUMENT RESET TO TRUE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # end management of log scale and Inf removal + # na detection and removal (done now to be sure of the correct length of categ) + column.check <- unique(c(y, categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){dot.categ}, if( ! is.null(facet.categ)){facet.categ})) # dot.categ because can be a 3rd column of data1, categ.color and dot.color will be tested later + if(any(is.na(data1[, column.check]))){ # data1 used here instead of data1.ini in case of new NaN created by log conversion (neg values) # normally no NA with is.na + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + for(i2 in 1:length(column.check)){ + if(any(is.na(data1[, column.check[i2]]))){ # normally no NA with is.na + tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i2], " OF data1") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n", tempo.warn))) + } + } + tempo <- unique(unlist(lapply(lapply(c(data1[column.check]), FUN = is.na), FUN = which))) + removed.row.nb <- c(removed.row.nb, tempo) # removed.row.nb created to remove Inf + removed.rows <- rbind(removed.rows, data1.ini[tempo, ], stringsAsFactors = FALSE) # here data1.ini used to have the non NA rows that will be removed because of NAN creation after log transformation (neg values for instance) + column.check <- column.check[ ! column.check == y] # remove y to keep quali columns + if(length(tempo) != 0){ + data1 <- data1[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former + data1.ini <- data1.ini[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers than the former + for(i3 in 1:length(column.check)){ + if(any( ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]]), na.rm = TRUE)){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i3], " OF data1, THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA/Inf REMOVAL (IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[, column.check[i3]])[ ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]])], collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + } + count.categ <- 0 + for(i2 in 1:length(column.check)){ + if(column.check[i2] %in% categ){ + count.categ <- count.categ + 1 + } + if(column.check[i2] == categ[count.categ]){ + categ.class.order[count.categ] <- list(levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])]) # remove the absent color in the character vector + data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(categ.class.order[[count.categ]])) + } + if( ! is.null(dot.color) & ! is.null(dot.categ)){ # reminder : dot.categ cannot be a column name of categ anymore (because in that case dot.categ name is changed into "..._DOT" + if(column.check[i2] == dot.categ){ + dot.categ.class.order <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector + data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(dot.categ.class.order)) + } + } + if(column.check[i2] %in% facet.categ){ # works if facet.categ == NULL this method should keep the order of levels when removing some levels + tempo.levels <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(as.character(data1[, column.check[i2]]))] + data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = tempo.levels) + } + } + } + # end na detection and removal (done now to be sure of the correct length of categ) + # From here, data1 and data.ini have no more NA or NaN in y, categ, dot.categ (if dot.color != NULL) and facet.categ + + + + if( ! is.null(categ.class.order)){ + if(length(categ.class.order) != length(categ)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.class.order ARGUMENT MUST BE A LIST OF LENGTH EQUAL TO LENGTH OF categ\nHERE IT IS LENGTH: ", length(categ.class.order), " VERSUS ", length(categ)) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + for(i3 in 1:length(categ.class.order)){ + if(is.null(categ.class.order[[i3]])){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE categ.class.order COMPARTMENT ", i3, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + data1[, categ[i3]] <- factor(as.character(data1[, categ[i3]])) # if already a factor, change nothing, if characters, levels according to alphabetical order + categ.class.order[[i3]] <- levels(data1[, categ[i3]]) # character vector that will be used later + }else{ + tempo <- fun_check(data = categ.class.order[[i3]], data.name = paste0("COMPARTMENT ", i3 , " OF categ.class.order ARGUMENT"), class = "vector", mode = "character", length = length(levels(data1[, categ[i3]])), fun.name = function.name) # length(data1[, categ[i1]) -> if data1[, categ[i1] was initially character vector, then conversion as factor after the NA removal, thus class number ok. If data1[, categ[i1] was initially factor, no modification after the NA removal, thus class number ok + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + if(any(duplicated(categ.class.order[[i3]]), na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i3, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i3]], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! (all(categ.class.order[[i3]] %in% unique(data1[, categ[i3]]), na.rm = TRUE) & all(unique(data1[, categ[i3]]) %in% categ.class.order[[i3]], na.rm = TRUE))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i3, " OF categ.class.order ARGUMENT MUST BE CLASSES OF ELEMENT ", i3, " OF categ ARGUMENT\nHERE IT IS:\n", paste(categ.class.order[[i3]], collapse = " "), "\nFOR COMPARTMENT ", i3, " OF categ.class.order AND IT IS:\n", paste(unique(data1[, categ[i3]]), collapse = " "), "\nFOR COLUMN ", categ[i3], " OF data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + data1[, categ[i3]] <- factor(data1[, categ[i3]], levels = categ.class.order[[i3]]) # reorder the factor + + } + names(categ.class.order)[i3] <- categ[i3] + } + } + }else{ + categ.class.order <- vector("list", length = length(categ)) + tempo.categ.class.order <- NULL + for(i2 in 1:length(categ.class.order)){ + categ.class.order[[i2]] <- levels(data1[, categ[i2]]) + names(categ.class.order)[i2] <- categ[i2] + tempo.categ.class.order <- c(tempo.categ.class.order, ifelse(i2 != 1, "\n", ""), categ.class.order[[i2]]) + } + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR BOX ORDERING:\n", paste(tempo.categ.class.order, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # categ.class.order not NULL anymore (list) + if(is.null(box.legend.name) & box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE box.legend.name SETTING IS NULL. NAMES OF categ WILL BE USED: ", paste(categ, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + box.legend.name <- categ[length(categ)] # if only categ1, then legend name of categ1, if length(categ) == 2L, then legend name of categ2 + } + # box.legend.name not NULL anymore (character string) + # management of categ.color + if( ! is.null(categ.color)){ + # check the nature of color + # integer colors into gg_palette + tempo.check.color <- fun_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem + if(tempo.check.color == FALSE){ + # convert integers into colors + categ.color <- fun_gg_palette(max(categ.color, na.rm = TRUE))[categ.color] + } + # end integer colors into gg_palette + if( ! (all(categ.color %in% colors() | grepl(pattern = "^#", categ.color)))){ # check that all strings of low.color start by #, # all() without na.rm -> ok because categ.color cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(categ.color), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if(any(is.na(categ.color)) & box.alpha != 0){ # normally no NA with is.na + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT CONTAINS NA") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # end check the nature of color + # check the length of color + categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 + if(length(data1[, categ[categ.len]]) == length(levels(data1[, categ[categ.len]])) & length(categ.color) == length(data1[, categ[categ.len]])){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE NUMBER OF CLASSES OF THE COLUMN ", categ[categ.len], " THE NUMBER OF ROWS OF THIS COLUMN AND THE NUMBER OF COLORS OF THE categ.color ARGUMENT ARE ALL EQUAL. BOX COLORS WILL BE ATTRIBUTED ACCORDING THE LEVELS OF ", categ[categ.len], ", NOT ACCORDING TO THE ROWS OF ", categ[categ.len]) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + if(length(categ.color) == length(levels(data1[, categ[categ.len]]))){ # here length(categ.color) is equal to the different number of categ + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + data1 <- data.frame(data1, categ.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) # no need stringsAsFactors here for stat.nolog as factors remain factors + data1$categ.color <- factor(data1$categ.color, labels = categ.color) # replace the characters of data1[, categ[categ.len]] put in the categ.color column by the categ.color (can be write like this because categ.color is length of levels of data1[, categ[categ.len]]) + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", categ[categ.len], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(categ.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else if(length(categ.color) == length(data1[, categ[categ.len]])){# here length(categ.color) is equal to nrow(data1) -> Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[categ.len]]))) + data1 <- data.frame(data1, categ.color = categ.color, stringsAsFactors = TRUE) + tempo.check <- unique(data1[ , c(categ[categ.len], "categ.color")]) + if( ! (nrow(tempo.check) == length(unique(categ.color)) & nrow(tempo.check) == length(unique(data1[ , categ[categ.len]])))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF categ ", categ[categ.len], ":\n", paste(unique(mapply(FUN = "paste", data1[ ,categ[categ.len]], data1[ ,"categ.color"])), collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + categ.color <- unique(data1$categ.color[order(data1[, categ[categ.len]])]) # Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[categ.len]]))) + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ ", categ[categ.len], " AS:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\n", paste(categ.color, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + }else if(length(categ.color) == 1L){ + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + data1 <- data.frame(data1, categ.color = categ.color, stringsAsFactors = TRUE) + categ.color <- rep(categ.color, length(levels(data1[, categ[categ.len]]))) + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[categ.len], "\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(categ.color, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS AFTER NA/Inf REMOVAL, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[categ.len], " COLUMN. HERE IT IS COLOR LENGTH ", length(categ.color), " VERSUS CATEG LENGTH ", length(data1[, categ[categ.len]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[categ.len]])), "\nPRESENCE OF NA/Inf COULD BE THE PROBLEM") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + }else{ + categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + categ.color <- fun_gg_palette(length(levels(data1[, categ[categ.len]]))) + data1 <- data.frame(data1, categ.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) + data1$categ.color <- factor(data1$categ.color, labels = categ.color) # replace the characters of data1[, categ[categ.len]] put in the categ.color column by the categ.color (can be write like this because categ.color is length of levels of data1[, categ[categ.len]]) + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL categ.color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", categ[categ.len], " IN data1:\n", paste(categ.color, collapse = " "), "\n", paste(levels(data1[, categ[categ.len]]), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # categ.color not NULL anymore + categ.color <- as.character(categ.color) + # categ.color is a character string representing the diff classes + data1$categ.color <- factor(data1$categ.color, levels = unique(categ.color)) # ok because if categ.color is a character string, the order make class 1, class 2, etc. unique() because no duplicates allowed + # data1$categ.color is a factor with order of levels -> categ.color + # end management of categ.color + # management of dot.color + if( ! is.null(dot.color)){ + # optional legend of dot colors + if( ! is.null(dot.categ)){ + ini.dot.categ <- dot.categ + if( ! dot.categ %in% names(data1)){ # no need to use all() because length(dot.categ) = 1 + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT MUST BE A COLUMN NAME OF data1. HERE IT IS:\n", dot.categ) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if(dot.categ %in% categ){ # no need to use all() because length(dot.categ) = 1. Do not use dot.categ %in% categ[length(categ)] -> error + # management of dot legend if dot.categ %in% categ (because legends with the same name are joined in ggplot2) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE COLUMN NAME OF data1 INDICATED IN THE dot.categ ARGUMENT (", dot.categ, ") HAS BEEN REPLACED BY ", paste0(dot.categ, "_DOT"), " TO AVOID MERGED LEGEND BY GGPLOT2") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + data1 <- data.frame(data1, dot.categ = data1[, dot.categ], stringsAsFactors = TRUE) # dot.categ is not a column name of data1 (checked above with reserved words) + dot.categ <- paste0(dot.categ, "_DOT") + names(data1)[names(data1) == "dot.categ"] <- dot.categ # paste0(dot.categ, "_DOT") is not a column name of data1 (checked above with reserved words) + # tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT CANNOT BE A COLUMN NAME OF data1 ALREADY SPECIFIED IN THE categ ARGUMENT:\n", dot.categ, "\nINDEED, dot.categ ARGUMENT IS MADE TO HAVE MULTIPLE DOT COLORS NOT RELATED TO THE BOXPLOT CATEGORIES") + # stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + tempo1 <- fun_check(data = data1[, dot.categ], data.name = paste0(dot.categ, " COLUMN OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = data1[, dot.categ], data.name = paste0(dot.categ, " COLUMN OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ COLUMN MUST BE A FACTOR OR CHARACTER VECTOR") # + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + data1[, dot.categ] <- factor(data1[, dot.categ]) # if already a factor, change nothing, if characters, levels according to alphabetical order + # dot.categ column of data1 is factor from here + if( ! is.null(dot.categ.class.order)){ + if(any(duplicated(dot.categ.class.order), na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(dot.categ.class.order, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! (all(dot.categ.class.order %in% levels(data1[, dot.categ])) & all(levels(data1[, dot.categ]) %in% dot.categ.class.order, na.rm = TRUE))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ.class.order ARGUMENT MUST BE CLASSES OF dot.categ ARGUMENT\nHERE IT IS:\n", paste(dot.categ.class.order, collapse = " "), "\nFOR dot.categ.class.order AND IT IS:\n", paste(levels(data1[, dot.categ]), collapse = " "), "\nFOR dot.categ COLUMN (", ini.dot.categ, ") OF data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor + } + }else{ + if(all(dot.color == "same") & length(dot.color)== 1L){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) + dot.categ.class.order <- unlist(categ.class.order[length(categ)]) + data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order SETTING IS NULL AND dot.color IS \"same\". ORDER OF categ.class.order WILL BE APPLIED FOR LEGEND DISPLAY: ", paste(dot.categ.class.order, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else{ + dot.categ.class.order <- sort(levels(data1[, dot.categ])) + data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR LEGEND DISPLAY: ", paste(dot.categ.class.order, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # dot.categ.class.order not NULL anymore (character string) if dot.categ is not NULL + if(all(dot.color == "same") & length(dot.color)== 1L){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) + if( ! identical(ini.dot.categ, categ[length(categ)])){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN dot.color ARGUMENT IS \"same\", THE COLUMN NAME IN dot.categ ARGUMENT MUST BE IDENTICAL TO THE LAST COLUMN NAME IN categ ARGUMENT. HERE IT IS:\ndot.categ: ", paste(ini.dot.categ, collapse = " "), "\ncateg: ", paste(categ, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! fun_comp_1d(unlist(categ.class.order[length(categ)]), dot.categ.class.order)$identical.content){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN dot.color ARGUMENT IS \"same\",\nLAST COMPARTMENT OF categ.class.order ARGUMENT AND dot.categ.class.order ARGUMENT CANNOT BE DIFFERENT:\nLAST COMPARTMENT OF categ.class.order: ", paste(unlist(categ.class.order[length(categ)]), collapse = " "), "\ndot.categ.class.order: ", paste(dot.categ.class.order, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + for(i3 in 1:length(categ)){ + if(identical(categ[i3], ini.dot.categ) & ! identical(unlist(categ.class.order[i3]), dot.categ.class.order) & identical(sort(unlist(categ.class.order[i3])), sort(dot.categ.class.order))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE dot.categ ARGUMENT SETTING IS PRESENT IN THE categ ARGUMENT SETTING, BUT ORDER OF THE CLASSES IS NOT THE SAME:\ncateg.class.order: ", paste(unlist(categ.class.order[i3]), collapse = " "), "\ndot.categ.class.order: ", paste(dot.categ.class.order, collapse = " "), "\nNOTE THAT ORDER OF categ.class.order IS THE ONE USED FOR THE AXIS REPRESENTATION") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(is.null(dot.legend.name)){ + dot.legend.name <- if(ini.dot.categ %in% categ[length(categ)]){dot.categ}else{ini.dot.categ} # + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE dot.legend.name SETTING IS NULL -> ", dot.legend.name, " WILL BE USED AS LEGEND TITLE OF DOTS") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # dot.legend.name not NULL anymore (character string) + }else{ + if( ! is.null(dot.categ.class.order)){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order ARGUMENT IS NOT NULL, BUT IS THE dot.categ ARGUMENT\n-> dot.categ.class.order NOT CONSIDERED AS NO LEGEND WILL BE DRAWN") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # But dot.categ.class.order will be converted to NULL below (not now) + } + # end optional legend of dot colors + # check the nature of color + # integer colors into gg_palette + tempo.check.color <- fun_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem + if(tempo.check.color == FALSE){ + # convert integers into colors + dot.color <- fun_gg_palette(max(dot.color, na.rm = TRUE))[dot.color] + } + # end integer colors into gg_palette + if(all(dot.color == "same") & length(dot.color)== 1L){# all() without na.rm -> ok because dot.color cannot be NA (tested above) + dot.color <- categ.color # same color of the dots as the corresponding box color + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT HAS BEEN SET TO \"same\"\nTHUS, DOTS WILL HAVE THE SAME COLORS AS THE CORRESPONDING BOXPLOT") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else if( ! (all(dot.color %in% colors() | grepl(pattern = "^#", dot.color)))){ # check that all strings of low.color start by #, # all() without na.rm -> ok because dot.color cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR VECTOR STARTING BY #, OR (2) COLOR NAMES GIVEN BY colors(), OR (3) INTEGERS, OR THE STRING \"same\"\nHERE IT IS: ", paste(unique(dot.color), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if(any(is.na(dot.color))){ # normally no NA with is.finite + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT CONTAINS NA") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # end check the nature of color + # check the length of color + if( ! is.null(dot.categ)){ + # optional legend of dot colors + if(length(data1[, dot.categ]) == length(levels(data1[, dot.categ])) & length(dot.color) == length(data1[, dot.categ])){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE NUMBER OF CLASSES OF THE COLUMN ", dot.categ, " THE NUMBER OF ROWS OF THIS COLUMN AND THE NUMBER OF COLORS OF THE dot.color ARGUMENT ARE ALL EQUAL. DOT COLORS WILL BE ATTRIBUTED ACCORDING THE LEVELS OF ", dot.categ, ", NOT ACCORDING TO THE ROWS OF ", dot.categ) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + if(length(dot.color) > 1 & ! (length(dot.color) == length(unique(data1[, dot.categ])) | length(dot.color) == length(data1[, dot.categ]))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN LENGTH OF THE dot.color ARGUMENT IS MORE THAN 1, IT MUST BE EQUAL TO THE NUMBER OF 1) ROWS OR 2) LEVELS OF dot.categ COLUMN (", dot.categ, "):\ndot.color: ", paste(dot.color, collapse = " "), "\ndot.categ LEVELS: ", paste(levels(data1[, dot.categ]), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if(length(dot.color) > 1 & length(dot.color) == length(unique(data1[, dot.categ]))){ + data1 <- data.frame(data1, dot.color = data1[, dot.categ], stringsAsFactors = TRUE) + data1$dot.color <- factor(data1$dot.color, labels = dot.color) # do not use labels = unique(dot.color). Otherwise, we can have green1 green2 when dot.color is c("green", "green") + }else if(length(dot.color) > 1 & length(dot.color) == length(data1[, dot.categ])){ + data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) + }else if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color + data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) + } + dot.color <- as.character(unique(data1$dot.color[order(data1[, dot.categ])])) # reorder the dot.color character vector + if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color + dot.color <- rep(dot.color, length(dot.categ.class.order)) + } + tempo.check <- unique(data1[ , c(dot.categ, "dot.color")]) + if(length(unique(data1[ , "dot.color"])) > 1 & ( ! (nrow(tempo.check) == length(unique(data1[ , "dot.color"])) & nrow(tempo.check) == length(unique(data1[ , dot.categ]))))){ # length(unique(data1[ , "dot.color"])) > 1 because if only one color, can be attributed to each class of dot.categ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF dot.categ (", dot.categ, ") COLUMN:\n", paste(unique(mapply(FUN = "paste", data1[ , dot.categ], data1[ ,"dot.color"])), collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN dot.categ ARGUMENT (", ini.dot.categ, "), THE FOLLOWING COLORS OF DOTS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(data1[, dot.categ]), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # dot.color is a character string representing the diff classes of dot.categ + # data1$dot.color is a factor with order of levels -> dot.categ + # end optional legend of dot colors + }else{ + categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 + if(length(dot.color) == length(levels(data1[, categ[categ.len]]))){ # here length(dot.color) is equal to the different number of categ + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + data1 <- data.frame(data1, dot.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) + data1$dot.color <- factor(data1$dot.color, labels = dot.color) + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", categ[categ.len], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else if(length(dot.color) == length(data1[, categ[categ.len]])){# here length(dot.color) is equal to nrow(data1) -> Modif to have length(dot.color) equal to the different number of categ (length(dot.color) == length(levels(data1[, categ[categ.len]]))) + data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) + }else if(length(dot.color)== 1L & ! all(dot.color == "same")){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) + dot.color <- rep(dot.color, length(levels(data1[, categ[categ.len]]))) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[categ.len], "\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(dot.color, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS AFTER NA/Inf REMOVAL, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[categ.len], " COLUMN. HERE IT IS COLOR LENGTH ", length(dot.color), " VERSUS CATEG LENGTH ", length(data1[, categ[categ.len]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[categ.len]])), "\nPRESENCE OF NA/Inf COULD BE THE PROBLEM") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end check the length of color + dot.color <- as.character(dot.color) + # dot.color is a character string representing the diff classes + data1$dot.color <- factor(data1$dot.color, levels = unique(dot.color)) # ok because if dot.color is a character string, the order make class 1, class 2, etc. If dot.color is a column of data1, then levels will be created, without incidence, except if dot.categ specified (see below). unique() because no duplicates allowed + # data1$dot.color is a factor with order of levels -> dot.color + } + # end optional legend of dot colors + }else if(is.null(dot.color) & ! (is.null(dot.categ) & is.null(dot.categ.class.order) & is.null(dot.legend.name))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") dot.categ OR dot.categ.class.order OR dot.legend.name ARGUMENT HAS BEEN SPECIFIED BUT dot.color ARGUMENT IS NULL (NO DOT PLOTTED)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # dot.color either NULL (no dot plotted) or character string (potentially representing the diff classes of dot.categ) + # data1$dot.color is either NA or a factor (with order of levels -> depending on dot.categ or categ[length(categ)], or other + if(is.null(dot.categ)){ + dot.categ.class.order <- NULL # because not used anyway + } + # dot.categ.class.order either NULL if dot.categ is NULL (no legend displayed) or character string (potentially representing the diff classes of dot.categ) + # end management of dot.color + if(is.null(dot.color) & box.fill == FALSE & dot.alpha <= 0.025){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE FOLLOWING ARGUMENTS WERE SET AS:\ndot.color = NULL (NOT ALL DOTS BUT ONLY POTENTIAL OUTLIER DOTS DISPLAYED)\nbox.fill = FALSE (NO FILLING COLOR FOR BOTH BOXES AND POTENTIAL OUTLIER DOTS)\ndot.alpha = ", fun_round(dot.alpha, 4), "\n-> POTENTIAL OUTLIER DOTS MIGHT NOT BE VISIBLE BECAUSE ALMOST TRANSPARENT") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + if(is.null(dot.color) & box.fill == FALSE & dot.border.size == 0){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE FOLLOWING ARGUMENTS WERE SET AS:\ndot.color = NULL (NOT ALL DOTS BUT ONLY POTENTIAL OUTLIER DOTS DISPLAYED)\nbox.fill = FALSE (NO FILLING COLOR FOR BOTH BOXES AND POTENTIAL OUTLIER DOTS)\ndot.border.size = 0 (NO BORDER FOR POTENTIAL OUTLIER DOTS)\n-> THESE SETTINGS ARE NOT ALLOWED BECAUSE THE POTENTIAL OUTLIER DOTS WILL NOT BE VISIBLE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # integer dot.border.color into gg_palette + if( ! is.null(dot.border.color)){ + tempo <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) + if(tempo$problem == FALSE){ # convert integers into colors + dot.border.color <- fun_gg_palette(max(dot.border.color, na.rm = TRUE))[dot.border.color] + } + } + # end integer dot.border.color into gg_palette + # na detection and removal (done now to be sure of the correct length of categ) + column.check <- c("categ.color", if( ! is.null(dot.color)){"dot.color"}) # + if(any(is.na(data1[, column.check]))){ # data1 used here instead of data1.ini in case of new NaN created by log conversion (neg values) # normally no NA with is.na + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS ", paste(column.check, collapse = " "), " OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + for(i2 in 1:length(column.check)){ + if(any(is.na(data1[, column.check[i2]]))){ # normally no NA with is.na + tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i2], " OF data1") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n", tempo.warn))) + } + } + tempo <- unique(unlist(lapply(lapply(c(data1[column.check]), FUN = is.na), FUN = which))) + removed.row.nb <- c(removed.row.nb, tempo) + removed.rows <- rbind(removed.rows, data1[tempo, ], stringsAsFactors = FALSE) # here data1 used because categorical columns tested + if(length(tempo) != 0){ + data1 <- data1[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former + data1.ini <- data1.ini[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former + for(i3 in 1:length(column.check)){ + if(any( ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]]), na.rm = TRUE)){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i3], " OF data1, THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA/Inf REMOVAL (IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[, column.check[i3]])[ ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]])], collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + } + for(i2 in 1:length(column.check)){ + if(column.check[i2] == "categ.color"){ + categ.color <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector + if(length(categ.color)== 1L & length(unlist(categ.class.order[length(categ)])) > 1){ # to deal with single color + categ.color <- rep(categ.color, length(unlist(categ.class.order[length(categ)]))) + } + data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(categ.color)) + } + if(column.check[i2] == "dot.color"){ + dot.color <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector + if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color. If dot.categ.class.order == NULL (which is systematically the case if dot.categ == NULL), no rep(dot.color, length(dot.categ.class.order) + dot.color <- rep(dot.color, length(dot.categ.class.order)) + } + data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(dot.color)) + } + } + } + # end na detection and removal (done now to be sure of the correct length of categ) + # From here, data1 and data.ini have no more NA or NaN + # end other checkings + # reserved word checking + #already done above + # end reserved word checking + # end second round of checking and data preparation + + + # package checking + fun_pack(req.package = c( + "ggplot2", + "gridExtra", + "lemon", + "scales" + ), lib.path = lib.path) + # end package checking + + + + + + # main code + # y coordinates recovery (create ini.box.coord, dot.coord and modify data1) + if(length(categ)== 1L){ + # width commputations + box.width2 <- box.width + box.space <- 0 # to inactivate the shrink that add space between grouped boxes, because no grouped boxes here + # end width commputations + # data1 check categ order for dots coordinates recovery + data1 <- data.frame(data1, categ.check = data1[, categ[1]], stringsAsFactors = TRUE) + data1$categ.check <- as.integer(data1$categ.check) # to check that data1[, categ[1]] and dot.coord$group are similar, during merging + # end data1 check categ order for dots coordinates recovery + # per box dots coordinates recovery + tempo.gg.name <- "gg.indiv.plot." + tempo.gg.count <- 0 + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[1]), stroke = dot.border.size, size = dot.size, alpha = dot.alpha, shape = 21)) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(is.null(categ.color)){rep(NA, length(unique(data1[, categ[1]])))}else if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[1]])))}else{categ.color})) # categ.color used for dot colors because at that stage, we do not care about colors + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[1]), coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf})) # fill because this is what is used with geom_box # to easily have the equivalent of the grouped boxes + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[1]])))}else{categ.color})) + # end per box dots coordinates recovery + }else if(length(categ) == 2L){ + # width commputations + box.width2 <- box.width / length(unique(data1[, categ[length(categ)]])) # real width of each box in x-axis unit, among the set of grouped box. Not relevant if no grouped boxes length(categ)== 1L + # end width commputations + # data1 check categ order for dots coordinates recovery + tempo.factor <- paste0(data1[order(data1[, categ[2]], data1[, categ[1]]), categ[2]], "_", data1[order(data1[, categ[2]], data1[, categ[1]]), categ[1]]) + data1 <- data.frame(data1[order(data1[, categ[2]], data1[, categ[1]]), ], categ.check = factor(tempo.factor, levels = unique(tempo.factor)), stringsAsFactors = TRUE) + data1$categ.check <- as.integer(data1$categ.check) + # end data1 check categ order for dots coordinates recovery + # per box dots coordinates recovery + tempo.gg.name <- "gg.indiv.plot." + tempo.gg.count <- 0 + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[2]), stroke = dot.border.size, size = dot.size, alpha = dot.alpha, shape = 21)) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(is.null(categ.color)){rep(NA, length(unique(data1[, categ[2]])))}else if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[2]])))}else{categ.color})) # categ.color used for dot colors because at that stage, we do not care about colors + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[2]), coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf})) # fill because this is what is used with geom_box # to easily have the equivalent of the grouped boxes + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[2]])))}else{categ.color})) + # end per box dots coordinates recovery + }else{ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if( ! is.null(stat.pos)){ + stat.just <- fun_gg_just( + angle = stat.angle, + pos = ifelse( + vertical == TRUE, + ifelse(stat.pos == "top", "bottom", "top"), # "bottom" because we want justification for text that are below the ref point which is the top of the graph. The opposite for "above" + ifelse(stat.pos == "top", "left", "right") # "left" because we want justification for text that are on the left of the ref point which is the right border of the graph. The opposite for "above" + ), + kind = "text" + ) + } + # has in fact no interest because ggplot2 does not create room for geom_text() + tempo.data.max <- data1[which.max(data1[, y]), ] + tempo.data.max <- data.frame(tempo.data.max, label = formatC(tempo.data.max[, y], digit = 2, drop0trailing = TRUE, format = "f"), stringsAsFactors = TRUE) + # end has in fact no interest because ggplot2 does not create room for geom_text() + tempo.graph.info.ini <- ggplot2::ggplot_build(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if( ! is.null(stat.pos)){' + ggplot2::geom_text(data = tempo.data.max, mapping = ggplot2::aes_string(x = 1, y = y, label = "label"), size = stat.size, color = "black", angle = stat.angle, hjust = stat.just$hjust, vjust = stat.just$vjust)'})))) # added here to have room for annotation + dot.coord <- tempo.graph.info.ini$data[[1]] + dot.coord$x <- as.numeric(dot.coord$x) # because weird class + dot.coord$PANEL <- as.numeric(dot.coord$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? + tempo.mean <- aggregate(x = dot.coord$y, by = list(dot.coord$group, dot.coord$PANEL), FUN = mean, na.rm = TRUE) + names(tempo.mean)[names(tempo.mean) == "x"] <- "MEAN" + names(tempo.mean)[names(tempo.mean) == "Group.1"] <- "BOX" + names(tempo.mean)[names(tempo.mean) == "Group.2"] <- "PANEL" + dot.coord <- data.frame( + dot.coord[order(dot.coord$group, dot.coord$y), ], # dot.coord$PANEL deals below + y.check = as.double(data1[order(data1$categ.check, data1[, y]), y]), + categ.check = data1[order(data1$categ.check, data1[, y]), "categ.check"], + dot.color = if(is.null(dot.color)){NA}else{data1[order(data1$categ.check, data1[, y]), "dot.color"]}, + data1[order(data1$categ.check, data1[, y]), ][categ], # avoid the renaming below + stringsAsFactors = TRUE + ) # y.check to be sure that the order is the same between the y of data1 and the y of dot.coord + # names(dot.coord)[names(dot.coord) == "tempo.categ1"] <- categ[1] + if( ! is.null(dot.categ)){ + dot.coord <- data.frame(dot.coord, data1[order(data1$categ.check, data1[, y]), ][dot.categ], stringsAsFactors = TRUE) # avoid the renaming + } + if( ! is.null(facet.categ)){ + dot.coord <- data.frame(dot.coord, data1[order(data1$categ.check, data1[, y]), ][facet.categ], stringsAsFactors = TRUE) # for facet panels + tempo.test <- NULL + for(i2 in 1:length(facet.categ)){ + tempo.test <- paste0(tempo.test, ".", formatC(as.numeric(dot.coord[, facet.categ[i2]]), width = nchar(max(as.numeric(dot.coord[, facet.categ[i2]]), na.rm = TRUE)), flag = "0")) # convert factor into numeric with leading zero for proper ranking # merge the formatC() to create a new factor. The convertion to integer should recreate the correct group number. Here as.numeric is used and not as.integer in case of numeric in facet.categ (because comes from add and not checked by fun_check, contrary to categ) + } + tempo.test <- as.integer(factor(tempo.test)) + if( ! identical(as.integer(dot.coord$PANEL), tempo.test)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nas.integer(dot.coord$PANEL) AND tempo.test MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + if(dot.tidy == TRUE){ + if( ! is.null(dot.categ)){ + dot.coord <- data.frame(dot.coord, tidy_group = data1[order(data1$categ.check, data1[, y]), ][, dot.categ], stringsAsFactors = TRUE) # avoid the renaming + # tidy_group_coord is to be able to fuse table when creating the table for dot coordinates + if(dot.categ %in% categ){ + dot.coord <- data.frame(dot.coord, tidy_group_coord = dot.coord$group, stringsAsFactors = TRUE) + }else{ + dot.coord <- data.frame(dot.coord, tidy_group_coord = as.integer(factor(paste0( + formatC(as.integer(dot.coord[, categ[1]]), width = nchar(max(as.integer(dot.coord[, categ[1]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking + ".", + if(length(categ) == 2L){formatC(as.integer(dot.coord[, categ[2]]), width = nchar(max(as.integer(dot.coord[, categ[2]]), na.rm = TRUE)), flag = "0")}, # convert factor into numeric with leading zero for proper ranking + if(length(categ) == 2L){"."}, + formatC(as.integer(dot.coord[, dot.categ]), width = nchar(max(as.integer(dot.coord[, dot.categ]), na.rm = TRUE)), flag = "0") # convert factor into numeric with leading zero for proper ranking + )), stringsAsFactors = TRUE) # merge the 2 or 3 formatC() to create a new factor. The convertion to integer should recreate the correct group number + ) # for tidy dot plots + } + }else{ + dot.coord <- data.frame(dot.coord, tidy_group = if(length(categ)== 1L){ + dot.coord[, categ]}else{as.integer(factor(paste0( + formatC(as.integer(dot.coord[, categ[1]]), width = nchar(max(as.integer(dot.coord[, categ[1]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking + ".", + formatC(as.integer(dot.coord[, categ[2]]), width = nchar(max(as.integer(dot.coord[, categ[2]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking + )), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number + }) # for tidy dot plots + # tidy_group_coord is to be able to fuse table when creating the table for dot coordinates + dot.coord <- data.frame(dot.coord, tidy_group_coord = dot.coord$group, stringsAsFactors = TRUE) + } + } + if( ! (identical(dot.coord$y, dot.coord$y.check) & identical(dot.coord$group, dot.coord$categ.check))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\n(dot.coord$y AND dot.coord$y.check) AS WELL AS (dot.coord$group AND dot.coord$categ.check) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + if( ! identical(tempo.mean[order(tempo.mean$BOX, tempo.mean$PANEL), ]$BOX, unique(dot.coord[order(dot.coord$group, dot.coord$PANEL), c("group", "PANEL")])$group)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\n(tempo.mean$BOX, tempo.mean$PANEL) AND (dot.coord$group, dot.coord$PANEL) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + tempo <- unique(dot.coord[order(dot.coord$group, dot.coord$PANEL), c(categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){if(dot.categ != ini.dot.categ){dot.categ}}, if( ! is.null(facet.categ)){facet.categ}), drop = FALSE]) + # names(tempo) <- paste0(names(tempo), ".mean") + tempo.mean <- data.frame(tempo.mean[order(tempo.mean$BOX, tempo.mean$PANEL), ], tempo, stringsAsFactors = TRUE) + } + } + # at that stage, categ color and dot color are correctly attributed in data1, box.coord and dot.coord + # end y dot coordinates recovery (create ini.box.coord, dot.coord and modify data1) + # ylim range + if(is.null(y.lim)){ + y.lim <- tempo.graph.info.ini$layout$panel_params[[1]]$y.range # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only + if(any(( ! is.finite(y.lim)) | is.na(y.lim)) | length(y.lim) != 2){ # kept but normally no more Inf in data1 # normally no NA with is.finite, etc. + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\ntempo.graph.info.ini$layout$panel_params[[1]]$y.range[1] CONTAINS NA OR Inf OR HAS LENGTH 1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + }else if(y.log != "no"){ + y.lim <- get(y.log)(y.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + } + if(y.log != "no"){ + # normally this control is not necessary anymore + if(any( ! is.finite(y.lim))){ # normally no NA with is.finite + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + if(suppressWarnings(all(y.lim %in% c(Inf, -Inf)))){ # all() without na.rm -> ok because y.lim cannot be NA (tested above) + # normally this control is not necessary anymore + tempo.cat <- paste0("ERROR IN ", function.name, " y.lim CONTAINS Inf VALUES, MAYBE BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY OR BECAUSE OF LOG SCALE REQUIREMENT") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if(suppressWarnings(any(is.na(y.lim)))){ # normally no NA with is.na + # normally this control is not necessary anymore + tempo.cat <- paste0("ERROR IN ", function.name, " y.lim CONTAINS NA OR NaN VALUES, MAYBE BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY OR BECAUSE OF LOG SCALE REQUIREMENT") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + y.lim.order <- order(y.lim) # to deal with inverse axis + y.lim <- sort(y.lim) + y.lim[1] <- y.lim[1] - abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(y.lim.order) > 0 medians not inversed axis + y.lim[2] <- y.lim[2] + abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(y.lim.order) > 0 medians not inversed axis + if(y.include.zero == TRUE){ # no need to check y.log != "no" because done before + y.lim <- range(c(y.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only + } + y.lim <- y.lim[y.lim.order] + if(any(is.na(y.lim))){ # normally no NA with is.na + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 2") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end ylim range + + + + + + + # drawing + # constant part + tempo.gg.name <- "gg.indiv.plot." + tempo.gg.count <- 0 + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add is directly put here to deal with additional variable of data, like when using facet_grid. No problem if add is a theme, will be dealt below + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(x.lab)){categ[1]}else{x.lab})) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(y.lab)){y}else{y.lab})) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) + # text angle management + axis.just <- fun_gg_just(angle = x.angle, pos = ifelse(vertical == TRUE, "bottom", "left"), kind = "axis") + # end text angle management + add.check <- TRUE + if( ! is.null(add)){ # if add is NULL, then = 0 + if(grepl(pattern = "ggplot2\\s*::\\s*theme", add) == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT\n-> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER\n-> article ARGUMENT WILL BE IGNORED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + add.check <- FALSE + } + } + if(add.check == TRUE & article == TRUE){ + # WARNING: not possible to add theme()several times. NO message but the last one overwrites the others + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) + if(grid == TRUE){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + line = ggplot2::element_line(size = 0.5), + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis + axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis + panel.grid.major.x = if(vertical == TRUE){NULL}else{ggplot2::element_line(colour = "grey85", size = 0.75)}, + panel.grid.major.y = if(vertical == TRUE){ggplot2::element_line(colour = "grey85", size = 0.75)}else{NULL}, + panel.grid.minor.y = if(vertical == TRUE){ggplot2::element_line(colour = "grey90", size = 0.25)}else{NULL}, + axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, + axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}, + strip.background = ggplot2::element_rect(fill = NA, colour = NA) # for facet background + )) + }else{ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + line = ggplot2::element_line(size = 0.5), + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + axis.line.y.left = ggplot2::element_line(colour = "black"), + axis.line.x.bottom = ggplot2::element_line(colour = "black"), + axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, + axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}, + strip.background = ggplot2::element_rect(fill = NA, colour = NA) + )) + } + }else if(add.check == TRUE & article == FALSE){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + line = ggplot2::element_line(size = 0.5), + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + panel.background = ggplot2::element_rect(fill = "grey95"), + axis.line.y.left = ggplot2::element_line(colour = "black"), + axis.line.x.bottom = ggplot2::element_line(colour = "black"), + panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.minor.x = ggplot2::element_blank(), + panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), + strip.background = ggplot2::element_rect(fill = NA, colour = NA), + axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, + axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)} + )) + } + # Contrary to fun_gg_bar(), cannot plot the boxplot right now, because I need the dots plotted first + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, group = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), color = NA, width = box.width, fill = NA)) # this is to set the graph (i.e., a blanck boxplot to be able to use x coordinates to plot dots before boxes) + # end constant part + + + + + # graphic info recovery (including means) + tempo.graph.info <- ggplot2::ggplot_build(eval(parse(text = paste0(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, notch = box.notch, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}) + ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color})')))) # will be recovered later again, when ylim will be considered + tempo.yx.ratio <- (tempo.graph.info$layout$panel_params[[1]]$y.range[2] - tempo.graph.info$layout$panel_params[[1]]$y.range[1]) / (tempo.graph.info$layout$panel_params[[1]]$x.range[2] - tempo.graph.info$layout$panel_params[[1]]$x.range[1]) + box.coord <- tempo.graph.info$data[[2]] # to have the summary statistics of the plot. Contrary to ini.box.plot, now integrates ylim Here because can be required for stat.pos when just box are plotted + box.coord$x <- as.numeric(box.coord$x) # because x is of special class that block comparison of values using identical + box.coord$PANEL <- as.numeric(box.coord$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? + box.coord <- box.coord[order(box.coord$group, box.coord$PANEL), ] + if( ! (identical(tempo.mean$BOX, box.coord$group) & identical(tempo.mean$PANEL, box.coord$PANEL))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nidentical(tempo.mean$BOX, box.coord$group) & identical(tempo.mean$PANEL, box.coord$PANEL) DO NOT HAVE THE SAME VALUE ORDER") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + # tempo <- c(categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){if(dot.categ != ini.dot.categ){dot.categ}}, if( ! is.null(facet.categ)){facet.categ}) + if(any(names(tempo.mean) %in% names(box.coord), na.rm = TRUE)){ + names(tempo.mean)[names(tempo.mean) %in% names(box.coord)] <- paste0(names(tempo.mean)[names(tempo.mean) %in% names(box.coord)], ".mean") + } + box.coord <- data.frame(box.coord, tempo.mean, stringsAsFactors = TRUE) + } + # end graphic info recovery (including means) + + + + # stat output (will also serve for boxplot and mean display) + # x not added know to do not have them in stat.nolog + stat <- data.frame( + MIN = box.coord$ymin_final, + QUART1 = box.coord$lower, + MEDIAN = box.coord$middle, + MEAN = box.coord$MEAN, + QUART3 = box.coord$upper, + MAX = box.coord$ymax_final, + WHISK_INF = box.coord$ymin, + BOX_INF = box.coord$lower, + NOTCH_INF = box.coord$notchlower, + NOTCH_SUP = box.coord$notchupper, + BOX_SUP = box.coord$upper, + WHISK_SUP = box.coord$ymax, + OUTLIERS = box.coord["outliers"], + tempo.mean[colnames(tempo.mean) != "MEAN"], + COLOR = box.coord$fill, + stringsAsFactors = TRUE + ) # box.coord["outliers"] written like this because it is a list. X coordinates not put now because several features to set + names(stat)[names(stat) == "outliers"] <- "OUTLIERS" + stat.nolog <- stat # stat.nolog ini will serve for outputs + if(y.log != "no"){ + stat.nolog[c("MIN", "QUART1", "MEDIAN", "MEAN", "QUART3", "MAX", "WHISK_INF", "BOX_INF", "NOTCH_INF", "NOTCH_SUP", "BOX_SUP", "WHISK_SUP")] <- ifelse(y.log == "log2", 2, 10)^(stat.nolog[c("MIN", "QUART1", "MEDIAN", "MEAN", "QUART3", "MAX", "WHISK_INF", "BOX_INF", "NOTCH_INF", "NOTCH_SUP", "BOX_SUP", "WHISK_SUP")]) + stat.nolog$OUTLIERS <- lapply(stat.nolog$OUTLIERS, FUN = function(X){ifelse(y.log == "log2", 2, 10)^X}) + } + # end stat output (will also serve for boxplot and mean display) + + + + + + + # x coordinates management (for random plotting and for stat display) + # width commputations + width.ini <- c(box.coord$xmax - box.coord$xmin)[1] # all the box widths are equal here. Only the first one taken + width.correct <- width.ini * box.space / 2 + if( ! (identical(stat$BOX, box.coord$group) & identical(stat$PANEL, box.coord$PANEL))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nidentical(stat$BOX, box.coord$group) & identical(stat$PANEL, box.coord$PANEL) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + stat <- data.frame( + stat, + X = box.coord$x, + X_BOX_INF = box.coord$xmin + width.correct, + X_BOX_SUP = box.coord$xmax - width.correct, + X_NOTCH_INF = box.coord$x - (box.coord$x - (box.coord$xmin + width.correct)) / 2, + X_NOTCH_SUP = box.coord$x + (box.coord$x - (box.coord$xmin + width.correct)) / 2, + X_WHISK_INF = box.coord$x - (box.coord$x - (box.coord$xmin + width.correct)) * box.whisker.width, + X_WHISK_SUP = box.coord$x + (box.coord$x - (box.coord$xmin + width.correct)) * box.whisker.width, + # tempo.mean[colnames(tempo.mean) != "MEAN"], # already added above + stringsAsFactors = TRUE + ) + stat$COLOR <- factor(stat$COLOR, levels = unique(categ.color)) + if( ! all(stat$NOTCH_SUP < stat$BOX_SUP & stat$NOTCH_INF > stat$BOX_INF, na.rm = TRUE) & box.notch == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") SOME NOTCHES ARE BEYOND BOX HINGES. TRY ARGUMENT box.notch = FALSE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + dot.jitter <- c((box.coord$xmax - width.correct) - (box.coord$xmin + width.correct))[1] * dot.jitter # real dot.jitter. (box.coord$xmin + width.correct) - (box.coord$xmax - width.correct))[1] is the width of the box. Is equivalent to (box.coord$x - (box.coord$xmin + width.correct))[1] * 2 + # end width commputations + if( ! is.null(dot.color)){ + # random dots + if(dot.tidy == FALSE){ + dot.coord.rd1 <- merge(dot.coord, box.coord[c("fill", "PANEL", "group", "x")], by = c("PANEL", "group"), sort = FALSE) # rd for random. Send the coord of the boxes into the coord data.frame of the dots (in the column x.y). WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in box.coord. Thus, no need to consider fill column + if(nrow(dot.coord.rd1) != nrow(dot.coord)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd1 DATA FRAME. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + sampled.dot.jitter <- if(nrow(dot.coord.rd1)== 1L){runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2)}else{sample(x = runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2), size = nrow(dot.coord.rd1), replace = FALSE)} + dot.coord.rd2 <- data.frame(dot.coord.rd1, dot.x = dot.coord.rd1$x.y + sampled.dot.jitter, stringsAsFactors = TRUE) # set the dot.jitter thanks to runif and dot.jitter range. Then, send the coord of the boxes into the coord data.frame of the dots (in the column x.y) + if(length(categ)== 1L){ + tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(data1[, categ[1]]), stringsAsFactors = TRUE)) # categ[1] is factor + names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") + verif <- paste0(categ[1], ".check") + }else if(length(categ) == 2L){ + tempo.data1 <- unique( + data.frame( + data1[c(categ[1], categ[2])], + group = as.integer(factor(paste0( + formatC(as.integer(data1[, categ[2]]), width = nchar(max(as.integer(data1[, categ[2]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking + ".", + formatC(as.integer(data1[, categ[1]]), width = nchar(max(as.integer(data1[, categ[1]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking + )), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number + ) + ) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis + names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") + names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") + verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) + }else{ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 3") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + dot.coord.rd3 <- merge(dot.coord.rd2, tempo.data1, by = intersect("group", "group"), sort = FALSE) # send the factors of data1 into coord. WARNING: I have replaced by = "group" by intersect("group", "group") because of an error due to wrong group group merging in dot.coord.rd3 + if(nrow(dot.coord.rd3) != nrow(dot.coord) | ( ! fun_comp_2d(dot.coord.rd3[categ], dot.coord.rd3[verif])$identical.content)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd3 DATA FRAME. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end random dots + } + # tidy dots + # coordinates are recovered during plotting (see dot.coord.tidy1 below) + # end tidy dots + } + # end x coordinates management (for random plotting and for stat display) + + + + + + # boxplot display before dot display if box.fill = TRUE + coord.names <- NULL + # creation of the data frame for (main box + legend) and data frame for means + if(box.notch == FALSE){ + for(i3 in 1:length(categ)){ + if(i3== 1L){ + tempo.polygon <- data.frame(GROUPX = c(t(stat[, rep(categ[i3], 5)])), stringsAsFactors = TRUE) + }else{ + tempo.polygon <- cbind(tempo.polygon, c(t(stat[, rep(categ[i3], 5)])), stringsAsFactors = TRUE) + } + } + names(tempo.polygon) <- categ + tempo.polygon <- data.frame(X = c(t(stat[, c("X_BOX_INF", "X_BOX_SUP", "X_BOX_SUP", "X_BOX_INF", "X_BOX_INF")])), Y = c(t(stat[, c("BOX_INF", "BOX_INF", "BOX_SUP", "BOX_SUP", "BOX_INF")])), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), BOX = as.character(c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX")]))), tempo.polygon, stringsAsFactors = TRUE) + if( ! is.null(facet.categ)){ + for(i4 in 1:length(facet.categ)){ + tempo.polygon <- data.frame(tempo.polygon, c(t(stat[, c(facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4])])), stringsAsFactors = TRUE) + names(tempo.polygon)[length(names(tempo.polygon))] <- facet.categ[i4] + } + } + }else{ + for(i3 in 1:length(categ)){ + if(i3== 1L){ + tempo.polygon <- data.frame(GROUPX = c(t(stat[, rep(categ[i3], 11)])), stringsAsFactors = TRUE) + }else{ + tempo.polygon <- cbind(tempo.polygon, c(t(stat[, rep(categ[i3], 11)])), stringsAsFactors = TRUE) + } + } + names(tempo.polygon) <- categ + tempo.polygon <- data.frame(X = c(t(stat[, c("X_BOX_INF", "X_BOX_SUP", "X_BOX_SUP", "X_NOTCH_SUP", "X_BOX_SUP", "X_BOX_SUP", "X_BOX_INF", "X_BOX_INF", "X_NOTCH_INF", "X_BOX_INF", "X_BOX_INF")])), Y = c(t(stat[, c("BOX_INF", "BOX_INF", "NOTCH_INF", "MEDIAN", "NOTCH_SUP", "BOX_SUP", "BOX_SUP", "NOTCH_SUP", "MEDIAN", "NOTCH_INF", "BOX_INF")])), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), BOX = as.character(c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX")]))), tempo.polygon, stringsAsFactors = TRUE) + if( ! is.null(facet.categ)){ + for(i4 in 1:length(facet.categ)){ + tempo.polygon <- data.frame(tempo.polygon, c(t(stat[, c(facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4])])), stringsAsFactors = TRUE) + names(tempo.polygon)[length(names(tempo.polygon))] <- facet.categ[i4] + } + } + } + tempo.polygon$COLOR <- factor(tempo.polygon$COLOR, levels = unique(categ.color)) + if( ! is.null(categ.class.order)){ + for(i3 in 1:length(categ)){ + tempo.polygon[, categ[i3]] <- factor(tempo.polygon[, categ[i3]], levels = categ.class.order[[i3]]) + } + } + # modified name of dot.categ column (e.g., "Categ1_DOT") must be included for boxplot using ridy dots + if( ! is.null(dot.color) & ! is.null(dot.categ)){ + if(dot.categ != ini.dot.categ){ + tempo.polygon <- data.frame(tempo.polygon, GROUPX = tempo.polygon[, ini.dot.categ], stringsAsFactors = TRUE) + names(tempo.polygon)[names(tempo.polygon) == "GROUPX"] <- dot.categ + + } + } + tempo.diamon.mean <- data.frame(X = c(t(stat[, c("X", "X_NOTCH_INF", "X", "X_NOTCH_SUP", "X")])), Y = c(t(cbind(stat["MEAN"] - (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stat["MEAN"], stat["MEAN"] + (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stat["MEAN"], stat["MEAN"] - (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stringsAsFactors = TRUE))), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), GROUP = c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX")])), stringsAsFactors = TRUE) # stringsAsFactors = TRUE for cbind() because stat["MEAN"] is a data frame. Otherwise, stringsAsFactors is not an argument for cbind() on vectors + if( ! is.null(facet.categ)){ + for(i3 in 1:length(facet.categ)){ + tempo.diamon.mean <- data.frame(tempo.diamon.mean, c(t(stat[, c(facet.categ[i3], facet.categ[i3], facet.categ[i3], facet.categ[i3], facet.categ[i3])])), stringsAsFactors = TRUE) + names(tempo.diamon.mean)[length(names(tempo.diamon.mean))] <- facet.categ[i3] + } + } + tempo.diamon.mean$COLOR <- factor(tempo.diamon.mean$COLOR, levels = unique(categ.color)) + # end creation of the data frame for (main box + legend) and data frame for means + if(box.fill == TRUE){ + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[length(categ)], fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, size = box.line.size, notch = box.notch, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}, alpha = box.alpha, outlier.shape = if( ! is.null(dot.color)){NA}else{21}, outlier.color = if( ! is.null(dot.color)){NA}else{dot.border.color}, outlier.fill = if( ! is.null(dot.color)){NA}else{NULL}, outlier.size = if( ! is.null(dot.color)){NA}else{dot.size}, outlier.stroke = if( ! is.null(dot.color)){NA}else{dot.border.size}, outlier.alpha = if( ! is.null(dot.color)){NA}else{dot.alpha})) # the color, size, etc. of the outliers are dealt here. outlier.color = NA to do not plot outliers when dots are already plotted. Finally, boxplot redrawn (see below) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_polygon( + data = tempo.polygon, + mapping = ggplot2::aes_string(x = "X", y = "Y", group = "BOX", fill = categ[length(categ)], color = categ[length(categ)]), + size = box.line.size, + alpha = box.alpha # works only for fill, not for color + )) + coord.names <- c(coord.names, "main.box") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha)) # + coord.names <- c(coord.names, "sup.whisker") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_INF, yend = WHISK_INF, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha)) # + coord.names <- c(coord.names, "inf.whisker") + if(box.whisker.width > 0){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha, lineend = "round")) # + coord.names <- c(coord.names, "sup.whisker.edge") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_INF, yend = WHISK_INF, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha, lineend = "round")) # + coord.names <- c(coord.names, "inf.whisker.edge") + } + if(box.mean == TRUE){ + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = stat, mapping = ggplot2::aes_string(x = "X", y = "MEAN", group = categ[length(categ)]), shape = 23, stroke = box.line.size * 2, fill = stat$COLOR, size = box.mean.size, color = "black", alpha = box.alpha)) # group used in aesthetic to do not have it in the legend + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_polygon( + data = tempo.diamon.mean, + mapping = ggplot2::aes(x = X, y = Y, group = GROUP), + fill = tempo.diamon.mean[, "COLOR"], + color = hsv(0, 0, 0, alpha = box.alpha), # outline of the polygon in black but with alpha + size = box.line.size, + alpha = box.alpha + )) + coord.names <- c(coord.names, "mean") + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = if(box.notch == FALSE){X_BOX_INF}else{X_NOTCH_INF}, xend = if(box.notch == FALSE){X_BOX_SUP}else{X_NOTCH_SUP}, y = MEDIAN, yend = MEDIAN, group = categ[length(categ)]), color = "black", size = box.line.size * 2, alpha = box.alpha)) # + coord.names <- c(coord.names, "median") + } + # end boxplot display before dot display if box.fill = TRUE + + + + + + + # dot display + if( ! is.null(dot.color)){ + if(dot.tidy == FALSE){ + if(is.null(dot.categ)){ + if(dot.border.size == 0){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( + data = dot.coord.rd3, + mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), + size = dot.size, + shape = 19, + color = dot.coord.rd3$dot.color, + alpha = dot.alpha + )) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic + }else{ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( + data = dot.coord.rd3, + mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), + shape = 21, + stroke = dot.border.size, + color = if(is.null(dot.border.color)){dot.coord.rd3$dot.color}else{rep(dot.border.color, nrow(dot.coord.rd3))}, + size = dot.size, + fill = dot.coord.rd3$dot.color, + alpha = dot.alpha + )) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic + } + }else{ + if(dot.border.size == 0){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( + data = dot.coord.rd3, + mapping = ggplot2::aes_string(x = "dot.x", y = "y", alpha = dot.categ), + size = dot.size, + shape = 19, + color = dot.coord.rd3$dot.color + )) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic + }else{ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( + data = dot.coord.rd3, + mapping = ggplot2::aes_string(x = "dot.x", y = "y", alpha = dot.categ), + size = dot.size, + shape = 21, + stroke = dot.border.size, + color = if(is.null(dot.border.color)){dot.coord.rd3$dot.color}else{rep(dot.border.color, nrow(dot.coord.rd3))}, + fill = dot.coord.rd3$dot.color + )) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = dot.legend.name, values = rep(dot.alpha, length(dot.categ.class.order)), guide = ggplot2::guide_legend(override.aes = list(fill = dot.color, color = if(is.null(dot.border.color)){dot.color}else{dot.border.color}, stroke = dot.border.size, alpha = dot.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + } + coord.names <- c(coord.names, "dots") + }else if(dot.tidy == TRUE){ + # here plot using group -> no scale + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_dotplot( + data = dot.coord, + mapping = ggplot2::aes_string(x = categ[1], y = "y", group = "group"), # not dot.categ here because the classes of dot.categ create new separations + position = ggplot2::position_dodge(width = box.width), + binpositions = "all", + binaxis = "y", + stackdir = "center", + alpha = dot.alpha, + fill = dot.coord$dot.color, + stroke = dot.border.size, + color = if(is.null(dot.border.color)){dot.coord$dot.color}else{rep(dot.border.color, nrow(dot.coord))}, + show.legend = FALSE, # WARNING: do not use show.legend = TRUE because it uses the arguments outside aes() as aesthetics (here color and fill). Thus I must find a way using ggplot2::scale_discrete_manual() + binwidth = (y.lim[2] - y.lim[1]) / dot.tidy.bin.nb + )) # geom_dotplot ggplot2 v3.3.0: I had to remove rev() in fill and color # very weird behavior of geom_dotplot ggplot2 v3.2.1, (1) because with aes group = (to avoid legend), the dot plotting is not good in term of coordinates, and (2) because data1 seems reorderer according to x = categ[1] before plotting. Thus, I have to use fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"] to have the good corresponding colors # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) + coord.names <- c(coord.names, "dots") + if( ! is.null(dot.categ)){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_dotplot( + data = dot.coord, + mapping = ggplot2::aes_string(x = categ[1], y = "y", alpha = dot.categ), # not dot.categ here because the classes of dot.categ create new separations + position = ggplot2::position_dodge(width = box.width), + binpositions = "all", + binaxis = "y", + stackdir = "center", + fill = NA, + stroke = NA, + color = NA, + # WARNING: do not use show.legend = TRUE because it uses the arguments outside aes() as aesthetics (here color and fill). Thus I must find a way using ggplot2::scale_discrete_manual() + binwidth = (y.lim[2] - y.lim[1]) / dot.tidy.bin.nb + )) # geom_dotplot ggplot2 v3.3.0: I had to remove rev() in fill and color # very weird behavior of geom_dotplot ggplot2 v3.2.1, (1) because with aes group = (to avoid legend), the dot plotting is not good in term of coordinates, and (2) because data1 seems reorderer according to x = categ[1] before plotting. Thus, I have to use fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"] to have the good corresponding colors # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "linetype", name = dot.legend.name, values = rep(1, length(categ.color)))) # values = rep("black", length(categ.color)) are the values of color (which is the border color of dots), and this modify the border color on the plot. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + coord.names <- c(coord.names, "bad_remove") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = dot.legend.name, values = rep(dot.alpha, length(dot.categ.class.order)), labels = dot.categ.class.order, guide = ggplot2::guide_legend(title = if(ini.dot.categ == categ[length(categ)]){dot.categ}else{ini.dot.categ}, override.aes = list(fill = levels(dot.coord$dot.color), color = if(is.null(dot.border.color)){levels(dot.coord$dot.color)}else{dot.border.color}, stroke = dot.border.size, alpha = dot.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + } + # coordinates of tidy dots + tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data # to have the tidy dot coordinates + if(length(which(sapply(X = tempo.coord, FUN = function(X){any(names(X) == "binwidth", na.rm = TRUE)}))) != 1){ # detect the compartment of tempo.coord which is the binned data frame + # if(length(which(sapply(tempo.coord, FUN = nrow) == nrow(data1))) > if(is.null(dot.categ)){1}else{2}){ # this does not work if only one dot per class, thus replaced by above # if(is.null(dot.categ)){1}else{2} because 1 dotplot if dot.categ is NULL and 2 dotplots if not, with the second being a blank dotplot with wrong coordinates. Thus take the first in that situation + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nEITHER MORE THAN 1 OR NO COMPARTMENT HAVING A DATA FRAME WITH binwidth AS COLUMN NAME IN THE tempo.coord LIST (FOR TIDY DOT COORDINATES). CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + # dot.coord.tidy1 <- tempo.coord[[which(sapply(tempo.coord, FUN = nrow) == nrow(data1))[1]]] # this does not work if only one dot per class, thus replaced by above # the second being a blank dotplot with wrong coordinates. Thus take the first whatever situation + dot.coord.tidy1 <- tempo.coord[[which(sapply(X = tempo.coord, FUN = function(X){any(names(X) == "binwidth", na.rm = TRUE)}))]] # detect the compartment of tempo.coord which is the binned data frame + dot.coord.tidy1$x <- as.numeric(dot.coord.tidy1$x) # because weird class + dot.coord.tidy1$PANEL <- as.numeric(dot.coord.tidy1$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? + } + # tempo.box.coord <- merge(box.coord, unique(dot.coord[, c("PANEL", "group", categ)]), by = c("PANEL", "group"), sort = FALSE) # not required anymore because box.coord already contains categ do not add dot.categ and tidy_group_coord here because the coordinates are for stats. Add the categ in box.coord. WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in box.coord. Thus, no need to consider fill column + # below inactivated because not true when dealing with dot.categ different from categ + # if(nrow(tempo.box.coord) != nrow(box.coord)){ + # tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT tempo.box.coord DATA FRAME. CODE HAS TO BE MODIFIED") + # stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + # } + dot.coord.tidy2 <- merge(dot.coord.tidy1, box.coord[c("fill", "PANEL", "group", "x", categ)], by = c("PANEL", "group"), sort = FALSE) # send the coord of the boxes into the coord data.frame of the dots (in the column x.y).WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in tempo.box.coord. Thus, no need to consider fill colum # DANGER: from here the fill.y and x.y (from tempo.box.coord) are not good in dot.coord.tidy2. It is ok because Categ1 Categ2 from tempo.box.coord are ok with the group column from dot.coord.tidy1. This is due to the fact that dot.coord.tidy resulting from geom_dotplot does not make the same groups as the other functions + if(nrow(dot.coord.tidy2) != nrow(dot.coord)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy2 DATA FRAME. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # From here, check for dot.coord.tidy3 which wil be important for stat over the plot. WARNING: dot.categ has nothing to do here for stat coordinates. Thus, not in tempo.data1 + if(length(categ)== 1L){ + tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(data1[, categ[1]]), stringsAsFactors = TRUE)) # categ[1] is factor + names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") + verif <- paste0(categ[1], ".check") + }else if(length(categ) == 2L){ + tempo.data1 <- unique( + data.frame( + data1[c(categ[1], categ[2])], + group = as.integer(factor(paste0( + formatC(as.integer(data1[, categ[2]]), width = nchar(max(as.integer(data1[, categ[2]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking + ".", + formatC(as.integer(data1[, categ[1]]), width = nchar(max(as.integer(data1[, categ[1]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking + )), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number + ) + ) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis + names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") + names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") + verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) + }else{ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 4") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + dot.coord.tidy3 <- merge(dot.coord.tidy2, tempo.data1, by = intersect("group", "group"), sort = FALSE) # send the factors of data1 into coord. WARNING: I have tested intersect("group", "group") instead of by = "group". May be come back to by = "group" in case of error. But I did this because of an error in dot.coord.rd3 above + if(nrow(dot.coord.tidy3) != nrow(dot.coord) | ( ! fun_comp_2d(dot.coord.tidy3[categ], dot.coord.tidy3[verif])$identical.content)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy3 DATA FRAME. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end coordinates of tidy dots + } + } + # end dot display + + + + # boxplot display (if box.fill = FALSE, otherwise, already plotted above) + if(box.fill == TRUE){ + # overcome "work only for the filling of boxes, not for the frame. See https://github.com/tidyverse/ggplot2/issues/252" + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color}, guide = ggplot2::guide_legend(order = 1))) #, guide = ggplot2::guide_legend(override.aes = list(fill = levels(tempo.polygon$COLOR), color = "black")))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = rep(hsv(0, 0, 0, alpha = box.alpha), length(unique(data1[, categ[length(categ)]]))), guide = ggplot2::guide_legend(order = 1))) # , guide = ggplot2::guide_legend(override.aes = list(color = "black", alpha = box.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor # outline of the polygon in black but with alpha + }else{ + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[length(categ)], fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, size = box.line.size, notch = box.notch, alpha = box.alpha, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}, outlier.shape = if( ! is.null(dot.color)){NA}else{21}, outlier.color = if( ! is.null(dot.color)){NA}else{if(dot.border.size == 0){NA}else{dot.border.color}}, outlier.fill = if( ! is.null(dot.color)){NA}else{NULL}, outlier.size = if( ! is.null(dot.color)){NA}else{dot.size}, outlier.stroke = if( ! is.null(dot.color)){NA}else{dot.border.size}, outlier.alpha = if( ! is.null(dot.color)){NA}else{dot.alpha})) # the color, size, etc. of the outliers are dealt here. outlier.color = NA to do not plot outliers when dots are already plotted + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_path( + data = tempo.polygon, + mapping = ggplot2::aes_string(x = "X", y = "Y", group = "BOX", color = categ[length(categ)]), + size = box.line.size, + alpha = box.alpha, + lineend = "round", + linejoin = "round" + )) + coord.names <- c(coord.names, "main.box") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = if(box.notch == FALSE){X_BOX_INF}else{X_NOTCH_INF}, xend = if(box.notch == FALSE){X_BOX_SUP}else{X_NOTCH_SUP}, y = MEDIAN, yend = MEDIAN, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size * 2, alpha = box.alpha)) # + coord.names <- c(coord.names, "median") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha)) # + coord.names <- c(coord.names, "sup.whisker") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_INF, yend = WHISK_INF, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha)) # + coord.names <- c(coord.names, "inf.whisker") + if(box.whisker.width > 0){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha, lineend = "round")) # + coord.names <- c(coord.names, "sup.whisker.edge") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_INF, yend = WHISK_INF, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha, lineend = "round")) # + coord.names <- c(coord.names, "inf.whisker.edge") + } + if(box.mean == TRUE){ + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = stat, mapping = ggplot2::aes_string(x = "X", y = "MEAN", group = categ[length(categ)]), shape = 23, stroke = box.line.size * 2, color = stat$COLOR, size = box.mean.size, fill = NA, alpha = box.alpha)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_path( + data = tempo.diamon.mean, + mapping = ggplot2::aes(x = X, y = Y, group = GROUP), + color = tempo.diamon.mean[, "COLOR"], + size = box.line.size, + alpha = box.alpha, + lineend = "round", + linejoin = "round" + )) + coord.names <- c(coord.names, "mean") + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = rep(NA, length(unique(data1[, categ[length(categ)]]))))) #, guide = ggplot2::guide_legend(override.aes = list(color = categ.color)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color}, guide = ggplot2::guide_legend(override.aes = list(alpha = if(plot == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list()) == 0L & Sys.info()["sysname"] == "Windows"))){1}else{box.alpha})))) # , guide = ggplot2::guide_legend(override.aes = list(color = as.character(categ.color))))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + if(plot == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list()) == 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(box.alpha == 0){ # remove box legend because no boxes drawn + # add this after the scale_xxx_manual() for boxplots + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE)) # inactivate the legend + } + # end boxplot display (if box.fill = FALSE, otherwise, already plotted above) + + + + + # stat display + # layer after dots but ok, behind dots on the plot + if( ! is.null(stat.pos)){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NUMBERS DISPLAYED ARE ", ifelse(stat.mean == FALSE, "MEDIANS", "MEANS")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + if(stat.pos == "top"){ + tempo.stat <- data.frame(stat, Y = y.lim[2], stringsAsFactors = TRUE) # I had to create a data frame for geom_tex() so that facet is taken into account, (ggplot2::annotate() does not deal with facet because no data and mapping arguments). Of note, facet.categ is in tempo.stat, via tempo.mean, via dot.coord + if(stat.mean == FALSE){tempo.stat$MEDIAN <- formatC(stat.nolog$MEDIAN, digit = 2, drop0trailing = TRUE, format = "f")}else{tempo.stat$MEAN <- formatC(stat.nolog$MEAN, digit = 2, drop0trailing = TRUE, format = "f")} + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( + data = tempo.stat, + mapping = ggplot2::aes_string(x = "X", y = "Y", label = ifelse(stat.mean == FALSE, "MEDIAN", "MEAN")), + size = stat.size, + color = "black", + angle = stat.angle, + hjust = stat.just$hjust, + vjust = stat.just$vjust + )) # stat$X used here because identical to stat.nolog but has the X. WARNING: no need of order() for labels because box.coord$x set the order. For justification, see https://stackoverflow.com/questions/7263849/what-do-hjust-and-vjust-do-when-making-a-plot-using-ggplot + coord.names <- c(coord.names, "stat.pos") + }else if(stat.pos == "above"){ + # stat coordinates + if( ! is.null(dot.color)){ # for text just above max dot + if(dot.tidy == FALSE){ + tempo.stat.ini <- dot.coord.rd3 + }else if(dot.tidy == TRUE){ + tempo.stat.ini <- dot.coord.tidy3 + tempo.stat.ini$x.y <- tempo.stat.ini$x.x # this is just to be able to use tempo.stat.ini$x.y for untidy or tidy dots (remember that dot.coord.tidy3$x.y is not good, see above) + } + stat.coord1 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ)== 1L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ)== 1L){c("group", "PANEL", "x.y", categ[1])}else if(length(categ) == 2L){c("group", "PANEL", "x.y", categ[1], categ[2])} ; x.env}, FUN = min, na.rm = TRUE) + names(stat.coord1)[names(stat.coord1) == "y"] <- "dot.min" + stat.coord2 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ)== 1L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ)== 1L){c("group", "PANEL", "x.y", categ[1])}else if(length(categ) == 2L){c("group", "PANEL", "x.y", categ[1], categ[2])} ; x.env}, FUN = max, na.rm = TRUE) + names(stat.coord2) <- paste0(names(stat.coord2), "_from.dot.max") + names(stat.coord2)[names(stat.coord2) == "y_from.dot.max"] <- "dot.max" + stat.coord3 <- cbind(box.coord[order(box.coord$group, box.coord$PANEL), ], stat.coord1[order(stat.coord1$group, stat.coord1$x.y), ], stat.coord2[order(stat.coord2$group, stat.coord2$x.y), ], stringsAsFactors = TRUE) # + if( ! all(identical(round(stat.coord3$x, 9), round(as.numeric(stat.coord3$x.y), 9)), na.rm = TRUE)){ # as.numeric() because stat.coord3$x is class "mapped_discrete" "numeric" + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nFUSION OF box.coord, stat.coord1 AND stat.coord2 ACCORDING TO box.coord$x, stat.coord1$x.y AND stat.coord2$x.y IS NOT CORRECT. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # text.coord <- stat.coord3[, c("x", "group", "dot.min", "dot.max")] + # names(text.coord)[names(text.coord) == "dot.min"] <- "text.min.pos" + #names(text.coord)[names(text.coord) == "dot.max"] <- "text.max.pos" + box.coord <- box.coord[order(box.coord$x, box.coord$group, box.coord$PANEL), ] + # text.coord <- text.coord[order(text.coord$x), ] # to be sure to have the two objects in the same order for x. WARNING: cannot add identical(as.integer(text.coord$group), as.integer(box.coord$group)) because with error, the correspondence between x and group is not the same + stat.coord3 <- stat.coord3[order(stat.coord3$x, stat.coord3$group, stat.coord3$PANEL), ] # to be sure to have the two objects in the same order for x. WARNING: cannot add identical(as.integer(text.coord$group), as.integer(box.coord$group)) because with error, the correspondence between x and group is not the same + if( ! (identical(box.coord$x, stat.coord3$x) & identical(box.coord$group, stat.coord3$group) & identical(box.coord$PANEL, stat.coord3$PANEL))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\ntext.coord AND box.coord DO NOT HAVE THE SAME x, group AND PANEL COLUMN CONTENT") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + }else{ + stat.coord3 <- box.coord + } + stat.coord3 <- data.frame( + stat.coord3, + Y = stat.coord3[, ifelse( + is.null(dot.color), + ifelse(diff(y.lim) > 0, "ymax", "ymin"), + ifelse(diff(y.lim) > 0, "ymax_final", "ymin_final") + )], + stringsAsFactors = TRUE + ) # ymax is top whisker, ymax_final is top dot + # stat.coord3 <- data.frame(stat.coord3, Y = vector("numeric", length = nrow(stat.coord3)), stringsAsFactors = TRUE) + # check.Y <- as.logical(stat.coord3$Y) # convert everything in Y into FALSE (because Y is full of zero) + # end stat coordinates + # stat display + # performed twice: first for y values >=0, then y values < 0, because only a single value allowed for hjust anf vjust + if(stat.mean == FALSE){ + tempo.center.ref <- "middle" + }else{ + tempo.center.ref <- "MEAN" + } + # if(is.null(dot.color)){ + # tempo.low.ref <- "ymin" + # tempo.high.ref <- "ymax" + # }else{ + # tempo.low.ref <- "ymin_final" + # tempo.high.ref <- "ymax_final" + # } + # tempo.log.high <- if(diff(y.lim) > 0){stat.coord3[, tempo.center.ref] >= 0}else{stat.coord3[, tempo.center.ref] < 0} + # tempo.log.low <- if(diff(y.lim) > 0){stat.coord3[, tempo.center.ref] < 0}else{stat.coord3[, tempo.center.ref] >= 0} + # stat.coord3$Y[tempo.log.high] <- stat.coord3[tempo.log.high, tempo.high.ref] + # stat.coord3$Y[tempo.log.low] <- stat.coord3[tempo.log.low, tempo.low.ref] + # add distance + stat.coord3$Y <- stat.coord3$Y + diff(y.lim) * stat.dist / 100 + # end add distance + # correct median or mean text format + if(y.log != "no"){ + stat.coord3[, tempo.center.ref] <- ifelse(y.log == "log2", 2, 10)^(stat.coord3[, tempo.center.ref]) + } + stat.coord3[, tempo.center.ref] <- formatC(stat.coord3[, tempo.center.ref], digit = 2, drop0trailing = TRUE, format = "f") + # end correct median or mean text format + # if(any(tempo.log.high) == TRUE){ + # tempo.stat <- stat.coord3[tempo.log.high,] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( + data = stat.coord3, + mapping = ggplot2::aes_string(x = "x", y = "Y", label = tempo.center.ref), + size = stat.size, + color = "black", + angle = stat.angle, + hjust = stat.just$hjust, + vjust = stat.just$vjust + )) # WARNING: no need of order() for labels because box.coord$x set the order + coord.names <- c(coord.names, "stat.pos") + # } + # if(any(tempo.log.low) == TRUE){ + # tempo.stat <- stat.coord3[tempo.log.low,] + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( + # data = tempo.stat, + # mapping = ggplot2::aes_string(x = "x", y = "Y", label = tempo.center.ref), + # size = stat.size, + # color = "black", + # hjust = ifelse(vertical == TRUE, 0.5, 0.5 + stat.dist), + # vjust = ifelse(vertical == TRUE, 0.5 + stat.dist, 0.5) + # )) # WARNING: no need of order() for labels because box.coord$x set the order + # coord.names <- c(coord.names, "stat.pos.negative") + # } + # end stat display + }else{ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 5") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + # end stat display + # legend management + if(legend.show == FALSE){ # must be here because must be before bef.final.plot <- + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE, alpha = FALSE)) # inactivate the initial legend + } + # end legend management + + + + # y scale management (cannot be before dot plot management) + # the rescaling aspect is complicated and not intuitive. See: + # explaination: https://github.com/tidyverse/ggplot2/issues/3948 + # the oob argument of scale_y_continuous() https://ggplot2.tidyverse.org/reference/scale_continuous.html + # see also https://github.com/rstudio/cheatsheets/blob/master/data-visualization-2.1.pdf + # secondary ticks + bef.final.plot <- ggplot2::ggplot_build(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + if(vertical == TRUE){ggplot2::scale_y_continuous(expand = c(0, 0), limits = sort(y.lim), oob = scales::rescale_none)}else{ggplot2::coord_flip(ylim = y.lim)}')))) # here I do not need the x-axis and y-axis orientation, I just need the number of main ticks and the legend. I DI NOT UNDERSTAND THE COMMENT HERE BECAUSE WE NEED COORD_FLiP + tempo.coord <- bef.final.plot$layout$panel_params[[1]] + # y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non NULL or if y.log argument is different from "no") + if(y.log != "no"){ # integer main ticks for log2 and log10 + tempo.scale <- (as.integer(min(y.lim, na.rm = TRUE)) - 1):(as.integer(max(y.lim, na.rm = TRUE)) + 1) + }else{ + tempo <- if(is.null(attributes(tempo.coord$y$breaks))){tempo.coord$y$breaks}else{unlist(attributes(tempo.coord$y$breaks))} + if(all(is.na(tempo))){# all() without na.rm -> ok because is.na() cannot be NA + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$y$breaks") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + tempo.scale <- fun_scale(lim = y.lim, n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) # in ggplot 3.3.0, tempo.coord$y.major_source replaced by tempo.coord$y$breaks. If fact: n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) replaced by n = ifelse(is.null(y.tick.nb), 4, y.tick.nb)) + } + y.second.tick.values <- NULL + y.second.tick.pos <- NULL + if(y.log != "no"){ + tempo <- fun_inter_ticks(lim = y.lim, log = y.log) + y.second.tick.values <- tempo$values + y.second.tick.pos <- tempo$coordinates + # if(vertical == TRUE){ # do not remove in case the bug is fixed + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = y.second.tick.pos, yend = y.second.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) + # }else{ # not working because of the ggplot2 bug + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = y.second.tick.pos, xend = y.second.tick.pos, y = tempo.coord$y.range[1], yend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) + # } + coord.names <- c(coord.names, "y.second.tick.positions") + }else if(( ! is.null(y.second.tick.nb)) & y.log == "no"){ + # if(y.second.tick.nb > 0){ #inactivated because already checked before + if(length(tempo.scale) < 2){ + tempo.cat1 <- c("y.tick.nb", "y.second.tick.nb") + tempo.cat2 <- sapply(list(y.tick.nb, y.second.tick.nb), FUN = paste0, collapse = " ") + tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") + tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE Y-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + tempo <- fun_inter_ticks(lim = y.lim, log = y.log, breaks = tempo.scale, n = y.second.tick.nb) + } + y.second.tick.values <- tempo$values + y.second.tick.pos <- tempo$coordinates + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( + geom = "segment", + y = y.second.tick.pos, + yend = y.second.tick.pos, + x = if(vertical == TRUE){tempo.coord$x.range[1]}else{tempo.coord$y.range[1]}, + xend = if(vertical == TRUE){tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80}else{tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80} + )) + coord.names <- c(coord.names, "y.second.tick.positions") + } + # end y.second.tick.positions + # for the ggplot2 bug with y.log, this does not work: eval(parse(text = ifelse(vertical == FALSE & y.log == "log10", "ggplot2::scale_x_continuous", "ggplot2::scale_y_continuous"))) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( + breaks = tempo.scale, + minor_breaks = y.second.tick.pos, + labels = if(y.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(y.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(y.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 6") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, # == in stop() to be able to add several messages between == + expand = c(0, 0), # remove space after after axis limits + limits = sort(y.lim), # NA indicate that limits must correspond to data limits but ylim() already used + oob = scales::rescale_none, + trans = ifelse(diff(y.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() but create the problem of y-axis label disappearance with y.lim decreasing. Thus, do not use. Use ylim() below and after this + )) + if(vertical == TRUE){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(ylim = y.lim)) # problem of ggplot2::ylim() is that it redraws new breaks # coord_cartesian(ylim = y.lim)) not used because bug -> y-axis label disappearance with y.lim decreasing I DO NOT UNDERSTAND THIS MESSAGE WHILE I USE COORD_CARTESIAN # clip = "off" to have secondary ticks outside plot region does not work + }else{ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_flip(ylim = y.lim)) # clip = "off" to have secondary ticks outside plot region does not work # create the problem of y-axis label disappearance with y.lim decreasing. IDEM ABOVE + + } + # end y scale management (cannot be before dot plot management) + + + # legend management + if( ! is.null(legend.width)){ + legend.final <- fun_gg_get_legend(ggplot_built = bef.final.plot, fun.name = function.name, lib.path = lib.path) # get legend + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE, alpha = FALSE)) # inactivate the initial legend + if(is.null(legend.final) & plot == TRUE){ # even if any(unlist(legend.disp)) is TRUE + legend.final <- ggplot2::ggplot()+ggplot2::theme_void() # empty graph instead of legend + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON NULL legend.width ARGUMENT\n") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end legend management + + + # drawing + fin.plot <- suppressMessages(suppressWarnings(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))) + grob.save <- NULL + if(plot == TRUE){ + # following lines inactivated because of problem in warn.recov and message.recov + # assign("env_fun_get_message", new.env()) + # assign("tempo.gg.name", tempo.gg.name, envir = env_fun_get_message) + # assign("tempo.gg.count", tempo.gg.count, envir = env_fun_get_message) + # assign("add", add, envir = env_fun_get_message) + # two next line: for the moment, I cannot prevent the warning printing + # warn.recov <- fun_get_message(paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add}), kind = "warning", header = FALSE, print.no = FALSE, env = env_fun_get_message) # for recovering warnings printed by ggplot() functions + # message.recov <- fun_get_message('print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add}))))', kind = "message", header = FALSE, print.no = FALSE, env = env_fun_get_message) # for recovering messages printed by ggplot() functions + # if( ! (return == TRUE & return.ggplot == TRUE)){ # because return() plots when return.ggplot is TRUE # finally not used -> see return.ggplot description + if(is.null(legend.width)){ + grob.save <- suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot))) + }else{ + grob.save <-suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot, legend.final, ncol=2, widths=c(1, legend.width)))) + } + # } + # suppressMessages(suppressWarnings(print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add})))))) + }else{ + # following lines inactivated because of problem in warn.recov and message.recov + # message.recov <- NULL + # warn.recov <- NULL + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") PLOT NOT SHOWN AS REQUESTED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # end drawing + + + + # output + # following lines inactivated because of problem in warn.recov and message.recov + # if( ! (is.null(warn) & is.null(warn.recov) & is.null(message.recov))){ + # warn <- paste0(warn, "\n\n", if(length(warn.recov) > 0 | length(message.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", ifelse( ! is.null(warn.recov), unique(message.recov), ""), ifelse( ! is.null(message.recov), unique(message.recov), ""), collapse = "\n\n"), "\n\n")}) + # }else if( ! (is.null(warn) & is.null(warn.recov)) & is.null(message.recov)){ + # warn <- paste0(warn, "\n\n", if(length(warn.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", unique(warn.recov), collapse = "\n\n"), "\n\n")}) + # }else if( ! (is.null(warn) & is.null(message.recov)) & is.null(warn.recov)){ + # warn <- paste0(warn, "\n\n", if(length(message.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", unique(message.recov), collapse = "\n\n"), "\n\n")}) + # } + if(warn.print == TRUE & ! is.null(warn)){ + on.exit(warning(paste0("FROM ", function.name, ":\n\n", warn), call. = FALSE)) + } + on.exit(exp = options(warning.length = ini.warning.length), add = TRUE) + if(return == TRUE){ + tempo.output <- ggplot2::ggplot_build(fin.plot) + tempo.output$data <- tempo.output$data[-1] # remove the first data because corresponds to the initial empty boxplot + if(length(tempo.output$data) != length(coord.names)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nlength(tempo.output$data) AND length(coord.names) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + names(tempo.output$data) <- coord.names + tempo.output$data <- tempo.output$data[coord.names != "bad_remove"] + } + tempo <- tempo.output$layout$panel_params[[1]] + output <- list( + data = data1.ini, + stat = stat.nolog, + removed.row.nb = removed.row.nb, + removed.rows = removed.rows, + plot = c(tempo.output$data, y.second.tick.values = list(y.second.tick.values)), + panel = facet.categ, + axes = list( + x.range = tempo$x.range, + x.labels = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{tempo$x$scale$get_labels()}, # is.null(attributes(tempo$x$breaks)) test if it is number (TRUE) or character (FALSE) + x.positions = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{unlist(attributes(tempo$x$breaks))}, + y.range = tempo$y.range, + y.labels = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{tempo$y$scale$get_labels()}, + y.positions = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{unlist(attributes(tempo$y$breaks))} + ), + warn = paste0("\n", warn, "\n\n"), + ggplot = if(return.ggplot == TRUE){fin.plot}else{NULL}, # fin.plot plots the graph if return == TRUE + gtable = if(return.gtable == TRUE){grob.save}else{NULL} + ) + return(output) # this plots the graph if return.ggplot is TRUE and if no assignment + } + # end output + # end main code } -# end conversion of geom_hline and geom_vline - - -# kind of geom_point (vectorial or raster) -scatter.kind <- vector("list", length = length(data1)) # list of same length as data1, that will be used to use either ggplot2::geom_point() (vectorial dot layer) or fun_gg_point_rast() (raster dot layer) -fix.ratio <- FALSE -if(is.null(raster.threshold)){ -if(raster == TRUE){ -scatter.kind[] <- "fun_gg_point_rast" # not important to fill everything: will be only used when geom == "geom_point" -fix.ratio <- TRUE -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET BY THE raster.ratio ARGUMENT (", fun_round(raster.ratio, 2), ") TO AVOID A BUG OF ELLIPSOID DOT DRAWING") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else{ -scatter.kind[] <- "ggplot2::geom_point" -} -}else{ -for(i2 in 1:length(data1)){ -if(geom[[i2]] == "geom_point"){ -if(nrow(data1[[i2]]) <= raster.threshold){ -scatter.kind[[i2]] <- "ggplot2::geom_point" -}else{ -scatter.kind[[i2]] <- "fun_gg_point_rast" -fix.ratio <- TRUE -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i2, " OF data1 ARGUMENT")), " LAYER AS RASTER (NOT VECTORIAL)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -} -if(any(unlist(scatter.kind) == "fun_gg_point_rast")){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET BY THE raster.ratio ARGUMENT (", fun_round(raster.ratio, 2), ") TO AVOID A BUG OF ELLIPSOID DOT DRAWING") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end kind of geom_point (vectorial or raster) - - - - -# no need loop part -coord.names <- NULL -tempo.gg.name <- "gg.indiv.plot." -tempo.gg.count <- 0 -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(x.lab)){x[[1]]}else{x.lab})) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(y.lab)){y[[1]]}else{y.lab})) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) -# text angle management -x.tempo.just <- fun_gg_just(angle = x.text.angle, pos = "bottom", kind = "axis") -y.tempo.just <- fun_gg_just(angle = y.text.angle, pos = "left", kind = "axis") -# end text angle management -add.check <- TRUE -if( ! is.null(add)){ # if add is NULL, then = 0 -if(grepl(pattern = "ggplot2::theme", add) == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT\n-> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER\n-> article ARGUMENT WILL BE IGNORED\nIT IS RECOMMENDED TO USE \"+ theme(aspect.ratio = raster.ratio)\" IF RASTER MODE IS ACTIVATED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -add.check <- FALSE -} -} -if(add.check == TRUE & article == TRUE){ -# WARNING: not possible to add several times theme(). NO message but the last one overwrites the others -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) -if(grid == TRUE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -line = ggplot2::element_line(size = 0.5), -axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis -axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis -panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.minor.x = ggplot2::element_line(colour = "grey90", size = 0.25), -panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), -axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), -axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), -aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster -)) -}else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -line = ggplot2::element_line(size = 0.5), -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -axis.line.y.left = ggplot2::element_line(colour = "black"), -axis.line.x.bottom = ggplot2::element_line(colour = "black"), -axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), -axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), -aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster -)) -} -}else if(add.check == TRUE & article == FALSE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -line = ggplot2::element_line(size = 0.5), -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -panel.background = ggplot2::element_rect(fill = "grey95"), -axis.line.y.left = ggplot2::element_line(colour = "black"), -axis.line.x.bottom = ggplot2::element_line(colour = "black"), -panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.minor.x = ggplot2::element_line(colour = "grey90", size = 0.25), -panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), -strip.background = ggplot2::element_rect(fill = "white", colour = "black"), -axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), -axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), -aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster -# do not work -> legend.position = "none" # to remove the legend completely: https://www.datanovia.com/en/blog/how-to-remove-legend-from-a-ggplot/ -)) -} -# end no need loop part - - -# loop part -point.count <- 0 -line.count <- 0 -lg.order <- vector(mode = "list", length = 6) # order of the legend -lg.order <- lapply(lg.order, as.numeric) # order of the legend -lg.color <- vector(mode = "list", length = 6) # color of the legend -lg.dot.shape <- vector(mode = "list", length = 6) # etc. -lg.dot.size <- vector(mode = "list", length = 6) # etc. -lg.dot.size <- lapply(lg.dot.size, as.numeric) # etc. -lg.dot.border.size <- vector(mode = "list", length = 6) # etc. -lg.dot.border.size <- lapply(lg.dot.border.size, as.numeric) # etc. -lg.dot.border.color <- vector(mode = "list", length = 6) # etc. -lg.line.size <- vector(mode = "list", length = 6) # etc. -lg.line.size <- lapply(lg.line.size, as.numeric) # etc. -lg.line.type <- vector(mode = "list", length = 6) # etc. -lg.alpha <- vector(mode = "list", length = 6) # etc. -lg.alpha <- lapply(lg.alpha, as.numeric) # etc. -for(i1 in 1:length(data1)){ -if(geom[[i1]] == "geom_point"){ -point.count <- point.count + 1 -if(point.count== 1L){ -fin.lg.disp[[1]] <- legend.disp[[point.count + line.count]] -lg.order[[1]] <- point.count + line.count -lg.color[[1]] <- color[[i1]] # if color == NULL -> NULL -lg.dot.shape[[1]] <- dot.shape[[i1]] -lg.dot.size[[1]] <- dot.size[[i1]] -lg.dot.border.size[[1]] <- dot.border.size[[i1]] -lg.dot.border.color[[1]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL -if(plot == TRUE & fin.lg.disp[[1]] == TRUE & dot.shape[[1]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[1]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[1]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], fill = categ[[i1]]), shape = dot.shape[[i1]], size = dot.size[[i1]], stroke = dot.border.size[[i1]], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = if(i5== 1L){TRUE}else{FALSE})) # WARNING: a single color allowed for color argument outside aesthetic, but here a single color for border --> loop could be inactivated but kept for commodity # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_fill_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = as.character(color[[i1]]), breaks = class.categ)) # values are the values of fill, breaks reorder the classes according to class.categ in the legend, order argument of guide_legend determines the order of the different aesthetics in the legend (not order of classes). See guide_legend settings of scale_..._manual below -} -if(point.count== 2L){ -fin.lg.disp[[2]] <- legend.disp[[point.count + line.count]] -lg.order[[2]] <- point.count + line.count -lg.color[[2]] <- color[[i1]] # if color == NULL -> NULL -lg.dot.shape[[2]] <- dot.shape[[i1]] -lg.dot.size[[2]] <- dot.size[[i1]] -lg.dot.border.size[[2]] <- dot.border.size[[i1]] -lg.dot.border.color[[2]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL -if(plot == TRUE & fin.lg.disp[[2]] == TRUE & dot.shape[[2]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[2]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[2]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], shape = categ[[i1]]), size = dot.size[[i1]], stroke = dot.border.size[[i1]], fill = color[[i1]][i5], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = FALSE)) # WARNING: a single color allowed for fill argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_shape_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(dot.shape[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of shape, breaks reorder the classes according to class.categ in the legend. See guide_legend settings of scale_..._manual below - -} -if(point.count== 3L){ -fin.lg.disp[[3]] <- legend.disp[[point.count + line.count]] -lg.order[[3]] <- point.count + line.count -lg.color[[3]] <- color[[i1]] # if color == NULL -> NULL -lg.dot.shape[[3]] <- dot.shape[[i1]] -lg.dot.size[[3]] <- dot.size[[i1]] -lg.dot.border.size[[3]] <- dot.border.size[[i1]] -lg.dot.border.color[[3]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL -if(plot == TRUE & fin.lg.disp[[3]] == TRUE & dot.shape[[3]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[3]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[3]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], stroke = categ[[i1]]), shape = dot.shape[[i1]], size = dot.size[[i1]], fill = color[[i1]][i5], stroke = dot.border.size[[i1]], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = FALSE)) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "stroke", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(dot.border.size[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of stroke, breaks reorder the classes according to class.categ in the legend. See guide_legend settings of scale_..._manual below -} -}else{ -line.count <- line.count + 1 -if(line.count== 1L){ -fin.lg.disp[[4]] <- legend.disp[[point.count + line.count]] -lg.order[[4]] <- point.count + line.count -lg.color[[4]] <- color[[i1]] # if color == NULL -> NULL -lg.line.size[[4]] <- line.size[[i1]] -lg.line.type[[4]] <- line.type[[i1]] -if(plot == TRUE & fin.lg.disp[[4]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[4]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[4]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl -ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting -"(data = tempo.data.frame, mapping = ggplot2::aes(x = ", -x[[i1]], -ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), -y[[i1]], -if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, -", linetype = ", -categ[[i1]], -"), color = \"", -color[[i1]][i5], -"\", size = ", -line.size[[i1]], -ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), -ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), -", alpha = ", -alpha[[i1]], -", show.legend = ", -ifelse(i5== 1L, TRUE, FALSE), -")" -)))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "linetype", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(line.type[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values, breaks reorder the classes according to class.categ in the legend -} -if(line.count== 2L){ -fin.lg.disp[[5]] <- legend.disp[[point.count + line.count]] -lg.order[[5]] <- point.count + line.count -lg.color[[5]] <- color[[i1]] # if color == NULL -> NULL -lg.line.size[[5]] <- line.size[[i1]] -lg.line.type[[5]] <- line.type[[i1]] -if(plot == TRUE & fin.lg.disp[[5]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[5]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[5]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl -ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting -"(data = tempo.data.frame, mapping = ggplot2::aes(x = ", -x[[i1]], -ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), -y[[i1]], -if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, -", alpha = ", -categ[[i1]], -"), color = \"", -color[[i1]][i5], -"\", size = ", -line.size[[i1]], -", linetype = ", -ifelse(is.numeric(line.type[[i1]]), "", "\""), -line.type[[i1]], -ifelse(is.numeric(line.type[[i1]]), "", "\""), -ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), -ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), -", show.legend = FALSE)" -)))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(alpha[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values, breaks reorder the classes according to class.categ in the legend -} -if(line.count== 3L){ -fin.lg.disp[[6]] <- legend.disp[[point.count + line.count]] -lg.order[[6]] <- point.count + line.count -lg.color[[6]] <- color[[i1]] # if color == NULL -> NULL -lg.line.size[[6]] <- line.size[[i1]] -lg.line.type[[6]] <- line.type[[i1]] -if(plot == TRUE & fin.lg.disp[[6]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[6]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[6]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl -ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting -"(data = tempo.data.frame, mapping = ggplot2::aes(x = ", -x[[i1]], -ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), -y[[i1]], -if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, -", size = ", -categ[[i1]], -"), color = \"", -color[[i1]][i5], -"\", linetype = ", -ifelse(is.numeric(line.type[[i1]]), "", "\""), -line.type[[i1]], -ifelse(is.numeric(line.type[[i1]]), "", "\""), -ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), -ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), -", alpha = ", -alpha[[i1]], -", show.legend = FALSE)" -)))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "size", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(line.size[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, breaks reorder the classes according to class.categ in the legend -} -} -} -# end loop part +# add density +# rasterise all kind: https://cran.r-project.org/web/packages/ggrastr/vignettes/Raster_geoms.html +# log not good: do not convert as in boxplot -# legend display -tempo.legend.final <- 'ggplot2::guides( +fun_gg_scatter <- function( + data1, + x, + y, + categ = NULL, + categ.class.order = NULL, + color = NULL, + geom = "geom_point", + geom.step.dir = "hv", + geom.stick.base = NULL, + alpha = 0.5, + dot.size = 2, + dot.shape = 21, + dot.border.size = 0.5, + dot.border.color = NULL, + line.size = 0.5, + line.type = "solid", + x.lim = NULL, + x.lab = NULL, + x.log = "no", + x.tick.nb = NULL, + x.second.tick.nb = NULL, + x.include.zero = FALSE, + x.left.extra.margin = 0.05, + x.right.extra.margin = 0.05, + x.text.angle = 0, + y.lim = NULL, + y.lab = NULL, + y.log = "no", + y.tick.nb = NULL, + y.second.tick.nb = NULL, + y.include.zero = FALSE, + y.top.extra.margin = 0.05, + y.bottom.extra.margin = 0.05, + y.text.angle = 0, + raster = FALSE, + raster.ratio = 1, + raster.threshold = NULL, + text.size = 12, + title = "", + title.text.size = 12, + legend.show = TRUE, + legend.width = 0.5, + legend.name = NULL, + article = TRUE, + grid = FALSE, + add = NULL, + return = FALSE, + return.ggplot = FALSE, + return.gtable = TRUE, + plot = TRUE, + warn.print = FALSE, + lib.path = NULL +){ + # AIM + # Plot ggplot2 scatterplot with the possibility to overlay dots from up to 3 different data frames (-> three different legends) and lines from up to 3 different data frames (-> three different legends) -> up to 6 overlays totally + # For ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html + # WARNINGS + # Rows containing NA in data1[, c(x, y, categ)] will be removed before processing, with a warning (see below) + # Size arguments (dot.size, dot.border.size, line.size, text.size and title.text.size) are in mm. See Hadley comment in https://stackoverflow.com/questions/17311917/ggplot2-the-unit-of-size. See also http://sape.inf.usi.ch/quick-reference/ggplot2/size). Unit object are not accepted, but conversion can be used (e.g., grid::convertUnit(grid::unit(0.2, "inches"), "mm", valueOnly = TRUE)) + # ARGUMENTS + # data1: a dataframe compatible with ggplot2, or a list of data frames. Order matters for the order of the legend and for the layer staking (starting from below to top) + # x: single character string of the data1 column name for x-axis coordinates. If data1 is a list, then x must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Write NULL for each "geom_hline" in geom argument + # y: single character string of the data1 column name for y-axis coordinates. If data1 is a list, then y must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Write NULL for each "geom_vline" in geom argument + # categ: either NULL or a single character string or a list of single character strings, indicating the data1 column names to use for categories which creates legend display + # If categ == NULL, no categories -> no legend displayed + # If data1 is a data frame, categ must be a single character string of the data1 column name for categories + # If data1 is a list, then categ must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL (no legend display for these compartments), and other not + # categ.class.order: either (1) NULL or (2) a vector of character strings or (3) a list of these vectors, setting the order of the classes of categ in the legend display + # If categ.class.order is NULL, classes are represented according to the alphabetical order + # If data1 is a data frame, categ.class.order must be a vector of character strings specifying the different classes in the categ column name of data1 + # If data1 is a list, then categ.class.order must be a list of vector of character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL (alphabetical order for these compartments), and other not + # color: either (1) NULL, or (2) a vector of character strings or integers, or (3) a list of vectors of character strings or integers + # If color is NULL, default colors of ggplot2 + # If data1 is a data frame, color argument can be either: + # (1) a single color string. All the dots of the corresponding data1 will have this color, whatever the categ value (NULL or not) + # (2) if categ is non-null, a vector of string colors, one for each class of categ. Each color will be associated according to the categ.class.order argument if specified, or to the alphabetical order of categ classes otherwise + # (3) if categ is non-null, a vector or factor of string colors, like if it was one of the column of data1 data frame. WARNING: a single color per class of categ and a single class of categ per color must be respected + # Positive integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the max integer value among all the integers in color (see fun_gg_palette()) + # If data1 is a list, then color argument must be either: + # (1) a list of character strings or integers, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. + # (2) a single character string or a single integer + # With a list (first possibility), the rules described for when data1 is a data frame apply to each compartment of the list. Some of the compartments can be NULL. In that case, a different grey color will be used for each NULL compartment. With a single value (second possibility), the same color will be used for all the dots and lines, whatever the data1 list + # geom: single character string of the kind of plot, or a list of single character strings + # Either: + # "geom_point" (scatterplot) + # "geom_line" (coordinates plotted then line connection, from the lowest to highest x coordinates first and from the lowest to highest y coordinates thenafter) + # "geom_path" (coordinates plotted then line connection respecting the row order in data1) + # "geom_step" coordinates plotted then line connection respecting the row order in data1 but drawn in steps). See the geom.step.dir argument + # "geom_hline" (horizontal line, no x value provided) + # "geom_vline" (vertical line, no y value provided) + # "geom_stick" (dots as vertical bars) + # If data1 is a list, then geom must be either: + # (1) a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. + # (2) a single character string. In that case the same kind of plot will apply for the different compartments of the data1 list + # WARNING concerning "geom_hline" or "geom_vline": + # (1) x or y argument must be NULL, respectively + # (2) x.lim or y.lim argument must NOT be NULL, respectively, if only these kind of lines are drawn (if other geom present, then x.lim = NULL and y.lim = NULL will generate x.lim and y.lim defined by these other geom, which is not possible with "geom_hline" or "geom_vline" alone) + # (3) the function will draw n lines for n values in the x argument column name of the data1 data frame. If several colors required, the categ argument must be specified and the corresponding categ column name must exist in the data1 data frame with a different class name for each row + # geom.step.dir: single character string indicating the direction when using "geom_step" of the geom argument, or a list of single character strings + # Either: + # "vh" (vertical then horizontal) + # "hv" (horizontal then vertical) + # "mid" (step half-way between adjacent x-values) + # See https://ggplot2.tidyverse.org/reference/geom_path.html + # If data1 is a list, then geom.step.dir must be either: + # (1) a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. The value in compartments related to other geom values than "geom_step" will be ignored + # (2) a single character string, which will be used for all the "geom_step" values of the geom argument, whatever the data1 list + # geom.stick.base: either (1) NULL or (2) a single numeric value or (3) a list of single numeric values, setting the base of the sticks when using "geom_stick" of the geom argument + # If geom.stick.base is NULL, the bottom limit of the y-axis is taken as the base + # If data1 is a list, then geom.stick.base must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the values in compartments related to other geom values than "geom_stick" will be ignored. With a single value (latter possibility), the same base will be used for all the sticks, whatever the data1 list + # Warning: the y-axis limits are not modified by the value of geom.stick.base, meaning that this value can be outside of the range of y.lim. Add the value of geom.stick.base also in the y.lim argument if required + # Warning: if geom.stick.base is NULL, the bottom limit of the y-axis is taken as the base. Thus, be careful with inverted y-axis + # alpha: single numeric value (from 0 to 1) of transparency. If data1 is a list, then alpha must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. In that case the same transparency will apply for the different compartments of the data1 list + # dot.size: single numeric value of dot shape radius? in mm. If data1 is a list, then dot.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.size will be used for all the dots, whatever the data1 list + # dot.shape: value indicating the shape of the dots (see https://ggplot2.tidyverse.org/articles/ggplot2-specs.html) If data1 is a list, then dot.shape must be either (1) a list of single shape values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single shape value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.shape will be used for all the dots, whatever the data1 list + # dot.border.size: single numeric value of border dot width in mm. Write zero for no dot border. If data1 is a list, then dot.border.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.border.size will be used for all the dots, whatever the data1 list + # dot.border.color: single character color string defining the color of the dot border (same border color for all the dots, whatever their categories). If dot.border.color == NULL, the border color will be the same as the dot color. A single integer is also accepted instead of a character string, that will be processed by fun_gg_palette() + # line.size: single numeric value of line width in mm. If data1 is a list, then line.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to dots will be ignored. With a single value (latter possibility), the same line.size will be used for all the lines, whatever the data1 list + # line.type: value indicating the kind of lines (see https://ggplot2.tidyverse.org/articles/ggplot2-specs.html) If data1 is a list, then line.type must be either (1) a list of single line kind values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single line kind value. With a list (former possibility), the value in compartments related to dots will be ignored. With a single value (latter possibility), the same line.type will be used for all the lines, whatever the data1 list + # x.lim: 2 numeric values setting the x-axis range. Order of the 2 values matters (for inverted axis). If NULL, the range of the x column name of data1 will be used + # x.lab: a character string or expression for x-axis label. If NULL, will use the first value of x (x column name of the first data frame in data1). Warning message if the elements in x are different between data frames in data1 + # x.log: either "no", "log2" (values in the x column name of the data1 data frame will be log2 transformed and x-axis will be log2 scaled) or "log10" (values in the x column name of the data1 data frame will be log10 transformed and x-axis will be log10 scaled) + # x.tick.nb: approximate number of desired values labeling the x-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if x.log is "no", then the number of labeling values is set by ggplot2. If NULL and if x.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the x.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for x.lim = c(9, 1200)). WARNING: if non-NULL and if x.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) + # x.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if x.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$x.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks + # x.include.zero: logical. Does x.lim range include 0? Ignored if x.log is "log2" or "log10" + # x.left.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to x.lim. If different from 0, add the range of the axis multiplied by x.left.extra.margin (e.g., abs(x.lim[2] - x.lim[1]) * x.left.extra.margin) to the left of x-axis + # x.right.extra.margin: idem as x.left.extra.margin but to the right of x-axis + # x.text.angle: integer value of the text angle for the x-axis labeling values, using the same rules as in ggplot2. Use positive value for clockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Use negative values for counterclockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. + # y.lim: 2 numeric values setting the y-axis range. Order of the 2 values matters (for inverted axis). If NULL, the range of the y column name of data1 will be used + # y.lab: a character string or expression for y-axis label. If NULL, will use the first value of y (y column name of the first data frame in data1). Warning message if the elements in y are different between data frames in data1 + # y.log: either "no", "log2" (values in the y column name of the data1 data frame will be log2 transformed and y-axis will be log2 scaled) or "log10" (values in the y column name of the data1 data frame will be log10 transformed and y-axis will be log10 scaled) + # y.tick.nb: approximate number of desired values labeling the y-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if y.log is "no", then the number of labeling values is set by ggplot2. If NULL and if y.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the y.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for y.lim = c(9, 1200)). WARNING: if non-NULL and if y.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) + # y.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if y.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$y.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks + # y.include.zero: logical. Does y.lim range include 0? Ignored if y.log is "log2" or "log10" + # y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to y.lim. If different from 0, add the range of the axis multiplied by y.top.extra.margin (e.g., abs(y.lim[2] - y.lim[1]) * y.top.extra.margin) to the top of y-axis + # y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis + # y.text.angle: integer value of the text angle for the y-axis labeling values, using the same rules as in ggplot2. Use positive value for clockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Use negative values for counterclockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. + # raster: logical. Dots in raster mode? If FALSE, dots from each "geom_point" from geom argument are plotted in vectorial mode (bigger pdf and long to display if lots of dots). If TRUE, dots from each "geom_point" from geom argument are plotted in matricial mode (smaller pdf and easy display if lots of dots, but it takes time to generate the layer). If TRUE, the raster.ratio argument is used to avoid an ellipsoid representation of the dots. If TRUE, solve the transparency problem with some GUI. Overriden by the non-NULL raster.threshold argument + # raster.ratio: single numeric value indicating the height / width ratio of the graphic device used (for instance provided by the $dim compartment in the output of the fun_open() function). The default value is 1 because by default R opens a square graphic device. But this argument has to be set when using other device dimensions. Ignored if raster == FALSE + # raster.threshold: positive integer value indicating the limit of the dot number above which "geom_point" layers from the geom argument switch from vectorial mode to matricial mode (see the raster argument). If any layer is matricial, then the raster.ratio argument is used to avoid an ellipsoid representation of the dots. If non-NULL, it overrides the raster argument + # text.size: numeric value of the font size of the (1) axis numbers and axis legends and (2) texts in the graphic legend (in mm) + # title: character string of the graph title + # title.text.size: numeric value of the title font size in mm + # legend.show: logical. Show legend? Not considered if categ argument is NULL, because this already generate no legend, excepted if legend.width argument is non-NULL. In that specific case (categ is NULL, legend.show is TRUE and legend.width is non-NULL), an empty legend space is created. This can be useful when desiring graphs of exactly the same width, whatever they have legends or not + # legend.width: single proportion (between 0 and 1) indicating the relative width of the legend sector (on the right of the plot) relative to the width of the plot. Value 1 means that the window device width is split in 2, half for the plot and half for the legend. Value 0 means no room for the legend, which will overlay the plot region. Write NULL to inactivate the legend sector. In such case, ggplot2 will manage the room required for the legend display, meaning that the width of the plotting region can vary between graphs, depending on the text in the legend + # legend.name: character string of the legend title. If legend.name is NULL and categ argument is not NULL, then legend.name <- categ. If data1 is a list, then legend.name must be a list of character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL, and other not + # article: logical. If TRUE, use an article theme (article like). If FALSE, use a classic related ggplot theme. Use the add argument (e.g., add = "+ggplot2::theme_classic()" for the exact classic ggplot theme + # grid: logical. Draw lines in the background to better read the box values? Not considered if article == FALSE (grid systematically present) + # add: character string allowing to add more ggplot2 features (dots, lines, themes, facet, etc.). Ignored if NULL + # WARNING: (1) the string must start with "+", (2) the string must finish with ")" and (3) each function must be preceded by "ggplot2::". Example: "+ ggplot2::coord_flip() + ggplot2::theme_bw()" + # If the character string contains the "ggplot2::theme" string, then the article argument of fun_gg_scatter() (see above) is ignored with a warning + # Handle the add argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions + # WARNING: the call of objects inside the quotes of add can lead to an error if the name of these objects are some of the fun_gg_scatter() arguments. Indeed, the function will use the internal argument instead of the global environment object. Example article <- "a" in the working environment and add = '+ ggplot2::ggtitle(article)'. The risk here is to have TRUE as title. To solve this, use add = '+ ggplot2::ggtitle(get("article", envir = .GlobalEnv))' + # return: logical. Return the graph parameters? + # return.ggplot: logical. Return the ggplot object in the output list? Ignored if return argument is FALSE. WARNING: always assign the fun_gg_scatter() function (e.g., a <- fun_gg_scatter()) if return.ggplot argument is TRUE, otherwise, double plotting is performed. See $ggplot in the RETURN section below for more details + # return.gtable: logical. Return the ggplot object as gtable of grobs in the output list? Ignored if plot argument is FALSE. Indeed, the graph must be plotted to get the grobs dispositions. See $gtable in the RETURN section below for more details + # plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting + # warn.print: logical. Print warnings at the end of the execution? ? If FALSE, warning messages are never printed, but can still be recovered in the returned list. Some of the warning messages (those delivered by the internal ggplot2 functions) are not apparent when using the argument plot = FALSE + # lib.path: character string indicating the absolute path of the required packages (see below). if NULL, the function will use the R library default folders + # RETURN + # a scatter plot if plot argument is TRUE + # a list of the graph info if return argument is TRUE: + # $data: the initial data with graphic information added. WARNING: if the x.log or y.log argument is not "no", x or y argument column of the data1 data frame are log2 or log10 converted in $data, respectively. Use 2^values or 10^$values to recover the initial values + # $removed.row.nb: a list of the removed rows numbers in data frames (because of NA). NULL if no row removed + # $removed.rows: a list of the removed rows in data frames (because of NA). NULL if no row removed + # $plot: the graphic box and dot coordinates + # $dots: dot coordinates + # y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non-null or if y.log argument is different from "no") + # y.second.tick.values: values of secondary ticks. NULL except if y.second.tick.nb argument is non-null or if y.log argument is different from "no") + # $panel: the variable names used for the panels (NULL if no panels). WARNING: NA can be present according to ggplot2 upgrade to v3.3.0 + # $axes: the x-axis and y-axis info + # $warn: the warning messages. Use cat() for proper display. NULL if no warning. WARNING: warning messages delivered by the internal ggplot2 functions are not apparent when using the argument plot = FALSE + # $ggplot: ggplot object that can be used for reprint (use print($ggplot) or update (use $ggplot + ggplot2::...). NULL if return.ggplot argument is FALSE. Of note, a non-null $ggplot in the output list is sometimes annoying as the manipulation of this list prints the plot + # $gtable: gtable object that can be used for reprint (use gridExtra::grid.arrange(...$ggplot) or with additionnal grobs (see the grob decomposition in the examples). NULL if return.ggplot argument is FALSE. Contrary to $ggplot, a non-NULL $gtable in the output list is not annoying as the manipulation of this list does not print the plot + # REQUIRED PACKAGES + # ggplot2 + # gridExtra + # lemon (in case of use in the add argument) + # scales + # if raster plots are drawn (see the raster and raster.threshold arguments): + # Cairo + # grid + # REQUIRED FUNCTIONS FROM THE cute PACKAGE + # fun_gg_empty_graph() + # fun_gg_palette() + # fun_gg_point_rast() + # fun_pack() + # fun_check() + # fun_round() + # fun_scale() + # fun_inter_ticks() + # EXAMPLES + # set.seed(1) ; obs1 <- data.frame(Km = c(2, 1, 6, 5, 4, 7), Time = c(2, 1, 6, 5, 4, 7)^2, Car = c("TUUT", "TUUT", "TUUT", "WIIM", "WIIM", "WIIM"), Color1 = rep(c("coral", "lightblue"), each = 3), stringsAsFactors = TRUE) ; fun_gg_scatter(data1 = obs1, x = "Km", y = "Time") + # DEBUGGING + # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500), stringsAsFactors = TRUE) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500), stringsAsFactors = TRUE) ; set.seed(NULL) ; obs1$km[2:3] <- NA ; data1 = list(L1 = obs1, L2 = obs2) ; x = list(L1 = "km", L2 = "km") ; y = list(L1 = "time", L2 = "time") ; categ = list(L1 = "group1", L2 = "group2") ; categ = NULL ; categ.class.order = NULL ; color = NULL ; geom = "geom_point" ; geom.step.dir = "hv" ; geom.stick.base = NULL, alpha = 0.5 ; dot.size = 2 ; dot.shape = 21 ; dot.border.size = 0.5 ; dot.border.color = NULL ; line.size = 0.5 ; line.type = "solid" ; x.lim = NULL ; x.lab = NULL ; x.log = "no" ; x.tick.nb = NULL ; x.second.tick.nb = NULL ; x.include.zero = FALSE ; x.left.extra.margin = 0.05 ; x.right.extra.margin = 0.05 ; x.text.angle = 0 ; y.lim = NULL ; y.lab = NULL ; y.log = "no" ; y.tick.nb = NULL ; y.second.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0.05 ; y.text.angle = 0 ; raster = FALSE ; raster.ratio = 1 ; raster.threshold = NULL ; text.size = 12 ; title = "" ; title.text.size = 12 ; legend.show = TRUE ; legend.width = 0.5 ; legend.name = NULL ; article = TRUE ; grid = FALSE ; add = NULL ; return = FALSE ; return.ggplot = FALSE ; return.gtable = TRUE ; plot = TRUE ; warn.print = FALSE ; lib.path = NULL + # function name + function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") + arg.names <- names(formals(fun = sys.function(sys.parent(n = 2)))) # names of all the arguments + arg.user.setting <- as.list(match.call(expand.dots=FALSE))[-1] # list of the argument settings (excluding default values not provided by the user) + # end function name + # required function checking + req.function <- c( + "fun_check", + "fun_gg_just", + "fun_gg_empty_graph", + "fun_gg_palette", + "fun_gg_point_rast", + "fun_round", + "fun_pack", + "fun_scale", + "fun_inter_ticks" + ) + tempo <- NULL + for(i1 in req.function){ + if(length(find(i1, mode = "function"))== 0L){ + tempo <- c(tempo, i1) + } + } + if( ! is.null(tempo)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nREQUIRED cute FUNCTION", ifelse(length(tempo) > 1, "S ARE", " IS"), " MISSING IN THE R ENVIRONMENT:\n", paste0(tempo, collapse = "()\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end required function checking + # reserved words to avoid bugs (used in this function) + reserved.words <- c("fake_x", "fake_y", "fake_categ") + # end reserved words to avoid bugs (used in this function) + # arg with no default values + mandat.args <- c( + "data1", + "x", + "y" + ) + tempo <- eval(parse(text = paste0("missing(", paste0(mandat.args, collapse = ") | missing("), ")"))) + if(any(tempo)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nFOLLOWING ARGUMENT", ifelse(length(mandat.args) > 1, "S HAVE", "HAS"), " NO DEFAULT VALUE AND REQUIRE ONE:\n", paste0(mandat.args, collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end arg with no default values + # argument primary checking + arg.check <- NULL # + text.check <- NULL # + checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools + ee <- expression(arg.check <- c(arg.check, tempo$problem) , text.check <- c(text.check, tempo$text) , checked.arg.names <- c(checked.arg.names, tempo$object.name)) + tempo1 <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = data1, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OR A LIST OF DATA FRAMES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + if( ! is.null(x)){ + tempo1 <- fun_check(data = x, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = x, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(y)){ + tempo1 <- fun_check(data = y, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = y, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(categ)){ + tempo1 <- fun_check(data = categ, class = "vector", mode = "character", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = categ, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = categ, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(categ.class.order)){ + if(is.null(categ)){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT IS NOT NULL, BUT categ IS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = categ.class.order, class = "vector", mode = "character", fun.name = function.name) + tempo2 <- fun_check(data = categ.class.order, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A VECTOR OF CHARACTER STRINGS OR A LIST OF VECTOR OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = categ.class.order, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(legend.name)){ + tempo1 <- fun_check(data = legend.name, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = legend.name, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = legend.name, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(color)){ + tempo1 <- fun_check(data = color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = color, class = "factor", na.contain = TRUE, fun.name = function.name) + tempo3 <- fun_check(data = color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name) + tempo4 <- fun_check(data = color, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo4$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE & tempo4$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT MUST BE A VECTOR (OF CHARACTER STRINGS OR INTEGERS) OR A FACTOR OR A LIST OF THESE POSSIBILITIES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = color, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo1 <- fun_check(data = geom, class = "vector", mode = "character", na.contain = FALSE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = geom, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = geom.step.dir, options = c("vh", "hv", "mid"), na.contain = FALSE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = geom.step.dir, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT MUST BE A SINGLE CHARACTER STRING (\"vh\" OR \"hv\" OR \"mid\") OR A LIST OF THESE CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + if( ! is.null(geom.stick.base)){ + tempo1 <- fun_check(data = geom.stick.base, class = "vector", mode = "numeric", na.contain = FALSE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = color, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = geom.stick.base, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo1 <- fun_check(data = alpha, prop = TRUE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = alpha, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT MUST BE A SINGLE NUMERIC VALUE BETWEEN 0 AND 1 OR A LIST OF SUCH VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) + tempo2 <- fun_check(data = dot.size, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = dot.shape, class = "vector", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = dot.shape, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT MUST BE A SINGLE SHAPE VALUE OR A LIST OF SINGLE SHAPE VALUES (SEE https://ggplot2.tidyverse.org/articles/ggplot2-specs.html)") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) + tempo2 <- fun_check(data = dot.border.size, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + if( ! is.null(dot.border.color)){ + tempo1 <- fun_check(data = dot.border.color, class = "vector", mode = "character", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + # integer colors -> gg_palette + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color MUST BE A SINGLE CHARACTER STRING OF COLOR OR A SINGLE INTEGER VALUE") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.border.color, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo1 <- fun_check(data = line.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) + tempo2 <- fun_check(data = line.size, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = line.type, class = "vector", typeof = "integer", double.as.integer.allowed = FALSE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = line.type, class = "vector", mode = "character", length = 1, fun.name = function.name) + tempo3 <- fun_check(data = line.type, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo3$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT MUST BE A SINGLE LINE KIND VALUE OR A LIST OF SINGLE LINE KIND VALUES (SEE https://ggplot2.tidyverse.org/articles/ggplot2-specs.html)") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + if( ! is.null(x.lim)){ + tempo <- fun_check(data = x.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & any(x.lim %in% c(Inf, -Inf))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x.lim, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(x.lab)){ + if(all(class(x.lab) %in% "expression")){ # to deal with math symbols + tempo <- fun_check(data = x.lab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) + }else{ + tempo <- fun_check(data = x.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x.lab, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = x.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(x.tick.nb)){ + tempo <- fun_check(data = x.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & x.tick.nb < 0){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(x.second.tick.nb)){ + tempo <- fun_check(data = x.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & x.second.tick.nb <= 0){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x.second.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x.second.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = x.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = x.left.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = x.right.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = x.text.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) + if( ! is.null(y.lim)){ + tempo <- fun_check(data = y.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & any(y.lim %in% c(Inf, -Inf))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.lim, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(y.lab)){ + if(all(class(y.lab) %in% "expression")){ # to deal with math symbols + tempo <- fun_check(data = y.lab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) + }else{ + tempo <- fun_check(data = y.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.lab, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = y.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(y.tick.nb)){ + tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & y.tick.nb < 0){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(y.second.tick.nb)){ + tempo <- fun_check(data = y.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & y.second.tick.nb <= 0){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y.second.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.second.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y.text.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = raster, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = raster.ratio, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + if( ! is.null(raster.threshold)){ + tempo <- fun_check(data = raster.threshold, class = "vector", typeof = "integer", neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = raster.threshold, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = legend.show, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(legend.width)){ + tempo <- fun_check(data = legend.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = legend.width, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = article, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(add)){ + tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = add, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = return.ggplot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = return.gtable, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(lib.path)){ + tempo <- fun_check(data = lib.path, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if( ! all(dir.exists(lib.path))){ # separation to avoid the problem of tempo$problem == FALSE and lib.path == NA + tempo.cat <- paste0("ERROR IN ", function.name, ": DIRECTORY PATH INDICATED IN THE lib.path ARGUMENT DOES NOT EXISTS:\n", paste(lib.path, collapse = "\n")) + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = lib.path, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if(any(arg.check) == TRUE){ + stop(paste0("\n\n================\n\n", paste(text.check[arg.check], collapse = "\n"), "\n\n================\n\n"), call. = FALSE) # + } + # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.7/r_debugging_tools-v1.7.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() + # end argument primary checking + + + # second round of checking and data preparation + # management of NA arguments + tempo.arg <- names(arg.user.setting) # values provided by the user + tempo.log <- suppressWarnings(sapply(lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.na), FUN = any)) & lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = length)== 1L # no argument provided by the user can be just NA + if(any(tempo.log) == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT JUST BE NA") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end management of NA arguments + # management of NULL arguments + tempo.arg <-c( + "data1", + # "x", # inactivated because of hline or vline + # "y", # inactivated because of hline or vline + "geom", + "geom.step.dir", + # "geom.stick.base", # inactivated because can be null + "alpha", + "dot.size", + "dot.shape", + "dot.border.size", + "line.size", + "line.type", + "x.log", + "x.include.zero", + "x.left.extra.margin", + "x.right.extra.margin", + "x.text.angle", + "y.log", + "y.include.zero", + "y.top.extra.margin", + "y.bottom.extra.margin", + "y.text.angle", + "raster", + "raster.ratio", + "text.size", + "title", + "title.text.size", + "legend.show", + # "legend.width", # inactivated because can be null + "article", + "grid", + "return", + "return.ggplot", + "return.gtable", + "plot", + "warn.print" + ) + tempo.log <- sapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.null) + if(any(tempo.log) == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT BE NULL") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end management of NULL arguments + # code that protects set.seed() in the global environment + # end code that protects set.seed() in the global environment + # warning initiation + ini.warning.length <- options()$warning.length + options(warning.length = 8170) + warn <- NULL + warn.count <- 0 + # end warning initiation + # other checkings + # check list lengths (and names of data1 compartments if present) + list.color <- NULL + list.geom <- NULL + list.geom.step.dir <- NULL + list.geom.stick.base <- NULL + list.alpha <- NULL + list.dot.size <- NULL + list.dot.shape <- NULL + list.dot.border.size <- NULL + list.dot.border.color <- NULL + list.line.size <- NULL + list.line.type <- NULL + if(all(class(data1) == "list")){ + if(length(data1) > 6){ + tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A LIST OF 6 DATA FRAMES MAXIMUM (6 OVERLAYS MAX)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(is.null(names(data1))){ + names(data1) <- paste0("L", 1:length(data1)) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL NAME COMPARTMENT OF data1 LIST -> NAMES RESPECTIVELY ATTRIBUTED TO EACH COMPARTMENT:\n", paste(names(data1), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + if( ! is.null(x)){ + if( ! (all(class(x) == "list") & length(data1) == length(x))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + }else{ + x <- vector("list", length(data1)) + } + if( ! is.null(y)){ + if( ! (all(class(y) == "list") & length(data1) == length(y))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + }else{ + y <- vector("list", length(data1)) + } + if( ! is.null(categ)){ + if( ! (all(class(categ) == "list") & length(data1) == length(categ))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if( ! is.null(categ.class.order)){ + if( ! (all(class(categ.class.order) == "list") & length(data1) == length(categ.class.order))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if( ! is.null(color)){ + if( ! ((all(class(color) == "list") & length(data1) == length(color)) | ((all(mode(color) == "character") | all(mode(color) == "numeric")) & length(color)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER STRING OR INTEGER") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if((all(mode(color) == "character") | all(mode(color) == "numeric")) & length(color)== 1L){ # convert the single value into a list of single value + list.color <- vector(mode = "list", length = length(data1)) + list.color[] <- color + } + } + if( ! ((all(class(geom) == "list") & length(data1) == length(geom)) | (all(mode(geom) == "character") & length(geom)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(geom) == "character") & length(geom)== 1L){ # convert the single value into a list of single value + list.geom <- vector(mode = "list", length = length(data1)) + list.geom[] <- geom + } + if( ! ((all(class(geom.step.dir) == "list") & length(data1) == length(geom.step.dir)) | (all(mode(geom.step.dir) == "character") & length(geom.step.dir)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(geom.step.dir) == "character") & length(geom.step.dir)== 1L){ # convert the single value into a list of single value + list.geom.step.dir <- vector(mode = "list", length = length(data1)) + list.geom.step.dir[] <- geom.step.dir + } + if( ! is.null(geom.stick.base)){ + if( ! ((all(class(geom.stick.base) == "list") & length(data1) == length(geom.stick.base)) | (all(mode(geom.stick.base) == "numeric") & length(geom.stick.base)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(geom.stick.base) == "numeric") & length(geom.stick.base)== 1L){ # convert the single value into a list of single value + list.geom.stick.base <- vector(mode = "list", length = length(data1)) + list.geom.stick.base[] <- geom.stick.base + } + } + if( ! ((all(class(alpha) == "list") & length(data1) == length(alpha)) | (all(mode(alpha) == "numeric") & length(alpha)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(alpha) == "numeric") & length(alpha)== 1L){ # convert the single value into a list of single value + list.alpha <- vector(mode = "list", length = length(data1)) + list.alpha[] <- alpha + } + if( ! ((all(class(dot.size) == "list") & length(data1) == length(dot.size)) | (all(mode(dot.size) == "numeric") & length(dot.size)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(dot.size) == "numeric") & length(dot.size)== 1L){ # convert the single value into a list of single value + list.dot.size <- vector(mode = "list", length = length(data1)) + list.dot.size[] <- dot.size + } + if( ! ((all(class(dot.shape) == "list") & length(data1) == length(dot.shape)) | (all(mode(dot.shape) != "list") & length(dot.shape)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE SHAPE VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(dot.shape) != "list") & length(dot.shape)== 1L){ # convert the single value into a list of single value + list.dot.shape <- vector(mode = "list", length = length(data1)) + list.dot.shape[] <- dot.shape + } + if( ! ((all(class(dot.border.size) == "list") & length(data1) == length(dot.border.size)) | (all(mode(dot.border.size) == "numeric") & length(dot.border.size)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(dot.border.size) == "numeric") & length(dot.border.size)== 1L){ # convert the single value into a list of single value + list.dot.border.size <- vector(mode = "list", length = length(data1)) + list.dot.border.size[] <- dot.border.size + } + if( ! is.null(dot.border.color)){ + if( ! ((all(class(dot.border.color) == "list") & length(data1) == length(dot.border.color)) | ((all(mode(dot.border.color) == "character") | all(mode(dot.border.color) == "numeric")) & length(dot.border.color)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER STRING OR INTEGER") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if((all(mode(dot.border.color) == "character") | all(mode(dot.border.color) == "numeric")) & length(dot.border.color)== 1L){ # convert the single value into a list of single value + list.dot.border.color <- vector(mode = "list", length = length(data1)) + list.dot.border.color[] <- dot.border.color + } + } + if( ! ((all(class(line.size) == "list") & length(data1) == length(line.size)) | (all(mode(line.size) == "numeric") & length(line.size)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(line.size) == "numeric") & length(line.size)== 1L){ # convert the single value into a list of single value + list.line.size <- vector(mode = "list", length = length(data1)) + list.line.size[] <- line.size + } + if( ! ((all(class(line.type) == "list") & length(data1) == length(line.type)) | (all(mode(line.type) != "list") & length(line.type)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE LINE KIND VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(line.type) != "list") & length(line.type)== 1L){ # convert the single value into a list of single value + list.line.type <- vector(mode = "list", length = length(data1)) + list.line.type[] <- line.type + } + if( ! is.null(legend.name)){ + if( ! (all(class(legend.name) == "list") & length(data1) == length(legend.name))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + } + # end check list lengths (and names of data1 compartments if present) + # conversion into lists + if(all(is.data.frame(data1))){ + data1 <- list(L1 = data1) + if(all(class(x) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + x <- list(L1 = x) + } + if(all(class(y) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + y <- list(L1 = y) + } + if( ! is.null(categ)){ + if(all(class(categ) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + categ <- list(L1 = categ) + } + } + if( ! is.null(categ.class.order)){ + if(all(class(categ.class.order) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + categ.class.order <- list(L1 = categ.class.order) + } + } + if( ! is.null(color)){ + if(all(class(color) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + color <- list(L1 = color) + } + } + if(all(class(geom) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + geom <- list(L1 = geom) + } + if(all(class(geom.step.dir) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + geom.step.dir <- list(L1 = geom.step.dir) + } + if( ! is.null(geom.stick.base)){ + if(all(class(geom.stick.base) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + geom.stick.base <- list(L1 = geom.stick.base) + } + } + if(all(class(alpha) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + alpha <- list(L1 = alpha) + } + if(all(class(dot.size) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + dot.size <- list(L1 = dot.size) + } + if(all(class(dot.shape) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + dot.shape <- list(L1 = dot.shape) + } + if(all(class(dot.border.size) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + dot.border.size <- list(L1 = dot.border.size) + } + if( ! is.null(dot.border.color)){ + if(all(class(dot.border.color) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + dot.border.color <- list(L1 = dot.border.color) + } + } + if(all(class(line.size) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + line.size <- list(L1 = line.size) + } + if(all(class(line.type) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + line.type <- list(L1 = line.type) + } + if( ! is.null(legend.name)){ + if(all(class(legend.name) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + legend.name <- list(L1 = legend.name) + } + } + }else if( ! all(sapply(data1, FUN = "class") == "data.frame")){ # if not a data frame, data1 can only be a list, as tested above + tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OR A LIST OF DATA FRAMES") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + # single value converted into list now reattributed to the argument name + if( ! is.null(color)){ + if( ! is.null(list.color)){ + color <- list.color + } + } + if( ! is.null(list.geom)){ + geom <- list.geom + } + if( ! is.null(list.geom.step.dir)){ + geom.step.dir <- list.geom.step.dir + } + if( ! is.null(geom.stick.base)){ + if( ! is.null(list.geom.stick.base)){ + geom.stick.base <- list.geom.stick.base + } + } + if( ! is.null(list.alpha)){ + alpha <- list.alpha + } + if( ! is.null(list.dot.size)){ + dot.size <- list.dot.size + } + if( ! is.null(list.dot.shape)){ + dot.shape <- list.dot.shape + } + if( ! is.null(list.dot.border.size)){ + dot.border.size <- list.dot.border.size + } + if( ! is.null(dot.border.color)){ + if( ! is.null(list.dot.border.color)){ + dot.border.color <- list.dot.border.color + } + } + if( ! is.null(list.line.size)){ + line.size <- list.line.size + } + if( ! is.null(list.line.type)){ + line.type <- list.line.type + } + # end single value converted into list now reattributed to the argument name + # data, x, y, geom, alpha, dot.size, shape, dot.border.size, line.size, line.type, legend.name are list now + # if non-null, categ, categ.class.order, legend.name, color, dot.border.color are list now + # end conversion into lists + # verif of add + if( ! is.null(add)){ + if( ! grepl(pattern = "^\\s*\\+", add)){ # check that the add string start by + + tempo.cat <- paste0("ERROR IN ", function.name, ": add ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + + }else if( ! grepl(pattern = "(ggplot2|lemon)\\s*::", add)){ # + tempo.cat <- paste0("ERROR IN ", function.name, ": FOR EASIER FUNCTION DETECTION, add ARGUMENT MUST CONTAIN \"ggplot2::\" OR \"lemon::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if( ! grepl(pattern = ")\\s*$", add)){ # check that the add string finished by ) + tempo.cat <- paste0("ERROR IN ", function.name, ": add ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + # end verif of add + # management of add containing facet + facet.categ <- NULL + if( ! is.null(add)){ + facet.check <- TRUE + tempo <- unlist(strsplit(x = add, split = "\\s*\\+\\s*(ggplot2|lemon)\\s*::\\s*")) # + tempo <- sub(x = tempo, pattern = "^facet_wrap", replacement = "ggplot2::facet_wrap") + tempo <- sub(x = tempo, pattern = "^facet_grid", replacement = "ggplot2::facet_grid") + tempo <- sub(x = tempo, pattern = "^facet_rep", replacement = "lemon::facet_rep") + if(length(data1) > 1 & (any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")) | grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid"))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nfacet PANELS CANNOT BE USED IF MORE THAN ONE DATA FRAME IN THE data1 ARGUMENT\nPLEASE REWRITE THE add STRING AND RERUN") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + if(any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap"))){ + tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")]))) + facet.categ <- list(names(tempo1$params$facets)) # list of length 1 + tempo.text <- "facet_wrap OR facet_rep_wrap" + facet.check <- FALSE + }else if(grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")){ + tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")]))) + facet.categ <- list(c(names(tempo1$params$rows), names(tempo1$params$cols))) # list of length 1 + tempo.text <- "facet_grid OR facet_rep_grid" + facet.check <- FALSE + } + if(facet.check == FALSE & ! all(facet.categ %in% names(data1[[1]]))){ # WARNING: all(facet.categ %in% names(data1)) is TRUE when facet.categ is NULL + tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF \"", tempo.text, "\" STRING IN THE add ARGUMENT BUT PROBLEM OF VARIABLE DETECTION (COLUMN NAMES OF data1)\nTHE DETECTED VARIABLES ARE:\n", paste(facet.categ, collapse = " "), "\nTHE data1 COLUMN NAMES ARE:\n", paste(names(data1[[1]]), collapse = " "), "\nPLEASE REWRITE THE add STRING AND RERUN") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + } + # if facet.categ is not NULL, it is a list of length 1 now + # end management of add containing facet + # legend name filling + if(is.null(legend.name) & ! is.null(categ)){ + legend.name <- categ + }else if(is.null(legend.name) & is.null(categ)){ + legend.name <- vector("list", length(data1)) # null list + } + # legend.name not NULL anymore (list) + # end legend name filling + # ini categ for legend display + fin.lg.disp <- vector("list", 6) # will be used at the end to display or not legends + fin.lg.disp[] <- FALSE + legend.disp <- vector("list", length(data1)) + if(is.null(categ) | legend.show == FALSE){ + legend.disp[] <- FALSE + }else{ + for(i2 in 1:length(data1)){ + if(is.null(categ[[i2]])){ + legend.disp[[i2]] <- FALSE + }else{ + legend.disp[[i2]] <- TRUE + } + } + } + # end ini categ for legend display + # integer colors into gg_palette + tempo.check.color <- NULL + for(i1 in 1:length(data1)){ + if(any(is.na(color[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), ": color ARGUMENT CANNOT CONTAIN NA") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo.check.color <- c(tempo.check.color, fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem) + } + tempo.check.color <- ! tempo.check.color # invert TRUE and FALSE because if integer, then problem = FALSE + if(any(tempo.check.color == TRUE)){ # convert integers into colors + tempo.integer <- unlist(color[tempo.check.color]) + tempo.color <- fun_gg_palette(max(tempo.integer, na.rm = TRUE)) + for(i1 in 1:length(data1)){ + if(tempo.check.color[i1] == TRUE){ + color[[i1]] <-tempo.color[color[[i1]]] + } + } + } + # end integer colors into gg_palette + # loop (checking inside list compartment) + compart.null.color <- 0 # will be used to attribute a color when color is non-null but a compartment of color is NULL + data1.ini <- data1 # to report NA removal + removed.row.nb <- vector("list", length = length(data1)) # to report NA removal. Contains NULL + removed.rows <- vector("list", length = length(data1)) # to report NA removal. Contains NULL + for(i1 in 1:length(data1)){ + tempo <- fun_check(data = data1[[i1]], data.name = ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "data.frame", na.contain = TRUE, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + # reserved word checking + if(any(names(data1[[i1]]) %in% reserved.words)){ # I do not use fun_name_change() because cannot control y before creating "fake_y". But ok because reserved are not that common + tempo.cat <- paste0("ERROR IN ", function.name, ": COLUMN NAMES OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " ARGUMENT CANNOT BE ONE OF THESE WORDS\n", paste(reserved.words, collapse = " "), "\nTHESE ARE RESERVED FOR THE ", function.name, " FUNCTION") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if( ! (is.null(add))){ + if(any(sapply(X = reserved.words, FUN = grepl, x = add))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF COLUMN NAMES OF data1 IN THE add ARGUMENT STRING, THAT CORRESPOND TO RESERVED STRINGS FOR ", function.name, "\nFOLLOWING COLUMN NAMES HAVE TO BE CHANGED:\n", paste(arg.names[sapply(X = reserved.words, FUN = grepl, x = add)], collapse = "\n"), "\nFOR INFORMATION, THE RESERVED WORDS ARE:\n", paste(reserved.words, collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(any(sapply(X = arg.names, FUN = grepl, x = add))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NAMES OF ", function.name, " ARGUMENTS DETECTED IN THE add STRING:\n", paste(arg.names[sapply(X = arg.names, FUN = grepl, x = add)], collapse = "\n"), "\nRISK OF WRONG OBJECT USAGE INSIDE ", function.name) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end reserved word checking + # check of geom now because required for y argument + tempo <- fun_check(data = geom[[i1]], data.name = ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), options = c("geom_point", "geom_line", "geom_path", "geom_step", "geom_hline", "geom_vline", "geom_stick"), length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(geom[[i1]] == "geom_step" & is.null(geom.step.dir[[i1]])){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(geom.step.dir)== 1L, "geom.step.dir", paste0("ELEMENT ", i1, " OF geom.step.dir ARGUMENT")), ": geom.step.dir ARGUMENT CANNOT BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("ELEMENT ", i1, " OF geom")), " ARGUMENT IS \"geom_step\"\nHERE geom.step.dir ARGUMENT IS: ", paste(geom.step.dir[[i1]], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(geom[[i1]] == "geom_step" & ! is.null(geom.step.dir[[i1]])){ + tempo <- fun_check(data = geom.step.dir[[i1]], data.name = ifelse(length(geom.step.dir)== 1L, "geom.step.dir", paste0("geom.step.dir NUMBER ", i1)), options = c("vh", "hv", "mid"), length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if( ! (is.null(geom.stick.base))){ + if(geom[[i1]] == "geom_stick" & ! is.null(geom.stick.base[[i1]])){ + tempo <- fun_check(data = geom.stick.base[[i1]], data.name = ifelse(length(geom.stick.base)== 1L, "geom.stick.base", paste0("geom.stick.base NUMBER ", i1)), mode = "numeric", length = 1, na.contain = FALSE, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + } + # end check of geom now because required for y argument + if(is.null(x[[i1]])){ + if(all(geom[[i1]] != "geom_hline")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": x ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom)== 1L, "x", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + x[[i1]] <- "fake_x" + data1[[i1]] <- cbind(data1[[i1]], fake_x = NA, stringsAsFactors = TRUE) + data1[[i1]][, "fake_x"] <- as.numeric(data1[[i1]][, "fake_x"]) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", NAMED \"fake_x\" FOR FINAL DRAWING") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else{ + if(all(geom[[i1]] == "geom_hline")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": x ARGUMENT MUST BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo <- fun_check(data = x[[i1]], data.name = ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), class = "vector", mode = "character", length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(is.null(y[[i1]])){ + if(all(geom[[i1]] != "geom_vline")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": y ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom)== 1L, "y", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + y[[i1]] <- "fake_y" + data1[[i1]] <- cbind(data1[[i1]], fake_y = NA, stringsAsFactors = TRUE) + data1[[i1]][, "fake_y"] <- as.numeric(data1[[i1]][, "fake_y"]) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", NAMED \"fake_y\" FOR FINAL DRAWING") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else{ + if(all(geom[[i1]] == "geom_vline")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": y ARGUMENT MUST BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo <- fun_check(data = y[[i1]], data.name = ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), class = "vector", mode = "character", length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + # x[[i1]] and y[[i1]] not NULL anymore + if( ! (x[[i1]] %in% names(data1[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(x[[i1]], collapse = " ")))) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if( ! (y[[i1]] %in% names(data1[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(y[[i1]], collapse = " ")))) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo <- fun_check(data = data1[[i1]][, x[[i1]]], data.name = ifelse(length(x)== 1L, "x ARGUMENT (AS COLUMN NAME OF data1 DATA FRAME)", paste0("ELEMENT ", i1, " OF x ARGUMENT", " (AS COLUMN NAME OF data1 DATA FRAME NUMBER ", i1, ")")), class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo <- fun_check(data = data1[[i1]][, y[[i1]]], data.name = ifelse(length(y)== 1L, "y ARGUMENT (AS COLUMN NAME OF data1 DATA FRAME)", paste0("ELEMENT ", i1, " OF y ARGUMENT", " (AS COLUMN NAME OF data1 DATA FRAME NUMBER ", i1, ")")), class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(x[[i1]] == "fake_x" & y[[i1]] == "fake_y"){ # because the code cannot accept to be both "fake_x" and "fake_y" at the same time + tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 2\nTHE CODE CANNOT ACCEPT x AND y TO BE \"fake_x\" AND \"fake_y\" IN THE SAME DATA FRAME ", i1, " ") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + + if(( ! is.null(categ)) & ( ! is.null(categ[[i1]]))){ # is.null(categ[[i1]]) works even if categ is NULL # is.null(categ[[i1]]) works even if categ is NULL # if categ[[i1]] = NULL, fake_categ will be created later on + tempo <- fun_check(data = categ[[i1]], data.name = ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")),, class = "vector", mode = "character", length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if( ! (categ[[i1]] %in% names(data1[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(categ[[i1]], collapse = " ")))) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo1 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "factor", na.contain = TRUE, fun.name = function.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " MUST BE A FACTOR OR CHARACTER VECTOR") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(tempo1$problem == FALSE){ + data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + + } + if(geom[[i1]] == "geom_vline" | geom[[i1]] == "geom_hline"){ + if(length(unique(data1[[i1]][, categ[[i1]]])) != nrow(data1[[i1]])){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(geom)== 1L, "geom OF data1 ARGUMENT", paste0("geom NUMBER ", i1, " OF DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " ARGUMENT IS ", geom[[i1]], ", MEANING THAT ", ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " MUST HAVE A DIFFERENT CLASS PER LINE OF data1 (ONE x VALUE PER CLASS)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + }else if(( ! is.null(categ)) & is.null(categ[[i1]])){ # is.null(categ[[i1]]) works even if categ is NULL # if categ[[i1]] = NULL, fake_categ will be created. WARNING: is.null(categ[[i1]]) means no legend display (see above), because categ has not been precised. This also means a single color for data1[[i1]] + if(length(color[[i1]]) > 1){ # 0 means is.null(color[[i1]]) or is.null(color) and 1 is ok -> single color for data1[[i1]] + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT BUT CORRESPONDING COLORS IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " HAS LENGTH OVER 1\n", paste(color[[i1]], collapse = " "), "\nWHICH IS NOT COMPATIBLE WITH NULL CATEG -> COLOR RESET TO A SINGLE COLOR") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + color[i1] <- list(NULL) # will provide a single color below # Warning color[[i1]] <- NULL removes the compartment + } + categ[[i1]] <- "fake_categ" + data1[[i1]] <- cbind(data1[[i1]], fake_categ = "", stringsAsFactors = TRUE) + # inactivated because give a different color to different "Line_" categ while a single color for all the data1[[i1]] required. Thus, put back after the color management + # if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ + # data1[[i1]][, "fake_categ"] <- paste0("Line_", 1:nrow(data1[[i1]])) + # }else{ + data1[[i1]][, "fake_categ"] <- data1[[i1]][, "fake_categ"] # as.numeric("") create a vector of NA but class numeric + # } + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT -> FOR DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT:", paste0("NUMBER ", i1, " OF data1 ARGUMENT:")), "\n- FAKE \"fake_categ\" COLUMN ADDED FILLED WITH \"\"(OR WITH \"Line_...\" FOR LINES)\n- SINGLE COLOR USED FOR PLOTTING\n- NO LEGEND DISPLAYED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # OK: if categ is not NULL, all the non-null categ columns of data1 are factors from here + + # management of log scale and Inf removal + if(x[[i1]] != "fake_x"){ + if(any(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN ", ifelse(length(categ)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(y[[i1]] != "fake_y"){ + if(any(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN ", ifelse(length(categ)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # log conversion + if(x.log != "no"){ + tempo1 <- ! is.finite(data1[[i1]][, x[[i1]]]) # where are initial NA and Inf + data1[[i1]][, x[[i1]]] <- suppressWarnings(get(x.log)(data1[[i1]][, x[[i1]]]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + if(any( ! (tempo1 | is.finite(data1[[i1]][, x[[i1]]])))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN ", ifelse(length(categ)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(y.log != "no"){ + tempo1 <- ! is.finite(data1[[i1]][, y[[i1]]]) # where are initial NA and Inf + data1[[i1]][, y[[i1]]] <- suppressWarnings(get(y.log)(data1[[i1]][, y[[i1]]]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + if(any( ! (tempo1 | is.finite(data1[[i1]][, y[[i1]]])))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN ", ifelse(length(categ)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # Inf removal + # removed.row.nb[[i1]] <- NULL # already NULL and Warning this removes the compartment + removed.rows[[i1]] <- data.frame(stringsAsFactors = FALSE) + if(any(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])) detects only Inf + removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], which(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))) + } + if(any(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])) detects only Inf + removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], which(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))) + } + if( ! is.null(removed.row.nb[[i1]])){ + removed.row.nb[[i1]] <- unique(removed.row.nb[[i1]]) # to remove the duplicated positions (NA in both x and y) + removed.rows[[i1]] <- rbind(removed.rows[[i1]], data1.ini[[i1]][removed.row.nb[[i1]], ]) # here data1.ini used to have the y = O rows that will be removed because of Inf creation after log transformation + data1[[i1]] <- data1[[i1]][-removed.row.nb[[i1]], ] + data1.ini[[i1]] <- data1.ini[[i1]][-removed.row.nb[[i1]], ] # + } + # From here, data1 and data.ini have no more Inf + # end Inf removal + # x.lim and y.lim dealt later on, after the end f the loop + # end management of log scale and Inf removal + # management of log scale + if(x.log != "no"){ + data1[[i1]][, x[[i1]]] <- suppressWarnings(get(x.log)(data1[[i1]][, x[[i1]]])) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + } + if(y.log != "no"){ + data1[[i1]][, y[[i1]]] <- suppressWarnings(get(y.log)(data1[[i1]][, y[[i1]]])) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + } + # end management of log scale + # na detection and removal + column.check <- unique(unlist(c( # unlist because creates a list + if(x[[i1]] == "fake_x"){NULL}else{x[[i1]]}, + if(y[[i1]] == "fake_y"){NULL}else{y[[i1]]}, + if( ! is.null(categ)){if(is.null(categ[[i1]])){NULL}else{categ[[i1]]}}, + if( ! is.null(facet.categ)){if(is.null(facet.categ[[i1]])){NULL}else{facet.categ[[i1]]}} + ))) # dot.categ because can be a 3rd column of data1 + if(any(is.na(data1[[i1]][, column.check]))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS ", paste(column.check, collapse = " "), " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + for(i3 in 1:length(column.check)){ + if(any(is.na(data1[[i1]][, column.check[i3]]))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i3], " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT"))) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + tempo <- unique(unlist(lapply(lapply(c(data1[[i1]][column.check]), FUN = is.na), FUN = which))) + removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], tempo) + removed.rows[[i1]] <- rbind(removed.rows[[i1]], data1.ini[[i1]][tempo, ]) # # tempo used because removed.row.nb is not empty. Here data1.ini used to have the non NA rows that will be removed because of NAN creation after log transformation (neg values for instance) + column.check <- column.check[ ! (column.check == x[[i1]] | column.check == y[[i1]])] # remove x and y to keep quali columns + if(length(tempo) != 0){ + data1[[i1]] <- data1[[i1]][-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former + data1.ini[[i1]] <- data1.ini[[i1]][-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers than the former + for(i4 in 1:length(column.check)){ + if(any( ! unique(removed.rows[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]]))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i4], " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA REMOVAL\n(IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[[i1]][, column.check[i4]])[ ! unique(removed.rows[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]])], collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + tempo.levels <- levels(data1[[i1]][, column.check[i4]])[levels(data1[[i1]][, column.check[i4]]) %in% unique(as.character(data1[[i1]][, column.check[i4]]))] + data1[[i1]][, column.check[i4]] <- factor(as.character(data1[[i1]][, column.check[i4]]), levels = tempo.levels) + if(column.check[i4] %in% categ[[i1]] & ! is.null(categ.class.order)){ + categ.class.order[[i1]] <- levels(data1[[i1]][, column.check[i4]])[levels(data1[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]])] # remove the absent class in the categ.class.order vector + data1[[i1]][, column.check[i4]] <- factor(as.character(data1[[i1]][, column.check[i4]]), levels = unique(categ.class.order[[i1]])) + } + } + } + } + } + # end na detection and removal + # From here, data1 and data.ini have no more NA or NaN in x, y, categ (if categ != NULL) and facet.categ (if categ != NULL) + if( ! is.null(categ.class.order)){ + # the following check will be done several times but I prefer to keep it here, after the creation of categ + if(is.null(categ[[i1]]) & ! is.null(categ.class.order[[i1]])){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ ARGUMENT CANNOT BE NULL IF COMPARTMENT ", i1, " OF categ.class.order ARGUMENT IS NOT NULL: ", paste(categ.class.order, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + if(is.null(categ.class.order[[i1]])){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE categ.class.order COMPARTMENT ", i1, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + data1[[i1]][, categ[[i1]]] <- factor(as.character(data1[[i1]][, categ[[i1]]])) # if already a factor, change nothing, if characters, levels according to alphabetical order + categ.class.order[[i1]] <- levels(data1[[i1]][, categ[[i1]]]) # character vector that will be used later + }else{ + tempo <- fun_check(data = categ.class.order[[i1]], data.name = paste0("COMPARTMENT ", i1 , " OF categ.class.order ARGUMENT"), class = "vector", mode = "character", length = length(levels(data1[[i1]][, categ[[i1]]])), fun.name = function.name) # length(data1[, categ[i1]) -> if data1[, categ[i1] was initially character vector, then conversion as factor after the NA removal, thus class number ok. If data1[, categ[i1] was initially factor, no modification after the NA removal, thus class number ok + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(any(duplicated(categ.class.order[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i1]], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if( ! (all(categ.class.order[[i1]] %in% unique(data1[[i1]][, categ[[i1]]])) & all(unique(data1[[i1]][, categ[[i1]]]) %in% categ.class.order[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ.class.order ARGUMENT MUST BE CLASSES OF COMPARTMENT ", i1, " OF categ ARGUMENT\nHERE IT IS:\n", paste(categ.class.order[[i1]], collapse = " "), "\nFOR COMPARTMENT ", i1, " OF categ.class.order AND IT IS:\n", paste(unique(data1[[i1]][, categ[[i1]]]), collapse = " "), "\nFOR COLUMN ", categ[[i1]], " OF data1 NUMBER ", i1) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]], levels = categ.class.order[[i1]]) # reorder the factor + } + names(categ.class.order)[i1] <- categ[[i1]] + } + } + # OK: if categ.class.order is not NULL, all the NULL categ.class.order columns of data1 are character from here + + if( ! is.null(legend.name[[i1]])){ + tempo <- fun_check(data = legend.name[[i1]], data.name = ifelse(length(legend.name)== 1L, "legend.name", paste0("legend.name NUMBER ", i1)),, class = "vector", mode = "character", length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if( ! is.null(color)){ # if color is NULL, will be filled later on + # check the nature of color + if(is.null(color[[i1]])){ + compart.null.color <- compart.null.color + 1 + color[[i1]] <- grey(compart.null.color / 8) # cannot be more than 7 overlays. Thus 7 different greys. 8/8 is excluded because white dots + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL COLOR IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " ASSOCIATED TO ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", SINGLE COLOR ", paste(color[[i1]], collapse = " "), " HAS BEEN ATTRIBUTED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + tempo1 <- fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) # na.contain = TRUE in case of colum of data1 + tempo2 <- fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "factor", na.contain = TRUE, fun.name = function.name) # idem + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR") # integer possible because dealt above + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if( ! (all(color[[i1]] %in% colors() | grepl(pattern = "^#", color[[i1]])))){ # check that all strings of low.color start by # + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(color[[i1]]), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(any(is.na(color[[i1]]))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), ", THE COLORS:\n", paste(unique(color[[i1]]), collapse = " "), "\nCONTAINS NA") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # end check the nature of color + # check the length of color + if(is.null(categ) & length(color[[i1]]) != 1){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A SINGLE COLOR IF categ IS NULL") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if( ! is.null(categ)){ + # No problem of NA management by ggplot2 because already removed + if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A SINGLE COLOR IF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IS NULL") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(length(color[[i1]]) == length(unique(data1[[i1]][, categ[[i1]]]))){ # here length(color) is equal to the different number of categ + data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE FOLLOWING COLORS:\n", paste(color[[i1]], collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else if(length(color[[i1]]) == length(data1[[i1]][, categ[[i1]]])){# here length(color) is equal to nrow(data1[[i1]]) -> Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) + data1[[i1]] <- cbind(data1[[i1]], color = color[[i1]], stringsAsFactors = TRUE) + tempo.check <- unique(data1[[i1]][ , c(categ[[i1]], "color")]) + if( ! (nrow(data1[[i1]]) == length(color[[i1]]) & nrow(tempo.check) == length(unique(data1[[i1]][ , categ[[i1]]])))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color")), " ARGUMENT HAS THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF THIS categ:\n", paste(unique(mapply(FUN = "paste", data1[[i1]][ ,categ[[i1]]], data1[[i1]][ ,"color"])), collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order + color[[i1]] <- unique(color[[i1]][order(data1[[i1]][, categ[[i1]]])]) # Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count, ") FROM FUNCTION ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " HAS THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " COLUMN VALUES\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ AS:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\n", paste(color[[i1]], collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else if(length(color[[i1]])== 1L){ + data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order + color[[i1]] <- rep(color[[i1]], length(levels(data1[[i1]][, categ[[i1]]]))) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", COLOR HAS LENGTH 1 MEANING THAT ALL THE DIFFERENT CLASSES OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), "\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(color[[i1]], collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE\n(1) LENGTH 1\nOR (2) THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " COLUMN VALUES\nOR (3) THE LENGTH OF THE CLASSES IN THIS COLUMN\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LENGTH ", length(data1[[i1]][, categ[[i1]]]), " AND CATEG CLASS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\nPRESENCE OF NA IN THE COLUMN x, y OR categ OF data1 COULD BE THE PROBLEME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + } + if((geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline") & ! is.null(categ[[i1]])){ # add here after the color management, to deal with the different lines to plot inside any data[[i1]] + if(categ[[i1]] == "fake_categ"){ + data1[[i1]][, "fake_categ"] <- factor(paste0("Line_", formatC(1:nrow(data1[[i2]]), width = nchar(nrow(data1[[i2]])), flag = "0"))) + } + } + tempo <- fun_check(data = alpha[[i1]], data.name = ifelse(length(alpha)== 1L, "alpha", paste0("alpha NUMBER ", i1)), prop = TRUE, length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + # end loop (checking inside list compartment) + if(length(data1) > 1){ + if(length(unique(unlist(x)[ ! x == "fake_x"])) > 1){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE x ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(x), collapse = " "), "\nX-AXIS OVERLAYING DIFFERENT VARIABLES?") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(length(data1) > 1){ + if(length(unique(unlist(y)[ ! y == "fake_y"])) > 1){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE y ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(y), collapse = " "), "\nY-AXIS OVERLAYING DIFFERENT VARIABLES?") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(sum(geom %in% "geom_point") > 3){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE \"geom_point\" ELEMENTS") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(length(geom) - sum(geom %in% "geom_point") > 3){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE LINE ELEMENTS") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + # x.lim management before transfo by x.log + if(x.log != "no" & ! is.null(x.lim)){ + if(any(x.lim <= 0)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE x.log ARGUMENT SET TO ", x.log, ":\n", paste(x.lim, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(any( ! is.finite(if(x.log == "log10"){log10(x.lim)}else{log2(x.lim)}))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT RETURNS INF/NA WITH THE x.log ARGUMENT SET TO ", x.log, "\nAS SCALE COMPUTATION IS ", ifelse(x.log == "log10", "log10", "log2"), ":\n", paste(if(x.log == "log10"){log10(x.lim)}else{log2(x.lim)}, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(x.log != "no" & x.include.zero == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") x.log ARGUMENT SET TO ", x.log, " AND x.include.zero ARGUMENT SET TO TRUE -> x.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + x.include.zero <- FALSE + } + # end x.lim management before transfo by x.log + # y.lim management before transfo by y.log + if(y.log != "no" & ! is.null(y.lim)){ + if(any(y.lim <= 0)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(any( ! is.finite(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT RETURNS INF/NA WITH THE y.log ARGUMENT SET TO ", y.log, "\nAS SCALE COMPUTATION IS ", ifelse(y.log == "log10", "log10", "log2"), ":\n", paste(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(y.log != "no" & y.include.zero == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") y.log ARGUMENT SET TO ", y.log, " AND y.include.zero ARGUMENT SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + y.include.zero <- FALSE + } + # end y.lim management before transfo by y.log + # end other checkings + # reserved word checking + #already done above + # end reserved word checking + # end second round of checking and data preparation + + + # package checking + fun_pack(req.package = c( + "gridExtra", + "ggplot2", + "lemon", + "scales" + ), lib.path = lib.path) + # packages Cairo and grid tested by fun_gg_point_rast() + # end package checking + + + + + # main code + # axes management + if(is.null(x.lim)){ + if(any(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE x COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + x.lim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. y.lim added here. If NULL, ok if y argument has values + }else if(x.log != "no"){ + x.lim <- get(x.log)(x.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + } + if(x.log != "no"){ + if(any( ! is.finite(x.lim))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE x.log ARGUMENT SET TO ", x.log, ":\n", paste(x.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(suppressWarnings(all(x.lim %in% c(Inf, -Inf)))){ # happen when x is only NULL + if(all(unlist(geom) %in% c("geom_vline", "geom_stick"))){ + tempo.cat <- paste0("ERROR IN ", function.name, " NOT POSSIBLE TO DRAW geom_vline OR geom_stick KIND OF LINES ALONE IF x.lim ARGUMENT IS SET TO NULL, SINCE NO X-AXIS DEFINED (", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, " x.lim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(x.lim, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + x.lim.order <- order(x.lim) # to deal with inverse axis + # print(x.lim.order) + x.lim <- sort(x.lim) + x.lim[1] <- x.lim[1] - abs(x.lim[2] - x.lim[1]) * ifelse(diff(x.lim.order) > 0, x.right.extra.margin, x.left.extra.margin) # diff(x.lim.order) > 0 means not inversed axis + x.lim[2] <- x.lim[2] + abs(x.lim[2] - x.lim[1]) * ifelse(diff(x.lim.order) > 0, x.left.extra.margin, x.right.extra.margin) # diff(x.lim.order) > 0 means not inversed axis + if(x.include.zero == TRUE){ # no need to check x.log != "no" because done before + x.lim <- range(c(x.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only + } + x.lim <- x.lim[x.lim.order] + if(any(is.na(x.lim))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 3") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(is.null(y.lim)){ + if(any(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE y COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + y.lim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. y.lim added here. If NULL, ok if y argument has values + }else if(y.log != "no"){ + y.lim <- get(y.log)(y.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + } + if(y.log != "no"){ + if(any( ! is.finite(y.lim))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(suppressWarnings(all(y.lim %in% c(Inf, -Inf)))){ # happen when y is only NULL + if(all(unlist(geom) == "geom_vline")){ + tempo.cat <- paste0("ERROR IN ", function.name, " NOT POSSIBLE TO DRAW geom_vline KIND OF LINES ALONE IF y.lim ARGUMENT IS SET TO NULL, SINCE NO Y-AXIS DEFINED (", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, " y.lim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(y.lim, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + y.lim.order <- order(y.lim) # to deal with inverse axis + y.lim <- sort(y.lim) + y.lim[1] <- y.lim[1] - abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(y.lim.order) > 0 means not inversed axis + y.lim[2] <- y.lim[2] + abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(y.lim.order) > 0 means not inversed axis + if(y.include.zero == TRUE){ # no need to check y.log != "no" because done before + y.lim <- range(c(y.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only + } + y.lim <- y.lim[y.lim.order] + if(any(is.na(y.lim))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 4") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + # end axes management + + + + + # create a fake categ if NULL to deal with legend display + if(is.null(categ)){ + categ <- vector("list", length(data1)) + categ[] <- "fake_categ" + for(i2 in 1:length(data1)){ + data1[[i2]] <- cbind(data1[[i2]], fake_categ = "", stringsAsFactors = TRUE) + if(geom[[i2]] == "geom_hline" | geom[[i2]] == "geom_vline"){ + data1[[i2]][, "fake_categ"] <- factor(paste0("Line_", 1:nrow(data1[[i2]]))) + } + } + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL categ ARGUMENT -> FAKE \"fake_categ\" COLUMN ADDED TO EACH DATA FRAME OF data1, AND FILLED WITH \"\"") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # categ is not NULL anymore + if(is.null(categ.class.order)){ + categ.class.order <- vector("list", length = length(data1)) + tempo.categ.class.order <- NULL + for(i2 in 1:length(categ.class.order)){ + categ.class.order[[i2]] <- levels(data1[[i2]][, categ[[i2]]]) + names(categ.class.order)[i2] <- categ[[i2]] + tempo.categ.class.order <- c(tempo.categ.class.order, ifelse(i2 != 1, "\n", ""), categ.class.order[[i2]]) + } + if(any(unlist(legend.disp))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR CLASS ORDERING:\n", paste(tempo.categ.class.order, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end create a fake categ if NULL to deal with legend display + # categ.class.order is not NULL anymore + + + # vector of color with length as in levels(categ) of data1 + if(is.null(color)){ + color <- vector("list", length(data1)) + length.categ.list <- lapply(lapply(mapply(FUN = "[[", data1, categ, SIMPLIFY = FALSE), FUN = unique), FUN = function(x){length(x[ ! is.na(x)])}) + length.categ.list[sapply(categ, FUN = "==", "fake_categ")] <- 1 # when is.null(color), a single color for all the dots or lines of data[[i1]] that contain "fake_categ" category + total.categ.length <- sum(unlist(length.categ.list), na.rm = TRUE) + tempo.color <- fun_gg_palette(total.categ.length) + tempo.count <- 0 + for(i2 in 1:length(data1)){ + color[[i2]] <- tempo.color[(1:length.categ.list[[i2]]) + tempo.count] + tempo.count <- tempo.count + length.categ.list[[i2]] + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i2, " OF categ ARGUMENT")), " (", categ[[i2]], ") IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i2, " OF data1 ARGUMENT")), ":\n", paste(color[[i2]], collapse = " "), "\n", paste(if(all(levels(data1[[i2]][, categ[[i2]]]) == "")){'\"\"'}else{levels(data1[[i2]][, categ[[i2]]])}, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end vector of color with length as in levels(categ) of data1 + # color is not NULL anymore + + + + + + # last check + for(i1 in 1:length(data1)){ + if(categ[[i1]] != "fake_categ" & length(color[[i1]]) != length(unique(data1[[i1]][, categ[[i1]]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\nREMINDER: A SINGLE COLOR PER CLASS OF CATEG AND A SINGLE CLASS OF CATEG PER COLOR MUST BE RESPECTED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ + tempo.cat <- paste0("ERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE LENGTH 1 WHEN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IS NULL\nHERE IT IS COLOR LENGTH ", length(color[[i1]])) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + # end last check + + + + + + # conversion of geom_hline and geom_vline + for(i1 in 1:length(data1)){ + if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ + final.data.frame <- data.frame() + for(i3 in 1:nrow(data1[[i1]])){ + tempo.data.frame <- rbind(data1[[i1]][i3, ], data1[[i1]][i3, ], stringsAsFactors = TRUE) + if(geom[[i1]] == "geom_hline"){ + tempo.data.frame[, x[[i1]]] <- x.lim + }else if(geom[[i1]] == "geom_vline"){ + tempo.data.frame[, y[[i1]]] <- y.lim + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 5") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + # 3 lines below inactivated because I put that above + # if(is.null(categ[[i1]])){ + # data1[, "fake_categ"] <- paste0("Line_", i3) + # } + final.data.frame <- rbind(final.data.frame, tempo.data.frame, stringsAsFactors = TRUE) + } + data1[[i1]] <- final.data.frame + geom[[i1]] <- "geom_line" + if(length(color[[i1]])== 1L){ + color[[i1]] <- rep(color[[i1]], length(unique(data1[[i1]][ , categ[[i1]]]))) + }else if(length(color[[i1]]) != length(unique(data1[[i1]][ , categ[[i1]]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, " geom_hline AND geom_vline CONVERSION TO FIT THE XLIM AND YLIM LIMITS OF THE DATA: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]]))) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + } + # end conversion of geom_hline and geom_vline + + + + + # kind of geom_point (vectorial or raster) + scatter.kind <- vector("list", length = length(data1)) # list of same length as data1, that will be used to use either ggplot2::geom_point() (vectorial dot layer) or fun_gg_point_rast() (raster dot layer) + fix.ratio <- FALSE + if(is.null(raster.threshold)){ + if(raster == TRUE){ + scatter.kind[] <- "fun_gg_point_rast" # not important to fill everything: will be only used when geom == "geom_point" + fix.ratio <- TRUE + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET BY THE raster.ratio ARGUMENT (", fun_round(raster.ratio, 2), ") TO AVOID A BUG OF ELLIPSOID DOT DRAWING") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else{ + scatter.kind[] <- "ggplot2::geom_point" + } + }else{ + for(i2 in 1:length(data1)){ + if(geom[[i2]] == "geom_point"){ + if(nrow(data1[[i2]]) <= raster.threshold){ + scatter.kind[[i2]] <- "ggplot2::geom_point" + }else{ + scatter.kind[[i2]] <- "fun_gg_point_rast" + fix.ratio <- TRUE + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i2, " OF data1 ARGUMENT")), " LAYER AS RASTER (NOT VECTORIAL)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + } + if(any(unlist(scatter.kind) == "fun_gg_point_rast")){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET BY THE raster.ratio ARGUMENT (", fun_round(raster.ratio, 2), ") TO AVOID A BUG OF ELLIPSOID DOT DRAWING") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end kind of geom_point (vectorial or raster) + + + + + # no need loop part + coord.names <- NULL + tempo.gg.name <- "gg.indiv.plot." + tempo.gg.count <- 0 + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(x.lab)){x[[1]]}else{x.lab})) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(y.lab)){y[[1]]}else{y.lab})) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) + # text angle management + x.tempo.just <- fun_gg_just(angle = x.text.angle, pos = "bottom", kind = "axis") + y.tempo.just <- fun_gg_just(angle = y.text.angle, pos = "left", kind = "axis") + # end text angle management + add.check <- TRUE + if( ! is.null(add)){ # if add is NULL, then = 0 + if(grepl(pattern = "ggplot2::theme", add) == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT\n-> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER\n-> article ARGUMENT WILL BE IGNORED\nIT IS RECOMMENDED TO USE \"+ theme(aspect.ratio = raster.ratio)\" IF RASTER MODE IS ACTIVATED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + add.check <- FALSE + } + } + if(add.check == TRUE & article == TRUE){ + # WARNING: not possible to add several times theme(). NO message but the last one overwrites the others + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) + if(grid == TRUE){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + line = ggplot2::element_line(size = 0.5), + axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis + axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis + panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.minor.x = ggplot2::element_line(colour = "grey90", size = 0.25), + panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), + axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), + axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), + aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster + )) + }else{ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + line = ggplot2::element_line(size = 0.5), + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + axis.line.y.left = ggplot2::element_line(colour = "black"), + axis.line.x.bottom = ggplot2::element_line(colour = "black"), + axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), + axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), + aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster + )) + } + }else if(add.check == TRUE & article == FALSE){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + line = ggplot2::element_line(size = 0.5), + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + panel.background = ggplot2::element_rect(fill = "grey95"), + axis.line.y.left = ggplot2::element_line(colour = "black"), + axis.line.x.bottom = ggplot2::element_line(colour = "black"), + panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.minor.x = ggplot2::element_line(colour = "grey90", size = 0.25), + panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), + strip.background = ggplot2::element_rect(fill = "white", colour = "black"), + axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), + axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), + aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster + # do not work -> legend.position = "none" # to remove the legend completely: https://www.datanovia.com/en/blog/how-to-remove-legend-from-a-ggplot/ + )) + } + # end no need loop part + + + # loop part + point.count <- 0 + line.count <- 0 + lg.order <- vector(mode = "list", length = 6) # order of the legend + lg.order <- lapply(lg.order, as.numeric) # order of the legend + lg.color <- vector(mode = "list", length = 6) # color of the legend + lg.dot.shape <- vector(mode = "list", length = 6) # etc. + lg.dot.size <- vector(mode = "list", length = 6) # etc. + lg.dot.size <- lapply(lg.dot.size, as.numeric) # etc. + lg.dot.border.size <- vector(mode = "list", length = 6) # etc. + lg.dot.border.size <- lapply(lg.dot.border.size, as.numeric) # etc. + lg.dot.border.color <- vector(mode = "list", length = 6) # etc. + lg.line.size <- vector(mode = "list", length = 6) # etc. + lg.line.size <- lapply(lg.line.size, as.numeric) # etc. + lg.line.type <- vector(mode = "list", length = 6) # etc. + lg.alpha <- vector(mode = "list", length = 6) # etc. + lg.alpha <- lapply(lg.alpha, as.numeric) # etc. + for(i1 in 1:length(data1)){ + if(geom[[i1]] == "geom_point"){ + point.count <- point.count + 1 + if(point.count== 1L){ + fin.lg.disp[[1]] <- legend.disp[[point.count + line.count]] + lg.order[[1]] <- point.count + line.count + lg.color[[1]] <- color[[i1]] # if color == NULL -> NULL + lg.dot.shape[[1]] <- dot.shape[[i1]] + lg.dot.size[[1]] <- dot.size[[i1]] + lg.dot.border.size[[1]] <- dot.border.size[[i1]] + lg.dot.border.color[[1]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL + if(plot == TRUE & fin.lg.disp[[1]] == TRUE & dot.shape[[1]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[1]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[1]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], fill = categ[[i1]]), shape = dot.shape[[i1]], size = dot.size[[i1]], stroke = dot.border.size[[i1]], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = if(i5== 1L){TRUE}else{FALSE})) # WARNING: a single color allowed for color argument outside aesthetic, but here a single color for border --> loop could be inactivated but kept for commodity # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_fill_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = as.character(color[[i1]]), breaks = class.categ)) # values are the values of fill, breaks reorder the classes according to class.categ in the legend, order argument of guide_legend determines the order of the different aesthetics in the legend (not order of classes). See guide_legend settings of scale_..._manual below + } + if(point.count== 2L){ + fin.lg.disp[[2]] <- legend.disp[[point.count + line.count]] + lg.order[[2]] <- point.count + line.count + lg.color[[2]] <- color[[i1]] # if color == NULL -> NULL + lg.dot.shape[[2]] <- dot.shape[[i1]] + lg.dot.size[[2]] <- dot.size[[i1]] + lg.dot.border.size[[2]] <- dot.border.size[[i1]] + lg.dot.border.color[[2]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL + if(plot == TRUE & fin.lg.disp[[2]] == TRUE & dot.shape[[2]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[2]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[2]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], shape = categ[[i1]]), size = dot.size[[i1]], stroke = dot.border.size[[i1]], fill = color[[i1]][i5], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = FALSE)) # WARNING: a single color allowed for fill argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_shape_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(dot.shape[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of shape, breaks reorder the classes according to class.categ in the legend. See guide_legend settings of scale_..._manual below + + } + if(point.count== 3L){ + fin.lg.disp[[3]] <- legend.disp[[point.count + line.count]] + lg.order[[3]] <- point.count + line.count + lg.color[[3]] <- color[[i1]] # if color == NULL -> NULL + lg.dot.shape[[3]] <- dot.shape[[i1]] + lg.dot.size[[3]] <- dot.size[[i1]] + lg.dot.border.size[[3]] <- dot.border.size[[i1]] + lg.dot.border.color[[3]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL + if(plot == TRUE & fin.lg.disp[[3]] == TRUE & dot.shape[[3]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[3]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[3]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], stroke = categ[[i1]]), shape = dot.shape[[i1]], size = dot.size[[i1]], fill = color[[i1]][i5], stroke = dot.border.size[[i1]], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = FALSE)) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "stroke", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(dot.border.size[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of stroke, breaks reorder the classes according to class.categ in the legend. See guide_legend settings of scale_..._manual below + + } + }else{ + line.count <- line.count + 1 + if(line.count== 1L){ + fin.lg.disp[[4]] <- legend.disp[[point.count + line.count]] + lg.order[[4]] <- point.count + line.count + lg.color[[4]] <- color[[i1]] # if color == NULL -> NULL + lg.line.size[[4]] <- line.size[[i1]] + lg.line.type[[4]] <- line.type[[i1]] + if(plot == TRUE & fin.lg.disp[[4]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[4]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[4]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl + ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting + "(data = tempo.data.frame, mapping = ggplot2::aes(x = ", + x[[i1]], + ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), + y[[i1]], + if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, + ", linetype = ", + categ[[i1]], + "), color = \"", + color[[i1]][i5], + "\", size = ", + line.size[[i1]], + ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), + ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), + ", alpha = ", + alpha[[i1]], + ", show.legend = ", + ifelse(i5== 1L, TRUE, FALSE), + ")" + )))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "linetype", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(line.type[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values, breaks reorder the classes according to class.categ in the legend + } + if(line.count== 2L){ + fin.lg.disp[[5]] <- legend.disp[[point.count + line.count]] + lg.order[[5]] <- point.count + line.count + lg.color[[5]] <- color[[i1]] # if color == NULL -> NULL + lg.line.size[[5]] <- line.size[[i1]] + lg.line.type[[5]] <- line.type[[i1]] + if(plot == TRUE & fin.lg.disp[[5]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[5]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[5]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl + ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting + "(data = tempo.data.frame, mapping = ggplot2::aes(x = ", + x[[i1]], + ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), + y[[i1]], + if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, + ", alpha = ", + categ[[i1]], + "), color = \"", + color[[i1]][i5], + "\", size = ", + line.size[[i1]], + ", linetype = ", + ifelse(is.numeric(line.type[[i1]]), "", "\""), + line.type[[i1]], + ifelse(is.numeric(line.type[[i1]]), "", "\""), + ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), + ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), + ", show.legend = FALSE)" + )))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(alpha[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values, breaks reorder the classes according to class.categ in the legend + } + if(line.count== 3L){ + fin.lg.disp[[6]] <- legend.disp[[point.count + line.count]] + lg.order[[6]] <- point.count + line.count + lg.color[[6]] <- color[[i1]] # if color == NULL -> NULL + lg.line.size[[6]] <- line.size[[i1]] + lg.line.type[[6]] <- line.type[[i1]] + if(plot == TRUE & fin.lg.disp[[6]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[6]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[6]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl + ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting + "(data = tempo.data.frame, mapping = ggplot2::aes(x = ", + x[[i1]], + ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), + y[[i1]], + if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, + ", size = ", + categ[[i1]], + "), color = \"", + color[[i1]][i5], + "\", linetype = ", + ifelse(is.numeric(line.type[[i1]]), "", "\""), + line.type[[i1]], + ifelse(is.numeric(line.type[[i1]]), "", "\""), + ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), + ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), + ", alpha = ", + alpha[[i1]], + ", show.legend = FALSE)" + )))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "size", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(line.size[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, breaks reorder the classes according to class.categ in the legend + } + } + } + # end loop part + + + + + # legend display + tempo.legend.final <- 'ggplot2::guides( fill = if(fin.lg.disp[[1]] == TRUE){ ggplot2::guide_legend( order = lg.order[[1]], @@ -13390,25 +13395,25 @@ FALSE } )' # clip = "off" to have secondary ticks outside plot region does not work if( ! is.null(legend.width)){ -if(any(unlist(legend.disp))){ # means some TRUE -tempo.graph.info <- suppressMessages(ggplot2::ggplot_build(eval(parse(text = paste0(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + ', tempo.legend.final))))) # will be recovered later again, when ylim will be considered -legend.final <- fun_gg_get_legend(ggplot_built = tempo.graph.info, fun.name = function.name) # get legend -fin.lg.disp[] <- FALSE # remove all the legends. Must be done even if fin.lg.disp is not appearing in the code thenafter. Otherwise twice the legend -if(is.null(legend.final) & plot == TRUE){ # even if any(unlist(legend.disp)) is TRUE -legend.final <- fun_gg_empty_graph() # empty graph instead of legend -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON-NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON-NULL legend.width ARGUMENT\n") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else if(plot == TRUE){ # means all FALSE -legend.final <- ggplot2::ggplot()+ggplot2::theme_void() # empty graph instead of legend -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON-NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON-NULL legend.width ARGUMENT\n") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} + if(any(unlist(legend.disp))){ # means some TRUE + tempo.graph.info <- suppressMessages(ggplot2::ggplot_build(eval(parse(text = paste0(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + ', tempo.legend.final))))) # will be recovered later again, when ylim will be considered + legend.final <- fun_gg_get_legend(ggplot_built = tempo.graph.info, fun.name = function.name) # get legend + fin.lg.disp[] <- FALSE # remove all the legends. Must be done even if fin.lg.disp is not appearing in the code thenafter. Otherwise twice the legend + if(is.null(legend.final) & plot == TRUE){ # even if any(unlist(legend.disp)) is TRUE + legend.final <- fun_gg_empty_graph() # empty graph instead of legend + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON-NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON-NULL legend.width ARGUMENT\n") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else if(plot == TRUE){ # means all FALSE + legend.final <- ggplot2::ggplot()+ggplot2::theme_void() # empty graph instead of legend + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON-NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON-NULL legend.width ARGUMENT\n") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } } if( ! any(unlist(legend.disp))){ -fin.lg.disp[] <- FALSE # remove all the legends. Must be done even if fin.lg.disp is not appearing in the code thenafter. Otherwise twice the legend + fin.lg.disp[] <- FALSE # remove all the legends. Must be done even if fin.lg.disp is not appearing in the code thenafter. Otherwise twice the legend } assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = tempo.legend.final))) # end legend display @@ -13421,135 +13426,135 @@ assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(t tempo.coord <- suppressMessages(ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ", ' + ggplot2::scale_x_continuous(expand = c(0, 0), limits = sort(x.lim), oob = scales::rescale_none) + ggplot2::scale_y_continuous(expand = c(0, 0), limits = sort(y.lim), oob = scales::rescale_none)'))))$layout$panel_params[[1]]) # here I do not need the x-axis and y-axis orientation, I just need the number of main ticks # x.second.tick.positions # coordinates of secondary ticks (only if x.second.tick.nb argument is non-null or if x.log argument is different from "no") if(x.log != "no"){ # integer main ticks for log2 and log10 -tempo.scale <- (as.integer(min(x.lim, na.rm = TRUE)) - 1):(as.integer(max(x.lim, na.rm = TRUE)) + 1) + tempo.scale <- (as.integer(min(x.lim, na.rm = TRUE)) - 1):(as.integer(max(x.lim, na.rm = TRUE)) + 1) }else{ -tempo <- if(is.null(attributes(tempo.coord$x$breaks))){tempo.coord$x$breaks}else{unlist(attributes(tempo.coord$x$breaks))} -if(all(is.na(tempo))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$x$breaks") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(length(unique(x.lim)) <= 1){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nIT SEEMS THAT X-AXIS VALUES HAVE A NULL RANGE: ", paste(x.lim, collapse = " "), "\nPLEASE, USE THE x.lim ARGUMENT WITH 2 DIFFERENT VALUES TO SOLVE THIS") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -tempo.scale <- fun_scale(lim = x.lim, n = ifelse(is.null(x.tick.nb), length(tempo[ ! is.na(tempo)]), x.tick.nb)) # in ggplot 3.3.0, tempo.coord$x.major_source replaced by tempo.coord$x$breaks. If fact: n = ifelse(is.null(x.tick.nb), length(tempo[ ! is.na(tempo)]), x.tick.nb)) replaced by n = ifelse(is.null(x.tick.nb), 4, x.tick.nb)) -} + tempo <- if(is.null(attributes(tempo.coord$x$breaks))){tempo.coord$x$breaks}else{unlist(attributes(tempo.coord$x$breaks))} + if(all(is.na(tempo))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$x$breaks") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(length(unique(x.lim)) <= 1){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nIT SEEMS THAT X-AXIS VALUES HAVE A NULL RANGE: ", paste(x.lim, collapse = " "), "\nPLEASE, USE THE x.lim ARGUMENT WITH 2 DIFFERENT VALUES TO SOLVE THIS") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + tempo.scale <- fun_scale(lim = x.lim, n = ifelse(is.null(x.tick.nb), length(tempo[ ! is.na(tempo)]), x.tick.nb)) # in ggplot 3.3.0, tempo.coord$x.major_source replaced by tempo.coord$x$breaks. If fact: n = ifelse(is.null(x.tick.nb), length(tempo[ ! is.na(tempo)]), x.tick.nb)) replaced by n = ifelse(is.null(x.tick.nb), 4, x.tick.nb)) + } } x.second.tick.values <- NULL x.second.tick.pos <- NULL if(x.log != "no"){ -tempo <- fun_inter_ticks(lim = x.lim, log = x.log) -x.second.tick.values <- tempo$values -x.second.tick.pos <- tempo$coordinates -# if(vertical == TRUE){ # do not remove in case the bug is fixed -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( -geom = "segment", x = x.second.tick.pos, -xend = x.second.tick.pos, -y = if(diff(y.lim) > 0){tempo.coord$y.range[1]}else{tempo.coord$y.range[2]}, -yend = if(diff(y.lim) > 0){tempo.coord$y.range[1] + abs(diff(tempo.coord$y.range)) / 80}else{tempo.coord$y.range[2] - abs(diff(tempo.coord$y.range)) / 80} -)) -# }else{ # not working because of the ggplot2 bug -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = x.second.tick.pos, yend = x.second.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) -# } -coord.names <- c(coord.names, "x.second.tick.positions") + tempo <- fun_inter_ticks(lim = x.lim, log = x.log) + x.second.tick.values <- tempo$values + x.second.tick.pos <- tempo$coordinates + # if(vertical == TRUE){ # do not remove in case the bug is fixed + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( + geom = "segment", x = x.second.tick.pos, + xend = x.second.tick.pos, + y = if(diff(y.lim) > 0){tempo.coord$y.range[1]}else{tempo.coord$y.range[2]}, + yend = if(diff(y.lim) > 0){tempo.coord$y.range[1] + abs(diff(tempo.coord$y.range)) / 80}else{tempo.coord$y.range[2] - abs(diff(tempo.coord$y.range)) / 80} + )) + # }else{ # not working because of the ggplot2 bug + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = x.second.tick.pos, yend = x.second.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) + # } + coord.names <- c(coord.names, "x.second.tick.positions") }else if(( ! is.null(x.second.tick.nb)) & x.log == "no"){ -# if(x.second.tick.nb > 0){ #inactivated because already checked before -if(length(tempo.scale) < 2){ -tempo.cat1 <- c("x.tick.nb", "x.second.tick.nb") -tempo.cat2 <- sapply(list(x.tick.nb, x.second.tick.nb), FUN = paste0, collapse = " ") -tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") -tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE X-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -tempo <- fun_inter_ticks(lim = x.lim, log = x.log, breaks = tempo.scale, n = x.second.tick.nb) -} -x.second.tick.values <- tempo$values -x.second.tick.pos <- tempo$coordinates -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( -geom = "segment", -x = x.second.tick.pos, -xend = x.second.tick.pos, -y = if(diff(y.lim) > 0){tempo.coord$y.range[1]}else{tempo.coord$y.range[2]}, -yend = if(diff(y.lim) > 0){tempo.coord$y.range[1] + abs(diff(tempo.coord$y.range)) / 80}else{tempo.coord$y.range[2] - abs(diff(tempo.coord$y.range)) / 80} -)) -coord.names <- c(coord.names, "x.second.tick.positions") + # if(x.second.tick.nb > 0){ #inactivated because already checked before + if(length(tempo.scale) < 2){ + tempo.cat1 <- c("x.tick.nb", "x.second.tick.nb") + tempo.cat2 <- sapply(list(x.tick.nb, x.second.tick.nb), FUN = paste0, collapse = " ") + tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") + tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE X-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + tempo <- fun_inter_ticks(lim = x.lim, log = x.log, breaks = tempo.scale, n = x.second.tick.nb) + } + x.second.tick.values <- tempo$values + x.second.tick.pos <- tempo$coordinates + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( + geom = "segment", + x = x.second.tick.pos, + xend = x.second.tick.pos, + y = if(diff(y.lim) > 0){tempo.coord$y.range[1]}else{tempo.coord$y.range[2]}, + yend = if(diff(y.lim) > 0){tempo.coord$y.range[1] + abs(diff(tempo.coord$y.range)) / 80}else{tempo.coord$y.range[2] - abs(diff(tempo.coord$y.range)) / 80} + )) + coord.names <- c(coord.names, "x.second.tick.positions") } # for the ggplot2 bug with x.log, this does not work: eval(parse(text = ifelse(vertical == FALSE & x.log == "log10", "ggplot2::scale_x_continuous", "ggplot2::scale_x_continuous"))) assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_x_continuous( -breaks = tempo.scale, -minor_breaks = x.second.tick.pos, -labels = if(x.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(x.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(x.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 10") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, -expand = c(0, 0), # remove space after after axis limits -limits = sort(x.lim), # NA indicate that limits must correspond to data limits but xlim() already used -oob = scales::rescale_none, -trans = ifelse(diff(x.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_x_reverse() but create the problem of x-axis label disappearance with x.lim decreasing. Thus, do not use. Use xlim() below and after this + breaks = tempo.scale, + minor_breaks = x.second.tick.pos, + labels = if(x.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(x.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(x.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 10") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, + expand = c(0, 0), # remove space after after axis limits + limits = sort(x.lim), # NA indicate that limits must correspond to data limits but xlim() already used + oob = scales::rescale_none, + trans = ifelse(diff(x.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_x_reverse() but create the problem of x-axis label disappearance with x.lim decreasing. Thus, do not use. Use xlim() below and after this )) # end x.second.tick.positions # y.second.tick.positions # coordinates of secondary ticks (only if y.second.tick.nb argument is non-null or if y.log argument is different from "no") if(y.log != "no"){ # integer main ticks for log2 and log10 -tempo.scale <- (as.integer(min(y.lim, na.rm = TRUE)) - 1):(as.integer(max(y.lim, na.rm = TRUE)) + 1) + tempo.scale <- (as.integer(min(y.lim, na.rm = TRUE)) - 1):(as.integer(max(y.lim, na.rm = TRUE)) + 1) }else{ -tempo <- if(is.null(attributes(tempo.coord$y$breaks))){tempo.coord$y$breaks}else{unlist(attributes(tempo.coord$y$breaks))} -if(all(is.na(tempo))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$y$breaks") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(length(unique(y.lim)) <= 1){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nIT SEEMS THAT Y-AXIS VALUES HAVE A NULL RANGE: ", paste(y.lim, collapse = " "), "\nPLEASE, USE THE y.lim ARGUMENT WITH 2 DIFFERENT VALUES TO SOLVE THIS") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -tempo.scale <- fun_scale(lim = y.lim, n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) # in ggplot 3.3.0, tempo.coord$y.major_source replaced by tempo.coord$y$breaks. If fact: n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) replaced by n = ifelse(is.null(y.tick.nb), 4, y.tick.nb)) -} + tempo <- if(is.null(attributes(tempo.coord$y$breaks))){tempo.coord$y$breaks}else{unlist(attributes(tempo.coord$y$breaks))} + if(all(is.na(tempo))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$y$breaks") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(length(unique(y.lim)) <= 1){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nIT SEEMS THAT Y-AXIS VALUES HAVE A NULL RANGE: ", paste(y.lim, collapse = " "), "\nPLEASE, USE THE y.lim ARGUMENT WITH 2 DIFFERENT VALUES TO SOLVE THIS") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + tempo.scale <- fun_scale(lim = y.lim, n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) # in ggplot 3.3.0, tempo.coord$y.major_source replaced by tempo.coord$y$breaks. If fact: n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) replaced by n = ifelse(is.null(y.tick.nb), 4, y.tick.nb)) + } } y.second.tick.values <- NULL y.second.tick.pos <- NULL if(y.log != "no"){ -tempo <- fun_inter_ticks(lim = y.lim, log = y.log) -y.second.tick.values <- tempo$values -y.second.tick.pos <- tempo$coordinates -# if(vertical == TRUE){ # do not remove in case the bug is fixed -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( -geom = "segment", -y = y.second.tick.pos, -yend = y.second.tick.pos, -x = if(diff(x.lim) > 0){tempo.coord$x.range[1]}else{tempo.coord$x.range[2]}, -xend = if(diff(x.lim) > 0){tempo.coord$x.range[1] + abs(diff(tempo.coord$x.range)) / 80}else{tempo.coord$x.range[2] - abs(diff(tempo.coord$x.range)) / 80} -)) -# }else{ # not working because of the ggplot2 bug -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = y.second.tick.pos, xend = y.second.tick.pos, y = tempo.coord$y.range[1], yend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) -# } -coord.names <- c(coord.names, "y.second.tick.positions") + tempo <- fun_inter_ticks(lim = y.lim, log = y.log) + y.second.tick.values <- tempo$values + y.second.tick.pos <- tempo$coordinates + # if(vertical == TRUE){ # do not remove in case the bug is fixed + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( + geom = "segment", + y = y.second.tick.pos, + yend = y.second.tick.pos, + x = if(diff(x.lim) > 0){tempo.coord$x.range[1]}else{tempo.coord$x.range[2]}, + xend = if(diff(x.lim) > 0){tempo.coord$x.range[1] + abs(diff(tempo.coord$x.range)) / 80}else{tempo.coord$x.range[2] - abs(diff(tempo.coord$x.range)) / 80} + )) + # }else{ # not working because of the ggplot2 bug + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = y.second.tick.pos, xend = y.second.tick.pos, y = tempo.coord$y.range[1], yend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) + # } + coord.names <- c(coord.names, "y.second.tick.positions") }else if(( ! is.null(y.second.tick.nb)) & y.log == "no"){ -# if(y.second.tick.nb > 0){ #inactivated because already checked before -if(length(tempo.scale) < 2){ -tempo.cat1 <- c("y.tick.nb", "y.second.tick.nb") -tempo.cat2 <- sapply(list(y.tick.nb, y.second.tick.nb), FUN = paste0, collapse = " ") -tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") -tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE Y-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -tempo <- fun_inter_ticks(lim = y.lim, log = y.log, breaks = tempo.scale, n = y.second.tick.nb) -} -y.second.tick.values <- tempo$values -y.second.tick.pos <- tempo$coordinates -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( -geom = "segment", -y = y.second.tick.pos, -yend = y.second.tick.pos, -x = if(diff(x.lim) > 0){tempo.coord$x.range[1]}else{tempo.coord$x.range[2]}, -xend = if(diff(x.lim) > 0){tempo.coord$x.range[1] + abs(diff(tempo.coord$x.range)) / 80}else{tempo.coord$x.range[2] - abs(diff(tempo.coord$x.range)) / 80} -)) -coord.names <- c(coord.names, "y.second.tick.positions") + # if(y.second.tick.nb > 0){ #inactivated because already checked before + if(length(tempo.scale) < 2){ + tempo.cat1 <- c("y.tick.nb", "y.second.tick.nb") + tempo.cat2 <- sapply(list(y.tick.nb, y.second.tick.nb), FUN = paste0, collapse = " ") + tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") + tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE Y-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + tempo <- fun_inter_ticks(lim = y.lim, log = y.log, breaks = tempo.scale, n = y.second.tick.nb) + } + y.second.tick.values <- tempo$values + y.second.tick.pos <- tempo$coordinates + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( + geom = "segment", + y = y.second.tick.pos, + yend = y.second.tick.pos, + x = if(diff(x.lim) > 0){tempo.coord$x.range[1]}else{tempo.coord$x.range[2]}, + xend = if(diff(x.lim) > 0){tempo.coord$x.range[1] + abs(diff(tempo.coord$x.range)) / 80}else{tempo.coord$x.range[2] - abs(diff(tempo.coord$x.range)) / 80} + )) + coord.names <- c(coord.names, "y.second.tick.positions") } # for the ggplot2 bug with y.log, this does not work: eval(parse(text = ifelse(vertical == FALSE & y.log == "log10", "ggplot2::scale_x_continuous", "ggplot2::scale_y_continuous"))) assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( -breaks = tempo.scale, -minor_breaks = y.second.tick.pos, -labels = if(y.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(y.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(y.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 10") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, -expand = c(0, 0), # remove space after axis limits -limits = sort(y.lim), # NA indicate that limits must correspond to data limits but ylim() already used -oob = scales::rescale_none, -trans = ifelse(diff(y.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() but create the problem of y-axis label disappearance with y.lim decreasing. Thus, do not use. Use ylim() below and after this + breaks = tempo.scale, + minor_breaks = y.second.tick.pos, + labels = if(y.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(y.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(y.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 10") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, + expand = c(0, 0), # remove space after axis limits + limits = sort(y.lim), # NA indicate that limits must correspond to data limits but ylim() already used + oob = scales::rescale_none, + trans = ifelse(diff(y.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() but create the problem of y-axis label disappearance with y.lim decreasing. Thus, do not use. Use ylim() below and after this )) # end y.second.tick.positions assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(xlim = x.lim, ylim = y.lim)) # clip = "off" to have secondary ticks outside plot region. The problem is that points out of bounds are also drawn outside the plot region. Thus, I cannot use it # at that stage, x.lim and y.lim not NULL anymore @@ -13562,15 +13567,15 @@ assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coo fin.plot <- eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))) grob.save <- NULL if(plot == TRUE){ -if( ! is.null(legend.width)){ # any(unlist(legend.disp)) == TRUE removed to have empty legend space # not & any(unlist(fin.lg.disp)) == TRUE here because converted to FALSE -grob.save <- suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot, legend.final, ncol=2, widths=c(1, legend.width)))) -}else{ -grob.save <- suppressMessages(suppressWarnings(print(fin.plot))) -} + if( ! is.null(legend.width)){ # any(unlist(legend.disp)) == TRUE removed to have empty legend space # not & any(unlist(fin.lg.disp)) == TRUE here because converted to FALSE + grob.save <- suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot, legend.final, ncol=2, widths=c(1, legend.width)))) + }else{ + grob.save <- suppressMessages(suppressWarnings(print(fin.plot))) + } }else{ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") PLOT NOT SHOWN AS REQUESTED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") PLOT NOT SHOWN AS REQUESTED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) } # end drawing @@ -13578,49 +13583,49 @@ warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn # output if(warn.print == TRUE & ! is.null(warn)){ -on.exit(warning(paste0("FROM ", function.name, ":\n\n", warn), call. = FALSE)) + on.exit(warning(paste0("FROM ", function.name, ":\n\n", warn), call. = FALSE)) } on.exit(exp = options(warning.length = ini.warning.length), add = TRUE) if(return == TRUE){ -output <- suppressMessages(ggplot2::ggplot_build(fin.plot)) -# output$data <- output$data[-1] # yes for boxplot but not for scatter # remove the first data because corresponds to the initial empty boxplot -if(length(output$data) != length(coord.names)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, ": length(output$data) AND length(coord.names) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -names(output$data) <- coord.names -} -if(is.null(unlist(removed.row.nb))){ -removed.row.nb <- NULL -removed.rows <- NULL -}else{ -for(i3 in 1:length(data1)){ -if( ! is.null(removed.row.nb[[i3]])){ -removed.row.nb[[i3]] <- sort(removed.row.nb[[i3]]) -removed.rows[[i3]] <- data1.ini[[i3]][removed.row.nb[[i3]], ] -} -} -} -tempo <- output$layout$panel_params[[1]] -output <- list( -data = data1, -removed.row.nb = removed.row.nb, -removed.rows = removed.rows, -plot = c(output$data, x.second.tick.values = list(x.second.tick.values), y.second.tick.values = list(y.second.tick.values)), -panel = facet.categ, -axes = list( -x.range = tempo$x.range, -x.labels = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{tempo$x$scale$get_labels()}, # is.null(attributes(tempo$x$breaks)) test if it is number (TRUE) or character (FALSE) -x.positions = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{unlist(attributes(tempo$x$breaks))}, -y.range = tempo$y.range, -y.labels = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{tempo$y$scale$get_labels()}, -y.positions = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{unlist(attributes(tempo$y$breaks))} -), -warn = paste0("\n", warn, "\n\n"), -ggplot = if(return.ggplot == TRUE){fin.plot}else{NULL}, # fin.plot plots the graph if return == TRUE -gtable = if(return.gtable == TRUE){grob.save}else{NULL} # -) -return(output) # this plots the graph if return.ggplot is TRUE and if no assignment + output <- suppressMessages(ggplot2::ggplot_build(fin.plot)) + # output$data <- output$data[-1] # yes for boxplot but not for scatter # remove the first data because corresponds to the initial empty boxplot + if(length(output$data) != length(coord.names)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, ": length(output$data) AND length(coord.names) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + names(output$data) <- coord.names + } + if(is.null(unlist(removed.row.nb))){ + removed.row.nb <- NULL + removed.rows <- NULL + }else{ + for(i3 in 1:length(data1)){ + if( ! is.null(removed.row.nb[[i3]])){ + removed.row.nb[[i3]] <- sort(removed.row.nb[[i3]]) + removed.rows[[i3]] <- data1.ini[[i3]][removed.row.nb[[i3]], ] + } + } + } + tempo <- output$layout$panel_params[[1]] + output <- list( + data = data1, + removed.row.nb = removed.row.nb, + removed.rows = removed.rows, + plot = c(output$data, x.second.tick.values = list(x.second.tick.values), y.second.tick.values = list(y.second.tick.values)), + panel = facet.categ, + axes = list( + x.range = tempo$x.range, + x.labels = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{tempo$x$scale$get_labels()}, # is.null(attributes(tempo$x$breaks)) test if it is number (TRUE) or character (FALSE) + x.positions = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{unlist(attributes(tempo$x$breaks))}, + y.range = tempo$y.range, + y.labels = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{tempo$y$scale$get_labels()}, + y.positions = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{unlist(attributes(tempo$y$breaks))} + ), + warn = paste0("\n", warn, "\n\n"), + ggplot = if(return.ggplot == TRUE){fin.plot}else{NULL}, # fin.plot plots the graph if return == TRUE + gtable = if(return.gtable == TRUE){grob.save}else{NULL} # + ) + return(output) # this plots the graph if return.ggplot is TRUE and if no assignment } # end output # end main code diff --git a/cute_little_R_functions.docx b/cute_little_R_functions.docx index d2fc4eb45df5d8c614ef67ac53bb4240c670f541..fb20dd5f9d11b6696c4aaaf72e18d0fc672e3997 100644 GIT binary patch delta 362942 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 P%HyF3#v~jR`22qX5+3?v delta 362853 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]C&%_kO=iUi#vVuBk#SByMZ{QM5MQT=AB{V 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ࠫgBN})EQZ=Vo?nY1B&qKNE?C@3Qt)8=|xeF*Wp6^ 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 a54I1s64w9kfRQ2ixL7!nwloY5mj5r6A9i*C -- GitLab