From a8f84838e9f0ebb59a461d900d2fdc4ef58bf58b Mon Sep 17 00:00:00 2001 From: gmillot <gael.millot@pasteur.fr> Date: Mon, 26 Aug 2019 13:28:22 +0200 Subject: [PATCH] tempo v6 --- README.md | 119 +- cute_little_R_functions.R | 8566 +++++++++++++++++++++++----------- cute_little_R_functions.docx | Bin 238619 -> 548896 bytes examples_alone.txt | 230 +- 4 files changed, 6183 insertions(+), 2732 deletions(-) diff --git a/README.md b/README.md index d1db53a..e3efd0f 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,72 @@ #### DESCRIPTION -Cute Little R Functions contains 21 functions for R/RStudio that facilitate basic procedures in 1) object analysis, 2) object modification, 3) graphic handling and 4) log file management. +Cute Little R Functions contains 32 functions for R/RStudio that facilitate basic procedures in 1) object analysis, 2) object modification, 3) graphic handling and 4) log file management. The function names are: -fun_param_check() Check the class, type, mode and length, prop, neg values, na.contains, etc., of an object -fun_object_info() provide a full description of the object -fun_1D_comp() compare two 1D datasets (vector of factor or 1D table) of the same class or not -fun_2D_comp() compare two 2D datasets of the same class or not -fun_2D_head() display the left/right head of 2D objects -fun_2D_tail() display the left/right tail of 2D objects -fun_list_comp() compare two lists -fun_dataframe_remodeling() remodel data frames -fun_refactorization() refactorize a factor or the factor columns of a data frame, such as only the class present are in the levels (no empty levels). The class order in levels is kept -fun_rounding() round a vector of values, if decimal, with the desired number of decimal digits after the decimal leading zeros -fun_90clock_matrix_rot() 90° clockwise matrix rotation -fun_hexa_hsv_color_matrix() convert a matrix made of numbers into a hexadecimal matrix for rgb colorization -fun_by_case_matrix_op() assemble several matrices of same dimensions by performing by case operation -fun_mat_inv() return the inverse of a square matrix when solve() cannot -fun_window_width_resizing() rescale the width of a window to open depending on the number of classes to plot -fun_open_window() open a pdf or screen (GUI) graphic window -fun_graph_param_prior_plot() very convenient to erase the axes for post plot axis redrawing using fun_feature_post_plot() -fun_feature_post_plot() redesign axis and provide convenients coordinates for adding elements on the drawn graph -fun_close_specif_window() close only specific graphic windows (devices) -fun_var_trim_display() trim and display values from a numeric vector or matrix -fun_export_data() log file function: print a character string or a data object into a same output file +## Object analysis + +fun_param_check() #### Checking class, type, length, etc. of objects +fun_object_info() #### Recovering object information +fun_1D_comp() #### comparison of two 1D datasets (vectors, factors, 1D tables) +fun_2D_comp() #### comparison of two 2D datasets (row & col names, dimensions, etc.) +fun_2D_head() #### head of the left or right of big 2D objects +fun_2D_tail() #### tail of the left or right of big 2D objects +fun_list_comp() #### comparison of two lists + + +## Object modification + +fun_dataframe_remodeling() #### remodeling a data frame to have column name as a qualitative column and vice-versa +fun_refactorization() #### remove classes that are not anymore present in factors or factor columns in data frames +fun_round() #### Rounding number if decimal present +fun_90clock_matrix_rot() #### 90° clockwise matrix rotation +fun_num2color_mat() #### Conversion of a numeric matrix into hexadecimal color matrix +fun_by_case_matrix_op() #### assembling of several matrices with operation +fun_mat_inv() #### return the inverse of a square matrix +fun_mat_fill() #### fill the empty half part of a symmetric square matrix +fun_consec_pos_perm() #### progressively breaks a vector order + + +## Graphics management + +fun_window_width_resizing() #### window width depending on classes to plot +fun_open_window() #### Open a GUI or pdf graphic window +fun_prior_plot() #### Graph param before plotting +fun_post_plot() #### Graph param after plotting +fun_close_specif_window() #### Closing specific graphic windows + + +## Standard graphics + +fun_empty_graph() #### text to display for empty graphs + + +## gg graphics + +fun_gg_palette() #### ggplot2 default color palette +fun_gg_scatter() #### ggplot2 scatterplot + lines (up to 6 overlays totally) +fun_gg_bar_mean() #### ggplot2 mean barplot + overlaid dots if required +fun_gg_heatmap() #### ggplot2 heatmap + overlaid mask if required +fun_gg_empty_graph() #### text to display for empty graphs + + +## Graphic extraction + +fun_var_trim_display() #### Display values from a quantitative variable and trim according to defined cut-offs +fun_segmentation() #### Segment a dot cloud on a scatterplot and define the dots from another cloud outside the segmentation + + +## Import + +fun_pack_import() #### Check if R packages are present and import into the working environment +fun_python_pack_import() #### Check if python packages are present + + +## Exporting results (text & tables) + +fun_export_data() #### Print string or data object into output file + #### LICENCE @@ -56,7 +98,7 @@ Description of the functions is at the beginning of the function body. To obtain cute_little_R_functions.R file that has to be sourced cute_little_R_functions.docx just for easier code reading -examples_alone.txt compile all the examples of each of the 17 functions into a single file +examples_alone.txt compile all the examples of the functions into a single file #### WEB LOCATION @@ -66,6 +108,35 @@ Check for updated versions (most recent tags) at https://gitlab.pasteur.fr/gmill #### WHAT'S NEW IN + +## v6.0.0 + +1) name of functions changed: +fun_rounding() fun_round() +fun_hexa_hsv_color_matrix() fun_num2color_mat() +fun_graph_param_prior_plot() fun_prior_plot() +fun_feature_post_plot() fun_post_plot() + +2) new functions added: +fun_mat_fill() +fun_consec_pos_perm() +fun_empty_graph() +fun_gg_palette() +fun_gg_scatter() +fun_gg_bar_mean() +fun_gg_heatmap() +fun_gg_empty_graph() +fun_segmentation() +fun_pack_import() +fun_python_pack_import() + +3) text error modified in fun_2D_head() and fun_2D_tail() + +4) in fun_param_check(): (1) has now the class = "vector", (2) argument fun.name added + +5) writiing and debugging message errors improved in all the functions + + ## v5.1.0 1) bugs corrected in fun_2D_head() and fun_2D_tail() functions @@ -168,6 +239,6 @@ Check for updated versions (most recent tags) at https://gitlab.pasteur.fr/gmill ## v1.3 -1) fun_1D_comp() function improved: provide the common elements, common names and common levels if exist. +1) fun_1D_comp() function improved: provide the common elements, common names and common levels if exist diff --git a/cute_little_R_functions.R b/cute_little_R_functions.R index 3087f97..27ff1a3 100644 --- a/cute_little_R_functions.R +++ b/cute_little_R_functions.R @@ -1,6 +1,6 @@ ################################################################ ## ## -## CUTE LITTLE R FUNCTIONS v5.1.0 ## +## CUTE LITTLE R FUNCTIONS v6.0.0 ## ## ## ## Gael A. Millot ## ## ## @@ -10,35 +10,57 @@ +# BEWARE: do not forget to save the modifications in the .R file (through RSTUDIO for indentation) + ################################ OUTLINE ################################ -################ Object analysis 1 -######## fun_param_check() #### Checking class, type, length, etc. of objects 1 -######## fun_object_info() #### Recovering object information 7 -######## fun_1D_comp() #### comparison of two 1D datasets (vectors, factors, 1D tables) 8 -######## fun_2D_comp() #### comparison of two 2D datasets (row & col names, dimensions, etc.) 12 -######## fun_2D_head() #### head of the left or right of big 2D objects 19 -######## fun_2D_tail() #### tail of the left or right of big 2D objects 20 -######## fun_list_comp() #### comparison of two lists 21 -################ Object modification 23 -######## fun_dataframe_remodeling() #### remodeling a data frame to have column name as a qualitative column and vice-versa 23 -######## fun_refactorization() #### remove classes that are not anymore present in factors or factor columns in data frames 26 -######## fun_rounding() #### Rounding number if decimal present 27 -######## fun_90clock_matrix_rot() #### 90° clockwise matrix rotation 29 -######## fun_hexa_hsv_color_matrix() #### Conversion of a numeric matrix into hexadecimal color matrix 30 -######## fun_by_case_matrix_op() #### assembling of several matrices with operation 32 -######## fun_mat_inv() #### return the inverse of a square matrix 35 -################ Graphics 36 -######## fun_window_width_resizing() #### window width depending on classes to plot 36 -######## fun_open_window() #### Open a GUI or pdf graphic window 37 -######## fun_graph_param_prior_plot() #### Graph param before plotting 41 -######## fun_feature_post_plot() #### Graph param after plotting 45 -######## fun_close_specif_window() #### Closing specific graphic windows 55 -######## fun_var_trim_display() #### Display values from a quantitative variable and trim according to defined cut-offs 57 -################ Exporting results (text & tables) 65 -######## fun_export_data() #### Print string or data object into output file 65 +################ Object analysis 2 +######## fun_param_check() #### Checking class, type, length, etc. of objects 2 +######## fun_object_info() #### Recovering object information 8 +######## fun_1D_comp() #### comparison of two 1D datasets (vectors, factors, 1D tables) 9 +######## fun_2D_comp() #### comparison of two 2D datasets (row & col names, dimensions, etc.) 13 +######## fun_2D_head() #### head of the left or right of big 2D objects 19 +######## fun_2D_tail() #### tail of the left or right of big 2D objects 21 +######## fun_list_comp() #### comparison of two lists 22 +################ Object modification 24 +######## fun_dataframe_remodeling() #### remodeling a data frame to have column name as a qualitative column and vice-versa 24 +######## fun_refactorization() #### remove classes that are not anymore present in factors or factor columns in data frames 27 +######## fun_round() #### Rounding number if decimal present 29 +######## fun_90clock_matrix_rot() #### 90° clockwise matrix rotation 31 +######## fun_num2color_mat() #### Conversion of a numeric matrix into hexadecimal color matrix 32 +######## fun_by_case_matrix_op() #### assembling of several matrices with operation 35 +######## fun_mat_inv() #### return the inverse of a square matrix 37 +######## fun_mat_fill() #### fill the empty half part of a symmetric square matrix 38 +######## fun_consec_pos_perm() #### progressively breaks a vector order 41 +################ Graphics management 46 +######## fun_window_width_resizing() #### window width depending on classes to plot 46 +######## fun_open_window() #### Open a GUI or pdf graphic window 47 +######## fun_prior_plot() #### Graph param before plotting 51 +######## fun_post_plot() #### Graph param after plotting 55 +######## fun_close_specif_window() #### Closing specific graphic windows 66 +################ Standard graphics 67 +######## fun_empty_graph() #### text to display for empty graphs 67 +################ gg graphics 69 +######## fun_gg_palette() #### ggplot2 default color palette 69 +######## fun_gg_scatter() #### ggplot2 scatterplot + lines (up to 6 overlays totally) 70 +######## fun_gg_bar_mean() #### ggplot2 mean barplot + overlaid dots if required 89 +######## fun_gg_boxplot() #### ggplot2 boxplot + background dots if required 110 +######## fun_gg_bar_prop() #### ggplot2 proportion barplot 130 +######## fun_gg_strip() #### ggplot2 stripchart + mean/median 130 +######## fun_gg_violin() #### ggplot2 violins 130 +######## fun_gg_line() #### ggplot2 lines + background dots and error bars 130 +######## fun_gg_heatmap() #### ggplot2 heatmap + overlaid mask if required 130 +######## fun_gg_empty_graph() #### text to display for empty graphs 135 +################ Graphic extraction 136 +######## fun_var_trim_display() #### Display values from a quantitative variable and trim according to defined cut-offs 137 +######## fun_segmentation() #### Segment a dot cloud on a scatterplot and define the dots from another cloud outside the segmentation 145 +################ Import 160 +######## fun_pack_import() #### Check if R packages are present and import into the working environment 160 +######## fun_python_pack_import() #### Check if python packages are present 162 +################ Exporting results (text & tables) 163 +######## fun_export_data() #### Print string or data object into output file 163 ################################ FUNCTIONS ################################ @@ -51,235 +73,248 @@ # Check OK: clear to go Apollo -fun_param_check <- function(data, data.name = NULL, class = NULL, typeof = NULL, mode = NULL, length = NULL, prop = NULL, double.as.integer.allowed = FALSE, options = NULL, all.options.in.data = FALSE, na.contain = FALSE, neg.values = TRUE, print = TRUE){ - # AIM: - # check the class, type, mode and length of the data argument - # mainly used to check the arguments of other functions - # check also other kind of data parameters, is it a proportion? Is it type double even if it is an integer? - # if options = NULL, then at least class, type, mode or length must be non null - # if options is non null, then class, type and mode must be NULL, and length can be NULL or specified - # REQUIRED FUNCTIONS - # none - # ARGUMENTS - # data: object to test - # data.name: name of the object to test. If NULL, use the name of the object assigned to the data argument - # class: one of the class() result - # typeof: one of the typeof() result - # mode: one of the mode() result (for non vector object) - # length: length of the object - # prop: logical, are the numeric values between 0 and 1 (proportion)? - # double.as.integer.allowed: logical. If TRUE, no error is reported if argument is set to typeof = "integer" or class = "integer", while the reality is typeof = "double" or class = "numeric" but the numbers have a zero as modulo (remainder of a division). This means that i<-1 , which is typeof(i) -> "double" is considered as integer with double.as.integer.allowed = TRUE - # options: a vector of possible values for data - # all.options.in.data: If TRUE, all of the options must be present at least once in data, and nothing else. If FALSE, some of the options must be present in data, and nothing else - # na.contain: can data contains NA? - # neg.values: are negative numeric values authorized? BEWARE: only considered if set to FALSE, to check for non negative values when class is set to "numeric", "matrix", "array", "data.frame", "table", or typeof is set to "double", "integer", or mode is set to "numeric" - # print: print the error message if $problem is TRUE? - # RETURN - # a list containing: - # $problem: logical. Is there any problem detected ? - # $text: the problem detected - # $param.name: name of the checked parameter - # EXAMPLES - # test <- 1:3 ; fun_param_check(data = test, data.name = NULL, print = TRUE, options = NULL, all.options.in.data = FALSE, class = NULL, typeof = NULL, mode = NULL, prop = TRUE, double.as.integer.allowed = FALSE, length = NULL) - # test <- 1:3 ; fun_param_check(data = test, print = TRUE, class = "numeric", typeof = NULL, double.as.integer.allowed = FALSE) - # DEBUGGING - # data = 1:3 ; data.name = NULL ; print = TRUE; options = NULL ; all.options.in.data = FALSE ; class = "numeric" ; typeof = NULL ; mode = NULL ; prop = NULL ; double.as.integer.allowed = TRUE ; length = NULL # for function debugging - # argument checking - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) - if( ! is.null(data.name)){ - if( ! (length(data.name) == 1 & class(data.name) == "character")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): data.name ARGUMENT MUST BE A SINGLE CHARACTER ELEMENT AND NOT ", paste(data.name, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - } - if(is.null(options) & is.null(class) & is.null(typeof) & is.null(mode) & is.null(prop) & is.null(length)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): AT LEAST ONE OF THE options, class, typeof, mode, prop, OR length ARGUMENT MUST BE SPECIFIED\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(options) & ( ! is.null(class) | ! is.null(typeof) | ! is.null(mode) | ! is.null(prop))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE class, typeof, mode AND prop ARGUMENTS MUST BE NULL IF THE option ARGUMENT IS SPECIFIED\nTHE option ARGUMENT MUST BE NULL IF THE class AND/OR typeof AND/OR mode AND/OR prop ARGUMENT IS SPECIFIED\n\n================\n\n") - stop(tempo.cat) - } - if( ! (all(class(neg.values) == "logical") & length(neg.values) == 1 & any(is.na(neg.values)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE neg.values ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") - stop(tempo.cat) - } - if(neg.values == FALSE & is.null(class) & is.null(typeof) & is.null(mode)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE neg.values ARGUMENT CANNOT BE SWITCHED TO FALSE IF class, typeof AND mode ARGUMENTS ARE NULL\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(class)){ - if( ! all(class %in% c("logical", "integer", "numeric", "complex", "character", "matrix", "array", "data.frame", "list", "factor", "table", "expression", "name", "symbol", "function") & any(is.na(class)) != TRUE)){ # not length == 1 here because ordered factors are class "factor" "ordered" (length == 2) - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): class ARGUMENT MUST BE ONE OF THESE VALUE:\n\"logical\", \"integer\", \"numeric\", \"complex\", \"character\", \"matrix\", \"array\", \"data.frame\", \"list\", \"factor\", \"table\", \"expression\", \"name\", \"symbol\", \"function\" \n\n================\n\n") - stop(tempo.cat) - } - if(neg.values == FALSE & ! any(class %in% c("numeric", "integer", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): class ARGUMENT CANNOT BE OTHER THAN \"numeric\", \"integer\", \"table\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(typeof)){ - if( ! (all(typeof %in% c("logical", "integer", "double", "complex", "character", "list", "expression", "name", "symbol", "closure", "special", "builtin")) & length(typeof) == 1 & any(is.na(typeof)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): typeof ARGUMENT MUST BE ONE OF THESE VALUE:\n\"logical\", \"integer\", \"double\", \"complex\", \"character\", \"list\", \"expression\", \"name\", \"symbol\", \"closure\", \"special\", \"builtin\" \n\n================\n\n") - stop(tempo.cat) - } - if(neg.values == FALSE & ! typeof %in% c("double", "integer")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): typeof ARGUMENT CANNOT BE OTHER THAN \"double\" OR \"integer\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(mode)){ - if( ! (all(mode %in% c("logical", "numeric", "complex", "character", "list", "expression", "name", "symbol", "function")) & length(mode) == 1 & any(is.na(mode)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): mode ARGUMENT MUST BE ONE OF THESE VALUE:\n\"logical\", \"numeric\", \"complex\", \"character\", \"list\", \"expression\", \"name\", \"symbol\", \"function\"\n\n================\n\n") - stop(tempo.cat) - } - if(neg.values == FALSE & mode != "numeric"){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): mode ARGUMENT CANNOT BE OTHER THAN \"numeric\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(length)){ - if( ! (is.numeric(length) & length(length) == 1 & ! grepl(length, pattern = "\\.") & any(is.na(length)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): length ARGUMENT MUST BE A SINGLE INTEGER VALUE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(prop)){ - if( ! (is.logical(prop) | length(prop) == 1 & any(is.na(prop)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): prop ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") - stop(tempo.cat) - }else if(prop == TRUE){ - if( ! is.null(class)){ - if( ! any(class %in% c("numeric", "matrix", "array", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): class ARGUMENT CANNOT BE OTHER THAN \"numeric\", \"matrix\", \"array\", \"data.frame\", \"table\" IF prop ARGUMENT IS TRUE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(mode)){ - if(mode != "numeric"){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): mode ARGUMENT CANNOT BE OTHER THAN \"numeric\" IF prop ARGUMENT IS TRUE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(typeof)){ - if(typeof != "double"){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): typeof ARGUMENT CANNOT BE OTHER THAN \"double\" IF prop ARGUMENT IS TRUE\n\n================\n\n") - stop(tempo.cat) - } - } - } - } - if( ! (all(class(double.as.integer.allowed) == "logical") & length(double.as.integer.allowed) == 1 & any(is.na(double.as.integer.allowed)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE double.as.integer.allowed ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") - stop(tempo.cat) - } - if( ! (is.logical(all.options.in.data) & length(all.options.in.data) == 1 & any(is.na(all.options.in.data)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): all.options.in.data ARGUMENT MUST BE A SINGLE LOGICAL VALUE (TRUE OR FALSE ONLY)\n\n================\n\n") - stop(tempo.cat) - } - if( ! (all(class(na.contain) == "logical") & length(na.contain) == 1 & any(is.na(na.contain)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE na.contain ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") - stop(tempo.cat) - } - if( ! (all(class(print) == "logical") & length(print) == 1 & any(is.na(print)) != TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE print ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking - if(is.null(data.name)){ - data.name <- deparse(substitute(data)) - } - problem <- FALSE - text <- paste0("NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER") - if( ! is.null(options)){ - text <- "" - if( ! all(data %in% options)){ - problem <- TRUE - text <- paste0("PROBLEM: THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", paste(unique(data[ ! (data %in% options)]), collapse = " ")) - } - if(all.options.in.data == TRUE){ - if( ! all(options %in% data)){ - problem <- TRUE - if(text == ""){ - text <- paste0("PROBLEM: THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", unique(data[ ! (data %in% options)])) - }else{ - text <- paste0(text, "\nPROBLEM: THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", unique(data[ ! (data %in% options)])) - } - } - } - if( ! is.null(length)){ - if(length(data) != length){ - problem <- TRUE - if(text == ""){ - text <- paste0("PROBLEM: THE LENGTH OF ", data.name, " MUST BE ", length, " AND NOT ", length(data)) - }else{ - text <- paste0(text, "\nPROBLEM: THE LENGTH OF ", data.name, " MUST BE ", length, " AND NOT ", length(data)) - } - } - } - if(text == ""){ - text <- paste0("NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER") - } - } - arg.names <- c("class", "typeof", "mode", "length") - if(is.null(options)){ - for(i2 in 1:length(arg.names)){ - if( ! is.null(get(arg.names[i2]))){ - # script to execute - tempo.script <- ' +fun_param_check <- function(data, data.name = NULL, class = NULL, typeof = NULL, mode = NULL, length = NULL, prop = NULL, double.as.integer.allowed = FALSE, options = NULL, all.options.in.data = FALSE, na.contain = FALSE, neg.values = TRUE, print = TRUE, fun.name = NULL){ +# AIM +# check the class, type, mode and length of the data argument +# mainly used to check the arguments of other functions +# check also other kind of data parameters, is it a proportion? Is it type double but numbers without decimal part? +# if options = NULL, then at least class, type, mode or length must be non null +# if options is non null, then class, type and mode must be NULL, and length can be NULL or specified +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# none +# ARGUMENTS +# data: object to test +# data.name: name of the object to test. If NULL, use the name of the object assigned to the data argument +# class: one of the class() result or "vector" +# typeof: one of the typeof() result +# mode: one of the mode() result (for non vector object) +# length: length of the object +# prop: logical, are the numeric values between 0 and 1 (proportion)? +# double.as.integer.allowed: logical. If TRUE, no error is reported if argument is set to typeof = "integer" or class = "integer", while the reality is typeof = "double" or class = "numeric" but the numbers have a zero as modulo (remainder of a division). This means that i<-1 , which is typeof(i) -> "double" is considered as integer with double.as.integer.allowed = TRUE +# options: a vector of possible values for data +# all.options.in.data: If TRUE, all of the options must be present at least once in data, and nothing else. If FALSE, some of the options must be present in data, and nothing else +# na.contain: can data contains NA? +# neg.values: are negative numeric values authorized? BEWARE: only considered if set to FALSE, to check for non negative values when class is set to "numeric", "matrix", "array", "data.frame", "table", or typeof is set to "double", "integer", or mode is set to "numeric" +# print: print the error message if $problem is TRUE? +# fun.name: name of the function when fun_param_check() is used to check its argument. If non NULL, name will be added into the error message returned by fun_param_check() +# RETURN +# a list containing: +# $problem: logical. Is there any problem detected ? +# $text: the problem detected +# $param.name: name of the checked parameter +# EXAMPLES +# test <- 1:3 ; fun_param_check(data = test, data.name = NULL, print = TRUE, options = NULL, all.options.in.data = FALSE, class = NULL, typeof = NULL, mode = NULL, prop = TRUE, double.as.integer.allowed = FALSE, length = NULL) +# test <- 1:3 ; fun_param_check(data = test, print = TRUE, class = "numeric", typeof = NULL, double.as.integer.allowed = FALSE) +# test <- 1:3 ; fun_param_check(data = test, print = TRUE, class = "vector", mode = "numeric") +# test <- matrix(1:3) ; fun_param_check(data = test, print = TRUE, class = "vector", mode = "numeric") +# DEBUGGING +# data = 1:3 ; data.name = NULL ; print = TRUE; options = NULL ; all.options.in.data = FALSE ; class = "numeric" ; typeof = NULL ; mode = NULL ; prop = NULL ; double.as.integer.allowed = TRUE ; length = NULL # for function debugging +# argument checking +if( ! is.null(data.name)){ +if( ! (length(data.name) == 1 & class(data.name) == "character")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): data.name ARGUMENT MUST BE A SINGLE CHARACTER ELEMENT AND NOT ", paste(data.name, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +} +if(is.null(options) & is.null(class) & is.null(typeof) & is.null(mode) & is.null(prop) & is.null(length)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): AT LEAST ONE OF THE options, class, typeof, mode, prop, OR length ARGUMENT MUST BE SPECIFIED\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(options) & ( ! is.null(class) | ! is.null(typeof) | ! is.null(mode) | ! is.null(prop))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE class, typeof, mode AND prop ARGUMENTS MUST BE NULL IF THE option ARGUMENT IS SPECIFIED\nTHE option ARGUMENT MUST BE NULL IF THE class AND/OR typeof AND/OR mode AND/OR prop ARGUMENT IS SPECIFIED\n\n================\n\n") +stop(tempo.cat) +} +if( ! (all(class(neg.values) == "logical") & length(neg.values) == 1 & any(is.na(neg.values)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE neg.values ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") +stop(tempo.cat) +} +if(neg.values == FALSE & is.null(class) & is.null(typeof) & is.null(mode)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE neg.values ARGUMENT CANNOT BE SWITCHED TO FALSE IF class, typeof AND mode ARGUMENTS ARE NULL\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(class)){ +if( ! all(class %in% c("vector", "logical", "integer", "numeric", "complex", "character", "matrix", "array", "data.frame", "list", "factor", "table", "expression", "name", "symbol", "function") & any(is.na(class)) != TRUE)){ # not length == 1 here because ordered factors are class "factor" "ordered" (length == 2) +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): class ARGUMENT MUST BE ONE OF THESE VALUE:\n\"vector\", \"logical\", \"integer\", \"numeric\", \"complex\", \"character\", \"matrix\", \"array\", \"data.frame\", \"list\", \"factor\", \"table\", \"expression\", \"name\", \"symbol\", \"function\" \n\n================\n\n") +stop(tempo.cat) +} +if(neg.values == FALSE & ! any(class %in% c("vector", "numeric", "integer", "matrix", "array", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): class ARGUMENT CANNOT BE OTHER THAN \"vector\", \"numeric\", \"integer\", \"matrix\", \"array\", \"data.frame\", \"table\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(typeof)){ +if( ! (all(typeof %in% c("logical", "integer", "double", "complex", "character", "list", "expression", "name", "symbol", "closure", "special", "builtin")) & length(typeof) == 1 & any(is.na(typeof)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): typeof ARGUMENT MUST BE ONE OF THESE VALUE:\n\"logical\", \"integer\", \"double\", \"complex\", \"character\", \"list\", \"expression\", \"name\", \"symbol\", \"closure\", \"special\", \"builtin\" \n\n================\n\n") +stop(tempo.cat) +} +if(neg.values == FALSE & ! typeof %in% c("double", "integer")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): typeof ARGUMENT CANNOT BE OTHER THAN \"double\" OR \"integer\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(mode)){ +if( ! (all(mode %in% c("logical", "numeric", "complex", "character", "list", "expression", "name", "symbol", "function")) & length(mode) == 1 & any(is.na(mode)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): mode ARGUMENT MUST BE ONE OF THESE VALUE:\n\"logical\", \"numeric\", \"complex\", \"character\", \"list\", \"expression\", \"name\", \"symbol\", \"function\"\n\n================\n\n") +stop(tempo.cat) +} +if(neg.values == FALSE & mode != "numeric"){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): mode ARGUMENT CANNOT BE OTHER THAN \"numeric\" IF neg.values ARGUMENT IS SWITCHED TO FALSE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(length)){ +if( ! (is.numeric(length) & length(length) == 1 & ! grepl(length, pattern = "\\.") & any(is.na(length)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): length ARGUMENT MUST BE A SINGLE INTEGER VALUE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(prop)){ +if( ! (is.logical(prop) | length(prop) == 1 & any(is.na(prop)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): prop ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") +stop(tempo.cat) +}else if(prop == TRUE){ +if( ! is.null(class)){ +if( ! any(class %in% c("vector", "numeric", "integer", "matrix", "array", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): class ARGUMENT CANNOT BE OTHER THAN \"vector\", \"numeric\", \"integer\", \"matrix\", \"array\", \"data.frame\", \"table\" IF prop ARGUMENT IS TRUE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(mode)){ +if(mode != "numeric"){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): mode ARGUMENT CANNOT BE OTHER THAN \"numeric\" IF prop ARGUMENT IS TRUE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(typeof)){ +if(typeof != "double"){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): typeof ARGUMENT CANNOT BE OTHER THAN \"double\" IF prop ARGUMENT IS TRUE\n\n================\n\n") +stop(tempo.cat) +} +} +} +} +if( ! (all(class(double.as.integer.allowed) == "logical") & length(double.as.integer.allowed) == 1 & any(is.na(double.as.integer.allowed)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE double.as.integer.allowed ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") +stop(tempo.cat) +} +if( ! (is.logical(all.options.in.data) & length(all.options.in.data) == 1 & any(is.na(all.options.in.data)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): all.options.in.data ARGUMENT MUST BE A SINGLE LOGICAL VALUE (TRUE OR FALSE ONLY)\n\n================\n\n") +stop(tempo.cat) +} +if( ! (all(class(na.contain) == "logical") & length(na.contain) == 1 & any(is.na(na.contain)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE na.contain ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") +stop(tempo.cat) +} +if( ! (all(class(print) == "logical") & length(print) == 1 & any(is.na(print)) != TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE print ARGUMENT MUST BE TRUE OR FALSE ONLY\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(fun.name)){ +if( ! (class(fun.name) == "character" & length(fun.name) == 1)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN fun_param_check(): THE fun.name ARGUMENT MUST BE A CHARACTER VECTOR OF LENGTH 1\n\n================\n\n") +stop(tempo.cat) +} +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status +# end argument checking +# main code +if(is.null(data.name)){ +data.name <- deparse(substitute(data)) +} +problem <- FALSE +text <- paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER") +if( ! is.null(options)){ +text <- "" +if( ! all(data %in% options)){ +problem <- TRUE +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", paste(unique(data[ ! (data %in% options)]), collapse = " ")) +} +if(all.options.in.data == TRUE){ +if( ! all(options %in% data)){ +problem <- TRUE +if(text == ""){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", unique(data[ ! (data %in% options)])) +}else{ +text <- paste0(text, "\n", ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE SOME OF THESE OPTIONS: ", paste(options, collapse = " "), "\nTHE PROBLEMATIC ELEMENTS OF ", data.name, " ARE: ", unique(data[ ! (data %in% options)])) +} +} +} +if( ! is.null(length)){ +if(length(data) != length){ +problem <- TRUE +if(text == ""){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE LENGTH OF ", data.name, " MUST BE ", length, " AND NOT ", length(data)) +}else{ +text <- paste0(text, "\n", ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE LENGTH OF ", data.name, " MUST BE ", length, " AND NOT ", length(data)) +} +} +} +if(text == ""){ +text <- paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER") +} +} +arg.names <- c("class", "typeof", "mode", "length") +if(is.null(options)){ +for(i2 in 1:length(arg.names)){ +if( ! is.null(get(arg.names[i2]))){ +# script to execute +tempo.script <- ' problem <- TRUE ; -if(identical(text, paste0("NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ -text <- paste0("PROBLEM: THE ", data.name, " PARAMETER MUST BE ") ; +if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": THE ", data.name, " PARAMETER MUST BE ") ; }else{ text <- paste0(text, " AND "); } text <- paste0(text, toupper(arg.names[i2]), " ", get(arg.names[i2])) ' - if(typeof(data) == "double" & double.as.integer.allowed == TRUE & ((arg.names[i2] == "class" & get(arg.names[i2]) == "integer") | (arg.names[i2] == "typeof" & get(arg.names[i2]) == "integer"))){ - if(! all(data%%1 == 0)){ # to check integers (use %%, meaning the remaining of a division): see the precedent line - eval(parse(text = tempo.script)) # execute tempo.script - } - }else if(eval(parse(text = paste0(arg.names[i2], "(data)"))) != get(arg.names[i2])){ - eval(parse(text = tempo.script)) # execute tempo.script - } - } - } - } +# end script to execute +if(typeof(data) == "double" & double.as.integer.allowed == TRUE & ((arg.names[i2] == "class" & get(arg.names[i2]) == "integer") | (arg.names[i2] == "typeof" & get(arg.names[i2]) == "integer"))){ +if(! all(data%%1 == 0)){ # to check integers (use %%, meaning the remaining of a division): see the precedent line +eval(parse(text = tempo.script)) # execute tempo.script +} +}else if(get(arg.names[i2]) != "vector" & eval(parse(text = paste0(arg.names[i2], "(data)"))) != get(arg.names[i2])){ +eval(parse(text = tempo.script)) # execute tempo.script +}else if(arg.names[i2] == "class" & get(arg.names[i2]) == "vector" & ! (class(data) == "numeric" | class(data) == "integer" | class(data) == "character" | class(data) == "logical")){ +eval(parse(text = tempo.script)) # execute tempo.script +} +} +} +} if( ! is.null(prop)){ - if(prop == TRUE){ - if(any(data < 0 | data > 1, na.rm = TRUE)){ - problem <- TRUE - if(identical(text, paste0("NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ - text <- paste0("PROBLEM: ") - }else{ - text <- paste0(text, " AND ") - } - text <- paste0(text, "THE ", data.name, " PARAMETER MUST BE DECIMAL VALUES BETWEEN 0 AND 1") - } - } +if(prop == TRUE){ +if(any(data < 0 | data > 1, na.rm = TRUE)){ +problem <- TRUE +if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": ") +}else{ +text <- paste0(text, " AND ") +} +text <- paste0(text, "THE ", data.name, " PARAMETER MUST BE DECIMAL VALUES BETWEEN 0 AND 1") +} +} } if(na.contain == FALSE & any(is.na(data)) == TRUE){ - problem <- TRUE - if(identical(text, paste0("NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ - text <- paste0("PROBLEM: ") - }else{ - text <- paste0(text, " AND ") - } - text <- paste0(text, "THE ", data.name, " PARAMETER CONTAINS NA WHILE NOT AUTHORIZED (na.contain ARGUMENT SET TO FALSE)") +problem <- TRUE +if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": ") +}else{ +text <- paste0(text, " AND ") +} +text <- paste0(text, "THE ", data.name, " PARAMETER CONTAINS NA WHILE NOT AUTHORIZED (na.contain ARGUMENT SET TO FALSE)") } if(neg.values == FALSE){ - if(any(data < 0, na.rm = TRUE)){ - problem <- TRUE - if(identical(text, paste0("NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ - text <- paste0("PROBLEM: ") - }else{ - text <- paste0(text, " AND ") - } - text <- paste0(text, "THE ", data.name, " PARAMETER MUST NON NEGATIVE NUMERIC VALUES") - } +if(any(data < 0, na.rm = TRUE)){ +problem <- TRUE +if(identical(text, paste0(ifelse(is.null(fun.name), "", paste0("IN ", fun.name, ": ")), "NO PROBLEM DETECTED FOR THE ", data.name, " PARAMETER"))){ +text <- paste0(ifelse(is.null(fun.name), "ERROR", paste0("ERROR IN ", fun.name)), ": ") +}else{ +text <- paste0(text, " AND ") +} +text <- paste0(text, "THE ", data.name, " PARAMETER MUST BE NON NEGATIVE NUMERIC VALUES") +} } if(print == TRUE & problem == TRUE){ - cat(paste0("\n\n================\n\n", text, "\n\n================\n\n")) +cat(paste0("\n\n================\n\n", text, "\n\n================\n\n")) } output <- list(problem = problem, text = text, param.name = data.name) return(output) @@ -291,85 +326,86 @@ return(output) # Check OK: clear to go Apollo fun_object_info <- function(data){ - # AIM: - # provide a full description of the object - # REQUIRED FUNCTIONS - # none - # ARGUMENTS - # data: object to test - # RETURN - # a list containing the info - # use names(fun_object_info()) and remove what can be to big for easy analysis - # EXAMPLES - # fun_object_info(data = 1:3) - # fun_object_info(data.frame(a = 1:2, b = ordered(factor(c("A", "B"))))) - # fun_object_info(list(a = 1:3, b = ordered(factor(c("A", "B"))))) - # DEBUGGING - # data = NULL # for function debugging - # data = 1:3 # for function debugging - # data = matrix(1:3) # for function debugging - # data = data.frame(a = 1:2, b = c("A", "B")) # for function debugging - # data = factor(c("b", "a")) # for function debugging - # data = ordered(factor(c("b", "a"))) # for function debugging - # data = list(a = 1:3, b = factor(c("A", "B"))) # for function debugging - # data = list(a = 1:3, b = ordered(factor(c("A", "B")))) # for function debugging - # argument checking - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - # end argument checking - data.name <- deparse(substitute(data)) - output <- list("FILE_NAME" = data.name) - tempo <- list("CLASS" = class(data)) - output <- c(output, tempo) - tempo <- list("FILE_HEAD" = head(data)) - output <- c(output, tempo) - if( ! is.null(data)){ - tempo <- list("FILE_TAIL" = tail(data)) - output <- c(output, tempo) - if( ! is.null(dim(data))){ - tempo <- list("FILE_DIMENSION" = dim(data)) - names(tempo[[1]]) <- c("NROW", "NCOL") - output <- c(output, tempo) - } - tempo <- list("SUMMARY" = summary(data)) - output <- c(output, tempo) - } - if(all(class(data) == "data.frame" | class(data) == "matrix")){ - tempo <- list("ROW_NAMES" = dimnames(data)[[1]]) - output <- c(output, tempo) - tempo <- list("COLUM_NAMES" = dimnames(data)[[2]]) - output <- c(output, tempo) - } - if(all(class(data) == "data.frame")){ - tempo <- list("STRUCTURE" = ls.str(data)) - output <- c(output, tempo) - tempo <- list("COLUMN_TYPE" = sapply(data, FUN = "typeof")) - if(any(sapply(data, FUN = "class") %in% "factor")){ # if an ordered factor is present, then sapply(data, FUN = "class") return a list but works with any(sapply(data, FUN = "class") %in% "factor") - tempo.class <- sapply(data, FUN = "class") - if(any(unlist(tempo.class) %in% "ordered")){ - tempo2 <- sapply(tempo.class, paste, collapse = " ") # paste the "ordered" factor" in "ordered factor" - }else{ - tempo2 <- unlist(tempo.class) - } - tempo[["COLUMN_TYPE"]][grepl(x = tempo2, pattern = "factor")] <- tempo2[grepl(x = tempo2, pattern = "factor")] - } - output <- c(output, tempo) - } - if(all(class(data) == "list")){ - tempo <- list("COMPARTMENT_NAMES" = names(data)) - output <- c(output, tempo) - tempo <- list("COMPARTMENT_TYPE" = sapply(data, FUN = "typeof")) - if(any(unlist(sapply(data, FUN = "class")) %in% "factor")){ # if an ordered factor is present, then sapply(data, FUN = "class") return a list but works with any(sapply(data, FUN = "class") %in% "factor") - tempo.class <- sapply(data, FUN = "class") - if(any(unlist(tempo.class) %in% "ordered")){ - tempo2 <- sapply(tempo.class, paste, collapse = " ") # paste the "ordered" factor" in "ordered factor" - }else{ - tempo2 <- unlist(tempo.class) - } - tempo[["COMPARTMENT_TYPE"]][grepl(x = tempo2, pattern = "factor")] <- tempo2[grepl(x = tempo2, pattern = "factor")] - } - output <- c(output, tempo) - } - return(output) +# AIM +# provide a full description of the object +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# none +# ARGUMENTS +# data: object to test +# RETURN +# a list containing the info +# use names(fun_object_info()) and remove what can be to big for easy analysis +# EXAMPLES +# fun_object_info(data = 1:3) +# fun_object_info(data.frame(a = 1:2, b = ordered(factor(c("A", "B"))))) +# fun_object_info(list(a = 1:3, b = ordered(factor(c("A", "B"))))) +# DEBUGGING +# data = NULL # for function debugging +# data = 1:3 # for function debugging +# data = matrix(1:3) # for function debugging +# data = data.frame(a = 1:2, b = c("A", "B")) # for function debugging +# data = factor(c("b", "a")) # for function debugging +# data = ordered(factor(c("b", "a"))) # for function debugging +# data = list(a = 1:3, b = factor(c("A", "B"))) # for function debugging +# data = list(a = 1:3, b = ordered(factor(c("A", "B")))) # for function debugging +# argument checking +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status +# end argument checking +# main code +data.name <- deparse(substitute(data)) +output <- list("FILE_NAME" = data.name) +tempo <- list("CLASS" = class(data)) +output <- c(output, tempo) +tempo <- list("FILE_HEAD" = head(data)) +output <- c(output, tempo) +if( ! is.null(data)){ +tempo <- list("FILE_TAIL" = tail(data)) +output <- c(output, tempo) +if( ! is.null(dim(data))){ +tempo <- list("FILE_DIMENSION" = dim(data)) +names(tempo[[1]]) <- c("NROW", "NCOL") +output <- c(output, tempo) +} +tempo <- list("SUMMARY" = summary(data)) +output <- c(output, tempo) +} +if(all(class(data) == "data.frame" | class(data) == "matrix")){ +tempo <- list("ROW_NAMES" = dimnames(data)[[1]]) +output <- c(output, tempo) +tempo <- list("COLUM_NAMES" = dimnames(data)[[2]]) +output <- c(output, tempo) +} +if(all(class(data) == "data.frame")){ +tempo <- list("STRUCTURE" = ls.str(data)) +output <- c(output, tempo) +tempo <- list("COLUMN_TYPE" = sapply(data, FUN = "typeof")) +if(any(sapply(data, FUN = "class") %in% "factor")){ # if an ordered factor is present, then sapply(data, FUN = "class") return a list but works with any(sapply(data, FUN = "class") %in% "factor") +tempo.class <- sapply(data, FUN = "class") +if(any(unlist(tempo.class) %in% "ordered")){ +tempo2 <- sapply(tempo.class, paste, collapse = " ") # paste the "ordered" factor" in "ordered factor" +}else{ +tempo2 <- unlist(tempo.class) +} +tempo[["COLUMN_TYPE"]][grepl(x = tempo2, pattern = "factor")] <- tempo2[grepl(x = tempo2, pattern = "factor")] +} +output <- c(output, tempo) +} +if(all(class(data) == "list")){ +tempo <- list("COMPARTMENT_NAMES" = names(data)) +output <- c(output, tempo) +tempo <- list("COMPARTMENT_TYPE" = sapply(data, FUN = "typeof")) +if(any(unlist(sapply(data, FUN = "class")) %in% "factor")){ # if an ordered factor is present, then sapply(data, FUN = "class") return a list but works with any(sapply(data, FUN = "class") %in% "factor") +tempo.class <- sapply(data, FUN = "class") +if(any(unlist(tempo.class) %in% "ordered")){ +tempo2 <- sapply(tempo.class, paste, collapse = " ") # paste the "ordered" factor" in "ordered factor" +}else{ +tempo2 <- unlist(tempo.class) +} +tempo[["COMPARTMENT_TYPE"]][grepl(x = tempo2, pattern = "factor")] <- tempo2[grepl(x = tempo2, pattern = "factor")] +} +output <- c(output, tempo) +} +return(output) } @@ -378,210 +414,214 @@ fun_object_info <- function(data){ # Check OK: clear to go Apollo fun_1D_comp <- function(data1, data2){ - # AIM: - # compare two 1D datasets (vector of factor or 1D table) of the same class or not. Check and report in a list if the 2 datasets have: - # same class - # common elements - # common element names (except factors) - # common levels (factors only) - # REQUIRED FUNCTIONS - # none - # ARGUMENTS - # data1: vector or factor or 1D table - # data2: vector or factor or 1D table - # RETURN - # a list containing: - # $same.class: logical. Are class identical? - # $class: class of the 2 datasets (NULL otherwise) - # $same.length: logical. Are number of elements identical? - # $length: number of elements in the 2 datasets (NULL otherwise) - # $same.levels: logical. Are levels identical? (NULL if data1 and data2 are not factors) - # $levels: levels of the 2 datasets if identical (NULL otherwise or NULL if data1 and data2 are not factors) - # $any.id.levels: logical. Is there any identical levels? (NULL if data1 and data2 are not factors) - # $same.levels.pos1: position, in data1, of the levels identical in data2 (NULL if data1 and data2 are not factors) - # $same.levels.pos2: position, in data2, of the levels identical in data1 (NULL if data1 and data2 are not factors) - # $common.levels: common levels between data1 and data2 (can be a subset of $levels or not). NULL if no common levels or if data1 and data2 are not factors - # $same.name: logical. Are element names identical ? - # $name: name of elements of the 2 datasets if identical (NULL otherwise) - # $any.id.name: logical. Is there any element names identical ? - # $same.name.pos1: position, in data1, of the element names identical in data2 - # $same.name.pos2: position, in data2, of the elements names identical in data1 - # $common.names: common element names between data1 and data2 (can be a subset of $name or not). NULL if no common element names - # $any.id.element: logical. is there any identical elements ? - # $same.element.pos1: position, in data1, of the elements identical in data2 - # $same.element.pos2: position, in data2, of the elements identical in data1 - # $common.elements: common elements between data1 and data2. NULL if no common elements - # $identical.object: logical. Are objects identical (kind of object, element names and content)? - # $identical.content: logical. Are content objects identical (identical elements excluding kind of object and element names)? - # EXAMPLES - # obs1 = 1:5 ; obs2 = 1:5 ; names(obs1) <- LETTERS[1:5] ; names(obs2) <- LETTERS[1:5] ; fun_1D_comp(obs1, obs2) - # obs1 = 1:5 ; obs2 = 1:5 ; names(obs1) <- LETTERS[1:5] ; fun_1D_comp(obs1, obs2) - # obs1 = 1:5 ; obs2 = 3:6 ; names(obs1) <- LETTERS[1:5] ; names(obs2) <- LETTERS[1:4] ; fun_1D_comp(obs1, obs2) - # obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[1:5]) ; fun_1D_comp(obs1, obs2) - # obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[10:11]) ; fun_1D_comp(obs1, obs2) - # obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[4:7]) ; fun_1D_comp(obs1, obs2) - # obs1 = 1:5 ; obs2 = factor(LETTERS[1:5]) ; fun_1D_comp(obs1, obs2) - # obs1 = 1:5 ; obs2 = 1.1:6.1 ; fun_1D_comp(obs1, obs2) - # obs1 = as.table(1:5); obs2 = as.table(1:5) ; fun_1D_comp(obs1, obs2) - # obs1 = as.table(1:5); obs2 = 1:5 ; fun_1D_comp(obs1, obs2) - # DEBUGGING - # data1 = 1:5 ; data2 = 1:5 ; names(data1) <- LETTERS[1:5] ; names(data2) <- LETTERS[1:5] # for function debugging - # argument checking - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if( ! any(class(data1) %in% c("logical", "integer", "numeric", "character", "factor", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_1D_comp(): THE data1 ARGUMENT MUST BE A NON NULL VECTOR, FACTOR OR 1D TABLE\n\n================\n\n") - stop(tempo.cat) - }else if(all(class(data1) %in% "table")){ - if(length(dim(data1)) > 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_1D_comp(): THE data1 ARGUMENT MUST BE A 1D TABLE\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! any(class(data2) %in% c("logical", "integer", "numeric", "character", "factor", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_1D_comp(): THE data2 ARGUMENT MUST BE A NON NULL VECTOR, FACTOR OR 1D TABLE\n\n================\n\n") - stop(tempo.cat) - }else if(all(class(data2) %in% "table")){ - if(length(dim(data2)) > 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_1D_comp(): THE data2 ARGUMENT MUST BE A 1D TABLE\n\n================\n\n") - stop(tempo.cat) - } - } - # end argument checking - same.class <- NULL - class <- NULL - same.length <- NULL - length <- NULL - same.levels <- NULL - levels <- NULL - any.id.levels <- NULL - same.levels.pos1 <- NULL - same.levels.pos2 <- NULL - common.levels <- NULL - same.name <- NULL - name <- NULL - any.id.name <- NULL - same.name.pos1 <- NULL - same.name.pos2 <- NULL - common.names <- NULL - any.id.element <- NULL - same.element.pos1 <- NULL - same.element.pos2 <- NULL - common.elements <- NULL - identical.object <- NULL - identical.content <- NULL - if(identical(data1, data2)){ - same.class <- TRUE - class <- class(data1) - same.length <- TRUE - length <- length(data1) - if(any(class(data1) %in% "factor")){ - same.levels <- TRUE - levels <- levels(data1) - any.id.levels <- TRUE - same.levels.pos1 <- 1:length(levels(data1)) - same.levels.pos2 <- 1:length(levels(data2)) - common.levels <- levels(data1) - } - if( ! is.null(names(data1))){ - same.name <- TRUE - name <- names(data1) - any.id.name <- TRUE - same.name.pos1 <- 1:length(data1) - same.name.pos2 <- 1:length(data2) - common.names <- names(data1) - } - any.id.element <- TRUE - same.element.pos1 <- 1:length(data1) - same.element.pos2 <- 1:length(data2) - common.elements <- data1 - identical.object <- TRUE - identical.content <- TRUE - }else{ - identical.object <- FALSE - if( ! identical(class(data1), class(data2))){ - same.class <- FALSE - }else{ - same.class <- TRUE - class <- class(data1) - } - if( ! identical(length(data1), length(data2))){ - same.length<- FALSE - }else{ - same.length<- TRUE - length <- length(data1) - } - if(any(class(data1) %in% "factor") & any(class(data2) %in% "factor")){ - if( ! identical(levels(data1), levels(data2))){ - same.levels <- FALSE - }else{ - same.levels <- TRUE - levels <- levels(data1) - } - any.id.levels <- FALSE - if(any(levels(data1) %in% levels(data2))){ - any.id.levels <- TRUE - same.levels.pos1 <- which(levels(data1) %in% levels(data2)) - } - if(any(levels(data2) %in% levels(data1))){ - any.id.levels <- TRUE - same.levels.pos2 <- which(levels(data2) %in% levels(data1)) - } - if(any.id.levels == TRUE){ - common.levels <- unique(c(levels(data1)[same.levels.pos1], levels(data2)[same.levels.pos2])) - } - } - if(any(class(data1) %in% "factor")){ # to compare content - data1 <- as.character(data1) - } - if(any(class(data2) %in% "factor")){ # to compare content - data2 <- as.character(data2) - } - if( ! (is.null(names(data1)) & is.null(names(data2)))){ - if( ! identical(names(data1), names(data2))){ - same.name <- FALSE - }else{ - same.name <- TRUE - name <- names(data1) - } - any.id.name <- FALSE - if(any(names(data1) %in% names(data2))){ - any.id.name <- TRUE - same.name.pos1 <- which(names(data1) %in% names(data2)) - } - if(any(names(data2) %in% names(data1))){ - any.id.name <- TRUE - same.name.pos2 <- which(names(data2) %in% names(data1)) - } - if(any.id.name == TRUE){ - common.names <- unique(c(names(data1)[same.name.pos1], names(data2)[same.name.pos2])) - } - } - any.id.element <- FALSE - if(any(data1 %in% data2)){ - any.id.element <- TRUE - same.element.pos1 <- which(data1 %in% data2) - } - if(any(data2 %in% data1)){ - any.id.element <- TRUE - same.element.pos2 <- which(data2 %in% data1) - } - if(any.id.element == TRUE){ - common.elements <- unique(c(data1[same.element.pos1], data2[same.element.pos2])) - } - if(same.length == TRUE & ! all(is.null(same.element.pos1), is.null(same.element.pos2))){ - names(same.element.pos1) <- NULL - names(same.element.pos2) <- NULL - if(identical(same.element.pos1, same.element.pos2)){ - identical.content <- TRUE - }else{ - identical.content <- FALSE - } - }else{ - identical.content <- FALSE - } - } - output <- list(same.class = same.class, class = class, same.length = same.length, length = length, same.levels = same.levels, levels = levels, any.id.levels = any.id.levels, same.levels.pos1 = same.levels.pos1, same.levels.pos2 = same.levels.pos2, common.levels = common.levels, same.name = same.name, name = name, any.id.name = any.id.name, same.name.pos1 = same.name.pos1, same.name.pos2 = same.name.pos2, common.names = common.names, any.id.element = any.id.element, same.element.pos1 = same.element.pos1, same.element.pos2 = same.element.pos2, common.elements = common.elements, identical.object = identical.object, identical.content = identical.content) - return(output) +# AIM +# compare two 1D datasets (vector of factor or 1D table) of the same class or not. Check and report in a list if the 2 datasets have: +# same class +# common elements +# common element names (except factors) +# common levels (factors only) +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# none +# ARGUMENTS +# data1: vector or factor or 1D table +# data2: vector or factor or 1D table +# RETURN +# a list containing: +# $same.class: logical. Are class identical? +# $class: class of the 2 datasets (NULL otherwise) +# $same.length: logical. Are number of elements identical? +# $length: number of elements in the 2 datasets (NULL otherwise) +# $same.levels: logical. Are levels identical? (NULL if data1 and data2 are not factors) +# $levels: levels of the 2 datasets if identical (NULL otherwise or NULL if data1 and data2 are not factors) +# $any.id.levels: logical. Is there any identical levels? (NULL if data1 and data2 are not factors) +# $same.levels.pos1: position, in data1, of the levels identical in data2 (NULL if data1 and data2 are not factors) +# $same.levels.pos2: position, in data2, of the levels identical in data1 (NULL if data1 and data2 are not factors) +# $common.levels: common levels between data1 and data2 (can be a subset of $levels or not). NULL if no common levels or if data1 and data2 are not factors +# $same.name: logical. Are element names identical ? +# $name: name of elements of the 2 datasets if identical (NULL otherwise) +# $any.id.name: logical. Is there any element names identical ? +# $same.name.pos1: position, in data1, of the element names identical in data2 +# $same.name.pos2: position, in data2, of the elements names identical in data1 +# $common.names: common element names between data1 and data2 (can be a subset of $name or not). NULL if no common element names +# $any.id.element: logical. is there any identical elements ? +# $same.element.pos1: position, in data1, of the elements identical in data2 +# $same.element.pos2: position, in data2, of the elements identical in data1 +# $common.elements: common elements between data1 and data2. NULL if no common elements +# $identical.object: logical. Are objects identical (kind of object, element names and content)? +# $identical.content: logical. Are content objects identical (identical elements excluding kind of object and element names)? +# EXAMPLES +# obs1 = 1:5 ; obs2 = 1:5 ; names(obs1) <- LETTERS[1:5] ; names(obs2) <- LETTERS[1:5] ; fun_1D_comp(obs1, obs2) +# obs1 = 1:5 ; obs2 = 1:5 ; names(obs1) <- LETTERS[1:5] ; fun_1D_comp(obs1, obs2) +# obs1 = 1:5 ; obs2 = 3:6 ; names(obs1) <- LETTERS[1:5] ; names(obs2) <- LETTERS[1:4] ; fun_1D_comp(obs1, obs2) +# obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[1:5]) ; fun_1D_comp(obs1, obs2) +# obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[10:11]) ; fun_1D_comp(obs1, obs2) +# obs1 = factor(LETTERS[1:5]) ; obs2 = factor(LETTERS[4:7]) ; fun_1D_comp(obs1, obs2) +# obs1 = 1:5 ; obs2 = factor(LETTERS[1:5]) ; fun_1D_comp(obs1, obs2) +# obs1 = 1:5 ; obs2 = 1.1:6.1 ; fun_1D_comp(obs1, obs2) +# obs1 = as.table(1:5); obs2 = as.table(1:5) ; fun_1D_comp(obs1, obs2) +# obs1 = as.table(1:5); obs2 = 1:5 ; fun_1D_comp(obs1, obs2) +# DEBUGGING +# data1 = 1:5 ; data2 = 1:5 ; names(data1) <- LETTERS[1:5] ; names(data2) <- LETTERS[1:5] # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# argument checking +if( ! any(class(data1) %in% c("logical", "integer", "numeric", "character", "factor", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A NON NULL VECTOR, FACTOR OR 1D TABLE\n\n================\n\n") +stop(tempo.cat) +}else if(all(class(data1) %in% "table")){ +if(length(dim(data1)) > 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A 1D TABLE\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! any(class(data2) %in% c("logical", "integer", "numeric", "character", "factor", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A NON NULL VECTOR, FACTOR OR 1D TABLE\n\n================\n\n") +stop(tempo.cat) +}else if(all(class(data2) %in% "table")){ +if(length(dim(data2)) > 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A 1D TABLE\n\n================\n\n") +stop(tempo.cat) +} +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status +# end argument checking +# main code +same.class <- NULL +class <- NULL +same.length <- NULL +length <- NULL +same.levels <- NULL +levels <- NULL +any.id.levels <- NULL +same.levels.pos1 <- NULL +same.levels.pos2 <- NULL +common.levels <- NULL +same.name <- NULL +name <- NULL +any.id.name <- NULL +same.name.pos1 <- NULL +same.name.pos2 <- NULL +common.names <- NULL +any.id.element <- NULL +same.element.pos1 <- NULL +same.element.pos2 <- NULL +common.elements <- NULL +identical.object <- NULL +identical.content <- NULL +if(identical(data1, data2)){ +same.class <- TRUE +class <- class(data1) +same.length <- TRUE +length <- length(data1) +if(any(class(data1) %in% "factor")){ +same.levels <- TRUE +levels <- levels(data1) +any.id.levels <- TRUE +same.levels.pos1 <- 1:length(levels(data1)) +same.levels.pos2 <- 1:length(levels(data2)) +common.levels <- levels(data1) +} +if( ! is.null(names(data1))){ +same.name <- TRUE +name <- names(data1) +any.id.name <- TRUE +same.name.pos1 <- 1:length(data1) +same.name.pos2 <- 1:length(data2) +common.names <- names(data1) +} +any.id.element <- TRUE +same.element.pos1 <- 1:length(data1) +same.element.pos2 <- 1:length(data2) +common.elements <- data1 +identical.object <- TRUE +identical.content <- TRUE +}else{ +identical.object <- FALSE +if( ! identical(class(data1), class(data2))){ +same.class <- FALSE +}else{ +same.class <- TRUE +class <- class(data1) +} +if( ! identical(length(data1), length(data2))){ +same.length<- FALSE +}else{ +same.length<- TRUE +length <- length(data1) +} +if(any(class(data1) %in% "factor") & any(class(data2) %in% "factor")){ +if( ! identical(levels(data1), levels(data2))){ +same.levels <- FALSE +}else{ +same.levels <- TRUE +levels <- levels(data1) +} +any.id.levels <- FALSE +if(any(levels(data1) %in% levels(data2))){ +any.id.levels <- TRUE +same.levels.pos1 <- which(levels(data1) %in% levels(data2)) +} +if(any(levels(data2) %in% levels(data1))){ +any.id.levels <- TRUE +same.levels.pos2 <- which(levels(data2) %in% levels(data1)) +} +if(any.id.levels == TRUE){ +common.levels <- unique(c(levels(data1)[same.levels.pos1], levels(data2)[same.levels.pos2])) +} +} +if(any(class(data1) %in% "factor")){ # to compare content +data1 <- as.character(data1) +} +if(any(class(data2) %in% "factor")){ # to compare content +data2 <- as.character(data2) +} +if( ! (is.null(names(data1)) & is.null(names(data2)))){ +if( ! identical(names(data1), names(data2))){ +same.name <- FALSE +}else{ +same.name <- TRUE +name <- names(data1) +} +any.id.name <- FALSE +if(any(names(data1) %in% names(data2))){ +any.id.name <- TRUE +same.name.pos1 <- which(names(data1) %in% names(data2)) +} +if(any(names(data2) %in% names(data1))){ +any.id.name <- TRUE +same.name.pos2 <- which(names(data2) %in% names(data1)) +} +if(any.id.name == TRUE){ +common.names <- unique(c(names(data1)[same.name.pos1], names(data2)[same.name.pos2])) +} +} +any.id.element <- FALSE +if(any(data1 %in% data2)){ +any.id.element <- TRUE +same.element.pos1 <- which(data1 %in% data2) +} +if(any(data2 %in% data1)){ +any.id.element <- TRUE +same.element.pos2 <- which(data2 %in% data1) +} +if(any.id.element == TRUE){ +common.elements <- unique(c(data1[same.element.pos1], data2[same.element.pos2])) +} +if(same.length == TRUE & ! all(is.null(same.element.pos1), is.null(same.element.pos2))){ +names(same.element.pos1) <- NULL +names(same.element.pos2) <- NULL +if(identical(same.element.pos1, same.element.pos2)){ +identical.content <- TRUE +}else{ +identical.content <- FALSE +} +}else{ +identical.content <- FALSE +} +} +output <- list(same.class = same.class, class = class, same.length = same.length, length = length, same.levels = same.levels, levels = levels, any.id.levels = any.id.levels, same.levels.pos1 = same.levels.pos1, same.levels.pos2 = same.levels.pos2, common.levels = common.levels, same.name = same.name, name = name, any.id.name = any.id.name, same.name.pos1 = same.name.pos1, same.name.pos2 = same.name.pos2, common.names = common.names, any.id.element = any.id.element, same.element.pos1 = same.element.pos1, same.element.pos2 = same.element.pos2, common.elements = common.elements, identical.object = identical.object, identical.content = identical.content) +return(output) } @@ -590,301 +630,305 @@ fun_1D_comp <- function(data1, data2){ # Check OK: clear to go Apollo fun_2D_comp <- function(data1, data2){ - # AIM: - # compare two 2D datasets of the same class or not. Check and report in a list if the 2 datasets have: - # same class - # common row names - # common column names - # same row number - # same column number - # potential identical rows between the 2 datasets - # potential identical columns between the 2 datasets - # REQUIRED FUNCTIONS - # none - # ARGUMENTS - # data1: matrix, data frame or table - # data2: matrix, data frame or table - # RETURN - # a list containing: - # $same.class: logical. Are class identical ? - # $class: classes of the 2 datasets (NULL otherwise) - # $same.dim: logical. Are dimension identical ? - # $dim: dimension of the 2 datasets (NULL otherwise) - # $same.row.nb: logical. Are number of rows identical ? - # $row.nb: nb of rows of the 2 datasets if identical (NULL otherwise) - # $same.col.nb: logical. Are number of columns identical ? - # $col.nb: nb of columns of the 2 datasets if identical (NULL otherwise) - # $same.row.name: logical. Are row names identical ? NULL if no row names in the two 2D datasets - # $row.name: name of rows of the 2 datasets if identical (NULL otherwise) - # $any.id.row.name: logical. Is there any row names identical ? NULL if no row names in the two 2D datasets - # $same.row.name.pos1: position, in data1, of the row names identical in data2 - # $same.row.name.pos2: position, in data2, of the row names identical in data1 - # $common.row.names: common row names between data1 and data2 (can be a subset of $name or not). NULL if no common row names - # $same.col.name: logical. Are column names identical ? NULL if no col names in the two 2D datasets - # $col.name: name of columns of the 2 datasets if identical (NULL otherwise) - # $any.id.col.name: logical. Is there any column names identical ? NULL if no col names in the two 2D datasets - # $same.col.name.pos1: position, in data1, of the column names identical in data2 - # $same.col.name.pos2: position, in data2, of the column names identical in data1 - # $common.col.names: common column names between data1 and data2 (can be a subset of $name or not). NULL if no common column names - # $any.id.row: logical. is there identical rows (not considering row names) ? - # $same.row.pos1: position, in data1, of the rows identical in data2 (not considering row names) - # $same.row.pos2: position, in data2, of the rows identical in data1 (not considering row names) - # $any.id.col: logical. is there identical columns (not considering column names)? - # $same.col.pos1: position in data1 of the cols identical in data2 (not considering column names) - # $same.col.pos2: position in data2 of the cols identical in data1 (not considering column names) - # $identical.object: logical. Are objects identical (including row & column names)? - # $identical.content: logical. Are content objects identical (identical excluding row & column names)? - # EXAMPLES - # obs1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) - # obs1 = matrix(101:110, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) - # obs1 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4]))) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) - # obs1 = t(matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs2 = t(matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4])))) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) - # DEBUGGING - # data1 = matrix(1:10, ncol = 5) ; data2 = matrix(1:10, ncol = 5) # for function debugging - # data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5) # for function debugging - # data1 = matrix(1:15, byrow = TRUE, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # data1 = matrix(1:15, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # data1 = matrix(1:15, ncol = 5, dimnames = list(paste0("A", letters[1:3]), LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # data1 = matrix(1:15, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:12, ncol = 4, dimnames = list(letters[1:3], LETTERS[1:4])) # for function debugging - # data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(101:110, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # data1 = data.frame(a = 1:3, b= letters[1:3], row.names = LETTERS[1:3]) ; data2 = data.frame(A = 1:3, B= letters[1:3]) # for function debugging - # data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) # for function debugging - # data1 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4]))) # for function debugging - # data1 = table(Exp1 = c("A", "A", "A", "B", "B", "B"), Exp2 = c("A1", "B1", "A1", "C1", "C1", "B1")) ; data2 = data.frame(A = 1:3, B= letters[1:3]) # for function debugging - # argument checking - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_2D_comp(): THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") - stop(tempo.cat) - } - if( ! any(class(data2) %in% c("matrix", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_2D_comp(): THE data2 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking - same.class <- NULL - class <- NULL - same.dim <- NULL - dim <- NULL - same.row.nb <- NULL - row.nb <- NULL - same.col.nb <- NULL - col.nb <- NULL - same.row.name <- NULL - row.name <- NULL - any.id.row.name <- NULL - same.row.name.pos1 <- NULL - same.row.name.pos2 <- NULL - common.row.names <- NULL - same.col.name <- NULL - any.id.col.name <- NULL - same.col.name.pos1 <- NULL - same.col.name.pos2 <- NULL - common.col.names <- NULL - col.name <- NULL - any.id.row <- NULL - same.row.pos1 <- NULL - same.row.pos2 <- NULL - any.id.col <- NULL - same.col.pos1 <- NULL - same.col.pos2 <- NULL - identical.object <- NULL - identical.content <- NULL - if(identical(data1, data2) & any(class(data1) %in% c("matrix", "data.frame", "table"))){ - same.class <- TRUE - class <- class(data1) - same.dim <- TRUE - dim <- dim(data1) - same.row.nb <- TRUE - row.nb <- nrow(data1) - same.col.nb <- TRUE - col.nb <- ncol(data1) - same.row.name <- TRUE - row.name <- dimnames(data1)[[1]] - any.id.row.name <- TRUE - same.row.name.pos1 <- 1:row.nb - same.row.name.pos2 <- 1:row.nb - common.row.names <- dimnames(data1)[[1]] - same.col.name <- TRUE - col.name <- dimnames(data1)[[2]] - any.id.col.name <- TRUE - same.col.name.pos1 <- 1:col.nb - same.col.name.pos2 <- 1:col.nb - common.col.names <- dimnames(data1)[[2]] - any.id.row <- TRUE - same.row.pos1 <- 1:row.nb - same.row.pos2 <- 1:row.nb - any.id.col <- TRUE - same.col.pos1 <- 1:col.nb - same.col.pos2 <- 1:col.nb - identical.object <- TRUE - identical.content <- TRUE - }else{ - identical.object <- FALSE - if(all(class(data1) == "table") & length(dim(data1)) == 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_2D_comp(): THE data1 ARGUMENT IS A 1D TABLE. USE THE info_1D_dataset_fun FUNCTION\n\n================\n\n") - stop(tempo.cat) - } - if(all(class(data2) == "table") & length(dim(data2)) == 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_2D_comp(): THE data2 ARGUMENT IS A 1D TABLE. USE THE info_1D_dataset_fun FUNCTION\n\n================\n\n") - stop(tempo.cat) - } - if( ! identical(class(data1), class(data2))){ - same.class <- FALSE - }else if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_2D_comp(): THE data1 AND data2 ARGUMENTS MUST BE EITHER MATRIX, DATA FRAME OR TABLE\n\n================\n\n") - stop(tempo.cat) - }else{ - same.class <- TRUE - class <- class(data1) - } - if( ! identical(dim(data1), dim(data2))){ - same.dim <- FALSE - }else{ - same.dim <- TRUE - dim <- dim(data1) - } - if( ! identical(nrow(data1), nrow(data2))){ - same.row.nb <- FALSE - }else{ - same.row.nb <- TRUE - row.nb <- nrow(data1) - } - if( ! identical(ncol(data1), ncol(data2))){ - same.col.nb <- FALSE - }else{ - same.col.nb <- TRUE - col.nb <- ncol(data1) - } - # row and col names - if(is.null(dimnames(data1)) & is.null(dimnames(data2))){ - same.row.name <- NULL - same.col.name <- NULL - # row and col names remain NULL - }else if((is.null(dimnames(data1)) & ! is.null(dimnames(data2))) | ( ! is.null(dimnames(data1)) & is.null(dimnames(data2)))){ - same.row.name <- FALSE - same.col.name <- FALSE - # row and col names remain NULL - }else{ - if( ! identical(dimnames(data1)[[1]], dimnames(data2)[[1]])){ - same.row.name <- FALSE - # row names remain NULL - }else{ - same.row.name <- TRUE - row.name <- dimnames(data1)[[1]] - } - # row names - any.id.row.name <- FALSE - if(any(dimnames(data1)[[1]] %in% dimnames(data2)[[1]])){ - any.id.row.name <- TRUE - same.row.name.pos1 <- which(dimnames(data1)[[1]] %in% dimnames(data2)[[1]]) - } - if(any(dimnames(data2)[[1]] %in% dimnames(data1)[[1]])){ - any.id.row.name <- TRUE - same.row.name.pos2 <- which(dimnames(data2)[[1]] %in% dimnames(data1)[[1]]) - } - if(any.id.row.name == TRUE){ - common.row.names <- unique(c(dimnames(data1)[[1]][same.row.name.pos1], dimnames(data2)[[1]][same.row.name.pos2])) - } - # col names - any.id.col.name <- FALSE - if(any(dimnames(data1)[[2]] %in% dimnames(data2)[[2]])){ - any.id.col.name <- TRUE - same.col.name.pos1 <- which(dimnames(data1)[[2]] %in% dimnames(data2)[[2]]) - } - if(any(dimnames(data2)[[2]] %in% dimnames(data1)[[2]])){ - any.id.col.name <- TRUE - same.col.name.pos2 <- which(dimnames(data2)[[2]] %in% dimnames(data1)[[2]]) - } - if(any.id.col.name == TRUE){ - common.col.names <- unique(c(dimnames(data1)[[2]][same.col.name.pos1], dimnames(data2)[[2]][same.col.name.pos2])) - } - if( ! identical(dimnames(data1)[[2]], dimnames(data2)[[2]])){ - same.col.name <- FALSE - # col names remain NULL - }else{ - same.col.name <- TRUE - col.name <- dimnames(data1)[[2]] - } - } - # identical row and col content - if(all(class(data1) == "table")){ - as.data.frame(matrix(data1, ncol = ncol(data1)), stringsAsFactors = FALSE) - }else if(all(class(data1) == "matrix")){ - data1 <- as.data.frame(data1, stringsAsFactors = FALSE) - }else if(all(class(data1) == "data.frame")){ - data1 <- data.frame(lapply(data1, as.character), stringsAsFactors=FALSE) - } - if(all(class(data2) == "table")){ - as.data.frame(matrix(data2, ncol = ncol(data2)), stringsAsFactors = FALSE) - }else if(all(class(data2) == "matrix")){ - data2 <- as.data.frame(data2, stringsAsFactors = FALSE) - }else if(all(class(data2) == "data.frame")){ - data2 <- data.frame(lapply(data2, as.character), stringsAsFactors=FALSE) - } - row.names(data1) <- paste0("A", 1:nrow(data1)) - row.names(data2) <- paste0("A", 1:nrow(data2)) - if(same.col.nb == TRUE){ # because if not the same col nb, the row cannot be identical - same.row.pos1 <- which(c(as.data.frame(t(data1), stringsAsFactors = FALSE)) %in% c(as.data.frame(t(data2), stringsAsFactors = FALSE))) - same.row.pos2 <- which(c(as.data.frame(t(data2), stringsAsFactors = FALSE)) %in% c(as.data.frame(t(data1), stringsAsFactors = FALSE))) - names(same.row.pos1) <- NULL - names(same.row.pos2) <- NULL - if(all(is.na(same.row.pos1))){ - same.row.pos1 <- NULL - }else{ - same.row.pos1 <- same.row.pos1[ ! is.na(same.row.pos1)] - any.id.row <- TRUE - } - if(all(is.na(same.row.pos2))){ - same.row.pos2 <- NULL - }else{ - same.row.pos2 <- same.row.pos2[ ! is.na(same.row.pos2)] - any.id.row <- TRUE - } - if(is.null(same.row.pos1) & is.null(same.row.pos2)){ - any.id.row <- FALSE - } - }else{ - any.id.row <- FALSE - # same.row.pos1 and 2 remain NULL - } - if(same.row.nb == TRUE){ # because if not the same row nb, the col cannot be identical - same.col.pos1 <- which(c(data1) %in% c(data2)) - same.col.pos2 <- which(c(data2) %in% c(data1)) - names(same.col.pos1) <- NULL - names(same.col.pos2) <- NULL - if(all(is.na(same.col.pos1))){ - same.col.pos1 <- NULL - }else{ - same.col.pos1 <- same.col.pos1[ ! is.na(same.col.pos1)] - any.id.col <- TRUE - } - if(all(is.na(same.col.pos2))){ - same.col.pos2 <- NULL - }else{ - same.col.pos2 <- same.col.pos2[ ! is.na(same.col.pos2)] - any.id.col <- TRUE - } - if(is.null(same.col.pos1) & is.null(same.col.pos2)){ - any.id.col <- FALSE - } - }else{ - any.id.col <- FALSE - # same.col.pos1 and 2 remain NULL - } - if(same.dim == TRUE & ! all(is.null(same.row.pos1), is.null(same.row.pos2), is.null(same.col.pos1), is.null(same.col.pos2))){ # same.dim == TRUE means that same.row.nb == TRUE and same.col.nb == TRUE, meaning that row.nb != NULL and col.nb != NULL. Thus, no need to include these checkings - if(identical(same.row.pos1, 1:row.nb) & identical(same.row.pos2, 1:row.nb) & identical(same.col.pos1, 1:col.nb) & identical(same.col.pos2, 1:col.nb)){ - identical.content <- TRUE - }else{ - identical.content <- FALSE - } - }else{ - identical.content <- FALSE - } - } - output <- list(same.class = same.class, class = class, same.dim = same.dim, dim = dim, same.row.nb = same.row.nb, row.nb = row.nb, same.col.nb = same.col.nb , col.nb = col.nb, same.row.name = same.row.name, row.name = row.name, any.id.row.name = any.id.row.name, same.row.name.pos1 = same.row.name.pos1, same.row.name.pos2 = same.row.name.pos2, common.row.names = common.row.names, same.col.name = same.col.name, col.name = col.name,any.id.col.name = any.id.col.name, same.col.name.pos1 = same.col.name.pos1, same.col.name.pos2 = same.col.name.pos2, common.col.names = common.col.names, any.id.row = any.id.row, same.row.pos1 = same.row.pos1, same.row.pos2 = same.row.pos2, any.id.col = any.id.col, same.col.pos1 = same.col.pos1, same.col.pos2 = same.col.pos2, identical.object = identical.object, identical.content = identical.content) - return(output) +# AIM +# compare two 2D datasets of the same class or not. Check and report in a list if the 2 datasets have: +# same class +# common row names +# common column names +# same row number +# same column number +# potential identical rows between the 2 datasets +# potential identical columns between the 2 datasets +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# none +# ARGUMENTS +# data1: matrix, data frame or table +# data2: matrix, data frame or table +# RETURN +# a list containing: +# $same.class: logical. Are class identical ? +# $class: classes of the 2 datasets (NULL otherwise) +# $same.dim: logical. Are dimension identical ? +# $dim: dimension of the 2 datasets (NULL otherwise) +# $same.row.nb: logical. Are number of rows identical ? +# $row.nb: nb of rows of the 2 datasets if identical (NULL otherwise) +# $same.col.nb: logical. Are number of columns identical ? +# $col.nb: nb of columns of the 2 datasets if identical (NULL otherwise) +# $same.row.name: logical. Are row names identical ? NULL if no row names in the two 2D datasets +# $row.name: name of rows of the 2 datasets if identical (NULL otherwise) +# $any.id.row.name: logical. Is there any row names identical ? NULL if no row names in the two 2D datasets +# $same.row.name.pos1: position, in data1, of the row names identical in data2 +# $same.row.name.pos2: position, in data2, of the row names identical in data1 +# $common.row.names: common row names between data1 and data2 (can be a subset of $name or not). NULL if no common row names +# $same.col.name: logical. Are column names identical ? NULL if no col names in the two 2D datasets +# $col.name: name of columns of the 2 datasets if identical (NULL otherwise) +# $any.id.col.name: logical. Is there any column names identical ? NULL if no col names in the two 2D datasets +# $same.col.name.pos1: position, in data1, of the column names identical in data2 +# $same.col.name.pos2: position, in data2, of the column names identical in data1 +# $common.col.names: common column names between data1 and data2 (can be a subset of $name or not). NULL if no common column names +# $any.id.row: logical. is there identical rows (not considering row names) ? +# $same.row.pos1: position, in data1, of the rows identical in data2 (not considering row names) +# $same.row.pos2: position, in data2, of the rows identical in data1 (not considering row names) +# $any.id.col: logical. is there identical columns (not considering column names)? +# $same.col.pos1: position in data1 of the cols identical in data2 (not considering column names) +# $same.col.pos2: position in data2 of the cols identical in data1 (not considering column names) +# $identical.object: logical. Are objects identical (including row & column names)? +# $identical.content: logical. Are content objects identical (identical excluding row & column names)? +# EXAMPLES +# obs1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) +# obs1 = matrix(101:110, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) +# obs1 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4]))) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) +# obs1 = t(matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs2 = t(matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4])))) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) +# DEBUGGING +# data1 = matrix(1:10, ncol = 5) ; data2 = matrix(1:10, ncol = 5) # for function debugging +# data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5) # for function debugging +# data1 = matrix(1:15, byrow = TRUE, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# data1 = matrix(1:15, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# data1 = matrix(1:15, ncol = 5, dimnames = list(paste0("A", letters[1:3]), LETTERS[1:5])) ; data2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# data1 = matrix(1:15, ncol = 5, dimnames = list(letters[1:3], LETTERS[1:5])) ; data2 = matrix(1:12, ncol = 4, dimnames = list(letters[1:3], LETTERS[1:4])) # for function debugging +# data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(101:110, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# data1 = data.frame(a = 1:3, b= letters[1:3], row.names = LETTERS[1:3]) ; data2 = data.frame(A = 1:3, B= letters[1:3]) # for function debugging +# data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) # for function debugging +# data1 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; data2 = matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4]))) # for function debugging +# data1 = table(Exp1 = c("A", "A", "A", "B", "B", "B"), Exp2 = c("A1", "B1", "A1", "C1", "C1", "B1")) ; data2 = data.frame(A = 1:3, B= letters[1:3]) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# argument checking +if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") +stop(tempo.cat) +} +if( ! any(class(data2) %in% c("matrix", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") +stop(tempo.cat) +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status +# end argument checking +# main code +same.class <- NULL +class <- NULL +same.dim <- NULL +dim <- NULL +same.row.nb <- NULL +row.nb <- NULL +same.col.nb <- NULL +col.nb <- NULL +same.row.name <- NULL +row.name <- NULL +any.id.row.name <- NULL +same.row.name.pos1 <- NULL +same.row.name.pos2 <- NULL +common.row.names <- NULL +same.col.name <- NULL +any.id.col.name <- NULL +same.col.name.pos1 <- NULL +same.col.name.pos2 <- NULL +common.col.names <- NULL +col.name <- NULL +any.id.row <- NULL +same.row.pos1 <- NULL +same.row.pos2 <- NULL +any.id.col <- NULL +same.col.pos1 <- NULL +same.col.pos2 <- NULL +identical.object <- NULL +identical.content <- NULL +if(identical(data1, data2) & any(class(data1) %in% c("matrix", "data.frame", "table"))){ +same.class <- TRUE +class <- class(data1) +same.dim <- TRUE +dim <- dim(data1) +same.row.nb <- TRUE +row.nb <- nrow(data1) +same.col.nb <- TRUE +col.nb <- ncol(data1) +same.row.name <- TRUE +row.name <- dimnames(data1)[[1]] +any.id.row.name <- TRUE +same.row.name.pos1 <- 1:row.nb +same.row.name.pos2 <- 1:row.nb +common.row.names <- dimnames(data1)[[1]] +same.col.name <- TRUE +col.name <- dimnames(data1)[[2]] +any.id.col.name <- TRUE +same.col.name.pos1 <- 1:col.nb +same.col.name.pos2 <- 1:col.nb +common.col.names <- dimnames(data1)[[2]] +any.id.row <- TRUE +same.row.pos1 <- 1:row.nb +same.row.pos2 <- 1:row.nb +any.id.col <- TRUE +same.col.pos1 <- 1:col.nb +same.col.pos2 <- 1:col.nb +identical.object <- TRUE +identical.content <- TRUE +}else{ +identical.object <- FALSE +if(all(class(data1) == "table") & length(dim(data1)) == 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT IS A 1D TABLE. USE THE info_1D_dataset_fun FUNCTION\n\n================\n\n") +stop(tempo.cat) +} +if(all(class(data2) == "table") & length(dim(data2)) == 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT IS A 1D TABLE. USE THE info_1D_dataset_fun FUNCTION\n\n================\n\n") +stop(tempo.cat) +} +if( ! identical(class(data1), class(data2))){ +same.class <- FALSE +}else if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 AND data2 ARGUMENTS MUST BE EITHER MATRIX, DATA FRAME OR TABLE\n\n================\n\n") +stop(tempo.cat) +}else{ +same.class <- TRUE +class <- class(data1) +} +if( ! identical(dim(data1), dim(data2))){ +same.dim <- FALSE +}else{ +same.dim <- TRUE +dim <- dim(data1) +} +if( ! identical(nrow(data1), nrow(data2))){ +same.row.nb <- FALSE +}else{ +same.row.nb <- TRUE +row.nb <- nrow(data1) +} +if( ! identical(ncol(data1), ncol(data2))){ +same.col.nb <- FALSE +}else{ +same.col.nb <- TRUE +col.nb <- ncol(data1) +} +# row and col names +if(is.null(dimnames(data1)) & is.null(dimnames(data2))){ +same.row.name <- NULL +same.col.name <- NULL +# row and col names remain NULL +}else if((is.null(dimnames(data1)) & ! is.null(dimnames(data2))) | ( ! is.null(dimnames(data1)) & is.null(dimnames(data2)))){ +same.row.name <- FALSE +same.col.name <- FALSE +# row and col names remain NULL +}else{ +if( ! identical(dimnames(data1)[[1]], dimnames(data2)[[1]])){ +same.row.name <- FALSE +# row names remain NULL +}else{ +same.row.name <- TRUE +row.name <- dimnames(data1)[[1]] +} +# row names +any.id.row.name <- FALSE +if(any(dimnames(data1)[[1]] %in% dimnames(data2)[[1]])){ +any.id.row.name <- TRUE +same.row.name.pos1 <- which(dimnames(data1)[[1]] %in% dimnames(data2)[[1]]) +} +if(any(dimnames(data2)[[1]] %in% dimnames(data1)[[1]])){ +any.id.row.name <- TRUE +same.row.name.pos2 <- which(dimnames(data2)[[1]] %in% dimnames(data1)[[1]]) +} +if(any.id.row.name == TRUE){ +common.row.names <- unique(c(dimnames(data1)[[1]][same.row.name.pos1], dimnames(data2)[[1]][same.row.name.pos2])) +} +# col names +any.id.col.name <- FALSE +if(any(dimnames(data1)[[2]] %in% dimnames(data2)[[2]])){ +any.id.col.name <- TRUE +same.col.name.pos1 <- which(dimnames(data1)[[2]] %in% dimnames(data2)[[2]]) +} +if(any(dimnames(data2)[[2]] %in% dimnames(data1)[[2]])){ +any.id.col.name <- TRUE +same.col.name.pos2 <- which(dimnames(data2)[[2]] %in% dimnames(data1)[[2]]) +} +if(any.id.col.name == TRUE){ +common.col.names <- unique(c(dimnames(data1)[[2]][same.col.name.pos1], dimnames(data2)[[2]][same.col.name.pos2])) +} +if( ! identical(dimnames(data1)[[2]], dimnames(data2)[[2]])){ +same.col.name <- FALSE +# col names remain NULL +}else{ +same.col.name <- TRUE +col.name <- dimnames(data1)[[2]] +} +} +# identical row and col content +if(all(class(data1) == "table")){ +as.data.frame(matrix(data1, ncol = ncol(data1)), stringsAsFactors = FALSE) +}else if(all(class(data1) == "matrix")){ +data1 <- as.data.frame(data1, stringsAsFactors = FALSE) +}else if(all(class(data1) == "data.frame")){ +data1 <- data.frame(lapply(data1, as.character), stringsAsFactors=FALSE) +} +if(all(class(data2) == "table")){ +as.data.frame(matrix(data2, ncol = ncol(data2)), stringsAsFactors = FALSE) +}else if(all(class(data2) == "matrix")){ +data2 <- as.data.frame(data2, stringsAsFactors = FALSE) +}else if(all(class(data2) == "data.frame")){ +data2 <- data.frame(lapply(data2, as.character), stringsAsFactors=FALSE) +} +row.names(data1) <- paste0("A", 1:nrow(data1)) +row.names(data2) <- paste0("A", 1:nrow(data2)) +if(same.col.nb == TRUE){ # because if not the same col nb, the row cannot be identical +same.row.pos1 <- which(c(as.data.frame(t(data1), stringsAsFactors = FALSE)) %in% c(as.data.frame(t(data2), stringsAsFactors = FALSE))) +same.row.pos2 <- which(c(as.data.frame(t(data2), stringsAsFactors = FALSE)) %in% c(as.data.frame(t(data1), stringsAsFactors = FALSE))) +names(same.row.pos1) <- NULL +names(same.row.pos2) <- NULL +if(all(is.na(same.row.pos1))){ +same.row.pos1 <- NULL +}else{ +same.row.pos1 <- same.row.pos1[ ! is.na(same.row.pos1)] +any.id.row <- TRUE +} +if(all(is.na(same.row.pos2))){ +same.row.pos2 <- NULL +}else{ +same.row.pos2 <- same.row.pos2[ ! is.na(same.row.pos2)] +any.id.row <- TRUE +} +if(is.null(same.row.pos1) & is.null(same.row.pos2)){ +any.id.row <- FALSE +} +}else{ +any.id.row <- FALSE +# same.row.pos1 and 2 remain NULL +} +if(same.row.nb == TRUE){ # because if not the same row nb, the col cannot be identical +same.col.pos1 <- which(c(data1) %in% c(data2)) +same.col.pos2 <- which(c(data2) %in% c(data1)) +names(same.col.pos1) <- NULL +names(same.col.pos2) <- NULL +if(all(is.na(same.col.pos1))){ +same.col.pos1 <- NULL +}else{ +same.col.pos1 <- same.col.pos1[ ! is.na(same.col.pos1)] +any.id.col <- TRUE +} +if(all(is.na(same.col.pos2))){ +same.col.pos2 <- NULL +}else{ +same.col.pos2 <- same.col.pos2[ ! is.na(same.col.pos2)] +any.id.col <- TRUE +} +if(is.null(same.col.pos1) & is.null(same.col.pos2)){ +any.id.col <- FALSE +} +}else{ +any.id.col <- FALSE +# same.col.pos1 and 2 remain NULL +} +if(same.dim == TRUE & ! all(is.null(same.row.pos1), is.null(same.row.pos2), is.null(same.col.pos1), is.null(same.col.pos2))){ # same.dim == TRUE means that same.row.nb == TRUE and same.col.nb == TRUE, meaning that row.nb != NULL and col.nb != NULL. Thus, no need to include these checkings +if(identical(same.row.pos1, 1:row.nb) & identical(same.row.pos2, 1:row.nb) & identical(same.col.pos1, 1:col.nb) & identical(same.col.pos2, 1:col.nb)){ +identical.content <- TRUE +}else{ +identical.content <- FALSE +} +}else{ +identical.content <- FALSE +} +} +output <- list(same.class = same.class, class = class, same.dim = same.dim, dim = dim, same.row.nb = same.row.nb, row.nb = row.nb, same.col.nb = same.col.nb , col.nb = col.nb, same.row.name = same.row.name, row.name = row.name, any.id.row.name = any.id.row.name, same.row.name.pos1 = same.row.name.pos1, same.row.name.pos2 = same.row.name.pos2, common.row.names = common.row.names, same.col.name = same.col.name, col.name = col.name,any.id.col.name = any.id.col.name, same.col.name.pos1 = same.col.name.pos1, same.col.name.pos2 = same.col.name.pos2, common.col.names = common.col.names, any.id.row = any.id.row, same.row.pos1 = same.row.pos1, same.row.pos2 = same.row.pos2, any.id.col = any.id.col, same.col.pos1 = same.col.pos1, same.col.pos2 = same.col.pos2, identical.object = identical.object, identical.content = identical.content) +return(output) } @@ -893,51 +937,60 @@ fun_2D_comp <- function(data1, data2){ # Check OK: clear to go Apollo fun_2D_head <- function(data1, n = 10, side = "l"){ - # AIM: - # display the head of the left or right of big 2D objects - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS - # data1: matrix, data frame or table - # n: number of dimension to print (10 means 10 rows and columns) - # side: either "l" or "r" for the left or right side of the 2D object - # RETURN - # the head - # EXAMPLES - # obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_head(obs1, 3) - # obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_head(obs1, 3, "right") - # DEBUGGING - # data1 = matrix(1:30, ncol = 5) # for function debugging - # data1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # argument checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_dataframe_remodeling(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = n, typeof = "integer", double.as.integer.allowed = TRUE, length = 1) ; eval(ee) - tempo <- fun_param_check(data = side, options = c("l", "r"), length = 1) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_2D_comp(): THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking - obs.dim <- dim(data1) - row <- 1:ifelse(obs.dim[1] < n, obs.dim[1], n) - if(side == "l"){ - col <- 1:ifelse(obs.dim[2] < n, obs.dim[2], n) - } - if(side == "r"){ - col <- ifelse(obs.dim[2] < n, 1, obs.dim[2] - n + 1):obs.dim[2] - } - return(data1[row, col]) +# AIM +# display the head of the left or right of big 2D objects +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS +# data1: matrix, data frame or table +# n: number of dimension to print (10 means 10 rows and columns) +# side: either "l" or "r" for the left or right side of the 2D object +# RETURN +# the head +# EXAMPLES +# obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_head(obs1, 3) +# obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_head(obs1, 3, "right") +# DEBUGGING +# data1 = matrix(1:30, ncol = 5) # for function debugging +# data1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_param_check() +if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_param_check() +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = n, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = side, options = c("l", "r"), length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +obs.dim <- dim(data1) +row <- 1:ifelse(obs.dim[1] < n, obs.dim[1], n) +if(side == "l"){ +col <- 1:ifelse(obs.dim[2] < n, obs.dim[2], n) +} +if(side == "r"){ +col <- ifelse(obs.dim[2] < n, 1, obs.dim[2] - n + 1):obs.dim[2] +} +return(data1[row, col]) } @@ -946,51 +999,60 @@ fun_2D_head <- function(data1, n = 10, side = "l"){ # Check OK: clear to go Apollo fun_2D_tail <- function(data1, n = 10, side = "l"){ - # AIM: - # display the tail of the left or right of big 2D objects - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS - # data1: matrix, data frame or table - # n: number of dimension to print (10 means 10 rows and columns) - # side: either "l" or "r" for the left or right side of the 2D object - # RETURN - # the tail - # EXAMPLES - # obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_tail(obs1, 3) - # obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_tail(obs1, 3, "r") - # DEBUGGING - # data1 = matrix(1:10, ncol = 5) # for function debugging - # data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging - # argument checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_dataframe_remodeling(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = n, typeof = "integer", double.as.integer.allowed = TRUE, length = 1) ; eval(ee) - tempo <- fun_param_check(data = side, options = c("l", "r"), length = 1) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_2D_comp(): THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking - obs.dim <- dim(data1) - row <- ifelse(obs.dim[1] < n, 1, obs.dim[1] - n + 1):obs.dim[1] - if(side == "l"){ - col <- 1:ifelse(obs.dim[2] < n, obs.dim[2], n) - } - if(side == "r"){ - col <- ifelse(obs.dim[2] < n, 1, obs.dim[2] - n + 1):obs.dim[2] - } - return(data1[row, col]) +# AIM +# display the tail of the left or right of big 2D objects +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS +# data1: matrix, data frame or table +# n: number of dimension to print (10 means 10 rows and columns) +# side: either "l" or "r" for the left or right side of the 2D object +# RETURN +# the tail +# EXAMPLES +# obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_tail(obs1, 3) +# obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_tail(obs1, 3, "r") +# DEBUGGING +# data1 = matrix(1:10, ncol = 5) # for function debugging +# data1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_param_check() +if( ! any(class(data1) %in% c("matrix", "data.frame", "table"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A MATRIX, DATA FRAME OR TABLE\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_param_check() +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = n, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = side, options = c("l", "r"), length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +obs.dim <- dim(data1) +row <- ifelse(obs.dim[1] < n, 1, obs.dim[1] - n + 1):obs.dim[1] +if(side == "l"){ +col <- 1:ifelse(obs.dim[2] < n, obs.dim[2], n) +} +if(side == "r"){ +col <- ifelse(obs.dim[2] < n, 1, obs.dim[2] - n + 1):obs.dim[2] +} +return(data1[row, col]) } @@ -999,124 +1061,128 @@ fun_2D_tail <- function(data1, n = 10, side = "l"){ # Check OK: clear to go Apollo fun_list_comp <- function(data1, data2){ - # AIM: - # compare two lists. Check and report in a list if the 2 datasets have: - # same length - # common names - # common compartments - # REQUIRED FUNCTIONS - # none - # ARGUMENTS - # data1: list - # data2: list - # RETURN - # a list containing: - # $same.length: logical. Are number of elements identical? - # $length: number of elements in the 2 datasets (NULL otherwise) - # $same.name: logical. Are element names identical ? - # $name: name of elements of the 2 datasets if identical (NULL otherwise) - # $any.id.name: logical. Is there any element names identical ? - # $same.name.pos1: position, in data1, of the element names identical in data2 - # $same.name.pos2: position, in data2, of the compartment names identical in data1 - # $any.id.compartment: logical. is there any identical compartments ? - # $same.compartment.pos1: position, in data1, of the compartments identical in data2 - # $same.compartment.pos2: position, in data2, of the compartments identical in data1 - # $identical.object: logical. Are objects identical (kind of object, compartment names and content)? - # $identical.content: logical. Are content objects identical (identical compartments excluding compartment names)? - # EXAMPLES - # obs1 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; obs2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; fun_list_comp(obs1, obs2) - # obs1 = list(1:5, LETTERS[1:2]) ; obs2 = list(a = 1:5, b = LETTERS[1:2]) ; fun_list_comp(obs1, obs2) - # obs1 = list(b = 1:5, c = LETTERS[1:2]) ; obs2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; fun_list_comp(obs1, obs2) - # obs1 = list(b = 1:5, c = LETTERS[1:2]) ; obs2 = list(LETTERS[5:9], matrix(1:6), 1:5) ; fun_list_comp(obs1, obs2) - # DEBUGGING - # data1 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; data2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) # for function debugging - # data1 = list(a = 1:5, b = LETTERS[1:2]) ; data2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) # for function debugging - # argument checking - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if( ! any(class(data1) %in% "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_list_comp(): THE data1 ARGUMENT MUST BE A LIST\n\n================\n\n") - stop(tempo.cat) - } - if( ! any(class(data2) %in% "list")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_list_comp(): THE data2 ARGUMENT MUST BE A LIST\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking - same.length <- NULL - length <- NULL - same.name <- NULL - name <- NULL - any.id.name <- NULL - same.name.pos1 <- NULL - same.name.pos2 <- NULL - any.id.compartment <- NULL - same.compartment.pos1 <- NULL - same.compartment.pos2 <- NULL - identical.object <- NULL - identical.content <- NULL - if(identical(data1, data2)){ - same.length <- TRUE - length <- length(data1) - if( ! is.null(names(data1))){ - same.name <- TRUE - name <- names(data1) - any.id.name <- TRUE - same.name.pos1 <- 1:length(data1) - same.name.pos2 <- 1:length(data2) - } - any.id.compartment <- TRUE - same.compartment.pos1 <- 1:length(data1) - same.compartment.pos2 <- 1:length(data2) - identical.object <- TRUE - identical.content <- TRUE - }else{ - identical.object <- FALSE - if( ! identical(length(data1), length(data2))){ - same.length<- FALSE - }else{ - same.length<- TRUE - length <- length(data1) - } - if( ! (is.null(names(data1)) & is.null(names(data2)))){ - if( ! identical(names(data1), names(data2))){ - same.name <- FALSE - }else{ - same.name <- TRUE - name <- names(data1) - } - any.id.name <- FALSE - if(any(names(data1) %in% names(data2))){ - any.id.name <- TRUE - same.name.pos1 <- which(names(data1) %in% names(data2)) - } - if(any(names(data2) %in% names(data1))){ - any.id.name <- TRUE - same.name.pos2 <- which(names(data2) %in% names(data1)) - } - } - names(data1) <- NULL - names(data2) <- NULL - any.id.compartment <- FALSE - if(any(data1 %in% data2)){ - any.id.compartment <- TRUE - same.compartment.pos1 <- which(data1 %in% data2) - } - if(any(data2 %in% data1)){ - any.id.compartment <- TRUE - same.compartment.pos2 <- which(data2 %in% data1) - } - if(same.length == TRUE & ! all(is.null(same.compartment.pos1), is.null(same.compartment.pos2))){ - if(identical(same.compartment.pos1, same.compartment.pos2)){ - identical.content <- TRUE - }else{ - identical.content <- FALSE - } - }else{ - identical.content <- FALSE - } - } - output <- list(same.length = same.length, length = length, same.name = same.name, name = name, any.id.name = any.id.name, same.name.pos1 = same.name.pos1, same.name.pos2 = same.name.pos2, any.id.compartment = any.id.compartment, same.compartment.pos1 = same.compartment.pos1, same.compartment.pos2 = same.compartment.pos2, identical.object = identical.object, identical.content = identical.content) - return(output) +# AIM +# compare two lists. Check and report in a list if the 2 datasets have: +# same length +# common names +# common compartments +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# none +# ARGUMENTS +# data1: list +# data2: list +# RETURN +# a list containing: +# $same.length: logical. Are number of elements identical? +# $length: number of elements in the 2 datasets (NULL otherwise) +# $same.name: logical. Are element names identical ? +# $name: name of elements of the 2 datasets if identical (NULL otherwise) +# $any.id.name: logical. Is there any element names identical ? +# $same.name.pos1: position, in data1, of the element names identical in data2 +# $same.name.pos2: position, in data2, of the compartment names identical in data1 +# $any.id.compartment: logical. is there any identical compartments ? +# $same.compartment.pos1: position, in data1, of the compartments identical in data2 +# $same.compartment.pos2: position, in data2, of the compartments identical in data1 +# $identical.object: logical. Are objects identical (kind of object, compartment names and content)? +# $identical.content: logical. Are content objects identical (identical compartments excluding compartment names)? +# EXAMPLES +# obs1 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; obs2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; fun_list_comp(obs1, obs2) +# obs1 = list(1:5, LETTERS[1:2]) ; obs2 = list(a = 1:5, b = LETTERS[1:2]) ; fun_list_comp(obs1, obs2) +# obs1 = list(b = 1:5, c = LETTERS[1:2]) ; obs2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; fun_list_comp(obs1, obs2) +# obs1 = list(b = 1:5, c = LETTERS[1:2]) ; obs2 = list(LETTERS[5:9], matrix(1:6), 1:5) ; fun_list_comp(obs1, obs2) +# DEBUGGING +# data1 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; data2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) # for function debugging +# data1 = list(a = 1:5, b = LETTERS[1:2]) ; data2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# argument checking +if( ! any(class(data1) %in% "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A LIST\n\n================\n\n") +stop(tempo.cat) +} +if( ! any(class(data2) %in% "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A LIST\n\n================\n\n") +stop(tempo.cat) +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status +# end argument checking +# main code +same.length <- NULL +length <- NULL +same.name <- NULL +name <- NULL +any.id.name <- NULL +same.name.pos1 <- NULL +same.name.pos2 <- NULL +any.id.compartment <- NULL +same.compartment.pos1 <- NULL +same.compartment.pos2 <- NULL +identical.object <- NULL +identical.content <- NULL +if(identical(data1, data2)){ +same.length <- TRUE +length <- length(data1) +if( ! is.null(names(data1))){ +same.name <- TRUE +name <- names(data1) +any.id.name <- TRUE +same.name.pos1 <- 1:length(data1) +same.name.pos2 <- 1:length(data2) +} +any.id.compartment <- TRUE +same.compartment.pos1 <- 1:length(data1) +same.compartment.pos2 <- 1:length(data2) +identical.object <- TRUE +identical.content <- TRUE +}else{ +identical.object <- FALSE +if( ! identical(length(data1), length(data2))){ +same.length<- FALSE +}else{ +same.length<- TRUE +length <- length(data1) +} +if( ! (is.null(names(data1)) & is.null(names(data2)))){ +if( ! identical(names(data1), names(data2))){ +same.name <- FALSE +}else{ +same.name <- TRUE +name <- names(data1) +} +any.id.name <- FALSE +if(any(names(data1) %in% names(data2))){ +any.id.name <- TRUE +same.name.pos1 <- which(names(data1) %in% names(data2)) +} +if(any(names(data2) %in% names(data1))){ +any.id.name <- TRUE +same.name.pos2 <- which(names(data2) %in% names(data1)) +} +} +names(data1) <- NULL +names(data2) <- NULL +any.id.compartment <- FALSE +if(any(data1 %in% data2)){ +any.id.compartment <- TRUE +same.compartment.pos1 <- which(data1 %in% data2) +} +if(any(data2 %in% data1)){ +any.id.compartment <- TRUE +same.compartment.pos2 <- which(data2 %in% data1) +} +if(same.length == TRUE & ! all(is.null(same.compartment.pos1), is.null(same.compartment.pos2))){ +if(identical(same.compartment.pos1, same.compartment.pos2)){ +identical.content <- TRUE +}else{ +identical.content <- FALSE +} +}else{ +identical.content <- FALSE +} +} +output <- list(same.length = same.length, length = length, same.name = same.name, name = name, any.id.name = any.id.name, same.name.pos1 = same.name.pos1, same.name.pos2 = same.name.pos2, any.id.compartment = any.id.compartment, same.compartment.pos1 = same.compartment.pos1, same.compartment.pos2 = same.compartment.pos2, identical.object = identical.object, identical.content = identical.content) +return(output) } @@ -1128,107 +1194,116 @@ fun_list_comp <- function(data1, data2){ # Check OK: clear to go Apollo fun_dataframe_remodeling <- function(data, quanti.col.name = "quanti", quali.col.name = "quali"){ - # AIM: - # if the data frame is made of numeric columns, a new data frame is created, with the 1st column gathering all the numeric values, and the 2nd column being the name of the columns of the initial data frame. If row names were present in the initial data frame, then a new ini_rowname column is added with the names of the rows - - - # If the data frame is made of one numeric column and one character or factor column, a new data frame is created, with the new columns corresponding to the split numeric values (according to the character column). NA are added a the end of each column to have the same number of rows. BEWARE: in such data frame, rows are not individuals. This means that in the example below, values 10 and 20 are associated on the same row but that means nothing in term of association - - - - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS - # data: data frame to convert - # quanti.col.name: optional name for the quanti column of the new data frame - # quali.col.name: optional name for the quali column of the new data frame - # RETURN - # the modified data frame - # EXAMPLES - # obs <- data.frame(col1 = (1:4)*10, col2 = c("A", "B", "A", "A")) ; obs ; fun_dataframe_remodeling(obs) - # obs <- data.frame(col1 = (1:4)*10, col2 = 5:8) ; obs ; fun_dataframe_remodeling(obs, quanti.col.name = "quanti", quali.col.name = "quali") - # obs <- data.frame(col1 = (1:4)*10, col2 = 5:8) ; rownames(obs) <- paste0("row", 1:4) ; obs ; fun_dataframe_remodeling(obs, quanti.col.name = "quanti", quali.col.name = "quali") - # DEBUGGING - # data = data.frame(a = 1:3, b = 4:6) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging - # data = data.frame(a = 1:3, b = 4:6, c = 11:13) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging - # data = data.frame(a = 1:3, b = letters[1:3]) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging - # data = data.frame(a = 1:3, b = letters[1:3]) ; quanti.col.name = "TEST" ; quali.col.name = "quali" # for function debugging - # data = data.frame(b = letters[1:3], a = 1:3) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging - # data = data.frame(b = c("e", "e", "h"), a = 1:3) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_dataframe_remodeling(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = quanti.col.name, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = quali.col.name, class = "character", length = 1) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if( ! any(class(data) %in% "data.frame")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_dataframe_remodeling(): THE data ARGUMENT MUST BE A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking - tempo.factor <- unlist(lapply(data, class)) - for(i in 1:length(tempo.factor)){ # convert factor columns as character - if(all(tempo.factor[i] == "factor")){ - data[, i] <- as.character(data[, i]) - } - } - tempo.factor <- unlist(lapply(data, mode)) - if(length(data) == 2){ - if( ! ((mode(data[, 1]) == "character" & mode(data[, 2]) == "numeric") | mode(data[, 2]) == "character" & mode(data[, 1]) == "numeric" | mode(data[, 2]) == "numeric" & mode(data[, 1]) == "numeric") ){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_dataframe_remodeling(): IF data ARGUMENT IS A DATA FRAME MADE OF 2 COLUMNS, EITHER A COLUMN MUST BE NUMERIC AND THE OTHER CHARACTER, OR THE TWO COLUMNS MUST BE NUMERIC\n\n================\n\n") - stop(tempo.cat) - } - if((mode(data[, 1]) == "character" | mode(data[, 2]) == "character") & (quanti.col.name != "quanti" | quali.col.name != "quali")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_dataframe_remodeling(): IMPROPER quanti.col.name OR quali.col.name RESETTINGS. THESE ARGUMENTS ARE RESERVED FOR DATA FRAMES MADE OF n NUMERIC COLUMNS ONLY\n\n================\n\n") - stop(tempo.cat) - } - }else{ - if( ! all(tempo.factor %in% "numeric")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_dataframe_remodeling(): IF data ARGUMENT IS A DATA FRAME MADE OF ONE COLUMN, OR MORE THAN 2 COLUMNS, THESE COLUMNS MUST BE NUMERIC\n\n================\n\n") - stop(tempo.cat) - } - } - if(( ! any(tempo.factor %in% "character")) & is.null(names(data))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_dataframe_remodeling(): NUMERIC DATA FRAME in the data ARGUMENT MUST HAVE COLUMN NAMES\n\n================\n\n") - stop() - } - if(all(tempo.factor %in% "numeric")){ # transfo 1 - quanti <- NULL - for(i in 1:length(data)){ - quanti <-c(quanti, data[, i]) - } - quali <- rep(names(data), each = nrow(data)) - output.data <- data.frame(quanti, quali) - names(output.data) <- c(quanti.col.name, quali.col.name) - # add the ini_rowname column - ini.rownames <- rownames(data) - tempo.data <- data - rownames(tempo.data) <- NULL - null.rownames <- (tempo.data) - if( ! identical(ini.rownames, null.rownames)){ - ini_rowname <- rep(ini.rownames, times = ncol(data)) - output.data <- cbind(output.data, ini_rowname) - } - }else{ # transfo 2 - if(class(data[, 1]) == "character"){ - data <- cbind(data[2], data[1]) - } - nc.max <- max(table(data[, 2])) # effectif maximum des classes - nb.na <- nc.max - table(data[,2]) # nombre de NA à ajouter pour réaliser la data frame - tempo<-split(data[, 1], data[, 2]) - for(i in 1:length(tempo)){tempo[[i]] <- append(tempo[[i]], rep(NA, nb.na[i]))} # des NA doivent être ajoutés lorsque les effectifs sont différents entre les classes. C'est uniquement pour que chaque colonne ait le même nombre de lignes - output.data<-data.frame(tempo) - } - return(output.data) +# AIM +# if the data frame is made of numeric columns, a new data frame is created, with the 1st column gathering all the numeric values, and the 2nd column being the name of the columns of the initial data frame. If row names were present in the initial data frame, then a new ini_rowname column is added with the names of the rows + + +# If the data frame is made of one numeric column and one character or factor column, a new data frame is created, with the new columns corresponding to the split numeric values (according to the character column). NA are added a the end of each column to have the same number of rows. BEWARE: in such data frame, rows are not individuals. This means that in the example below, values 10 and 20 are associated on the same row but that means nothing in term of association + + + +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS +# data: data frame to convert +# quanti.col.name: optional name for the quanti column of the new data frame +# quali.col.name: optional name for the quali column of the new data frame +# RETURN +# the modified data frame +# EXAMPLES +# obs <- data.frame(col1 = (1:4)*10, col2 = c("A", "B", "A", "A")) ; obs ; fun_dataframe_remodeling(obs) +# obs <- data.frame(col1 = (1:4)*10, col2 = 5:8) ; obs ; fun_dataframe_remodeling(obs, quanti.col.name = "quanti", quali.col.name = "quali") +# obs <- data.frame(col1 = (1:4)*10, col2 = 5:8) ; rownames(obs) <- paste0("row", 1:4) ; obs ; fun_dataframe_remodeling(obs, quanti.col.name = "quanti", quali.col.name = "quali") +# DEBUGGING +# data = data.frame(a = 1:3, b = 4:6) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging +# data = data.frame(a = 1:3, b = 4:6, c = 11:13) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging +# data = data.frame(a = 1:3, b = letters[1:3]) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging +# data = data.frame(a = 1:3, b = letters[1:3]) ; quanti.col.name = "TEST" ; quali.col.name = "quali" # for function debugging +# data = data.frame(b = letters[1:3], a = 1:3) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging +# data = data.frame(b = c("e", "e", "h"), a = 1:3) ; quanti.col.name = "quanti" ; quali.col.name = "quali" # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_param_check() +if( ! any(class(data) %in% "data.frame")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data ARGUMENT MUST BE A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_param_check() +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = quanti.col.name, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = quali.col.name, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +tempo.factor <- unlist(lapply(data, class)) +for(i in 1:length(tempo.factor)){ # convert factor columns as character +if(all(tempo.factor[i] == "factor")){ +data[, i] <- as.character(data[, i]) +} +} +tempo.factor <- unlist(lapply(data, mode)) +if(length(data) == 2){ +if( ! ((mode(data[, 1]) == "character" & mode(data[, 2]) == "numeric") | mode(data[, 2]) == "character" & mode(data[, 1]) == "numeric" | mode(data[, 2]) == "numeric" & mode(data[, 1]) == "numeric") ){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": IF data ARGUMENT IS A DATA FRAME MADE OF 2 COLUMNS, EITHER A COLUMN MUST BE NUMERIC AND THE OTHER CHARACTER, OR THE TWO COLUMNS MUST BE NUMERIC\n\n================\n\n") +stop(tempo.cat) +} +if((mode(data[, 1]) == "character" | mode(data[, 2]) == "character") & (quanti.col.name != "quanti" | quali.col.name != "quali")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": IMPROPER quanti.col.name OR quali.col.name RESETTINGS. THESE ARGUMENTS ARE RESERVED FOR DATA FRAMES MADE OF n NUMERIC COLUMNS ONLY\n\n================\n\n") +stop(tempo.cat) +} +}else{ +if( ! all(tempo.factor %in% "numeric")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": IF data ARGUMENT IS A DATA FRAME MADE OF ONE COLUMN, OR MORE THAN 2 COLUMNS, THESE COLUMNS MUST BE NUMERIC\n\n================\n\n") +stop(tempo.cat) +} +} +if(( ! any(tempo.factor %in% "character")) & is.null(names(data))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": NUMERIC DATA FRAME in the data ARGUMENT MUST HAVE COLUMN NAMES\n\n================\n\n") +stop() +} +if(all(tempo.factor %in% "numeric")){ # transfo 1 +quanti <- NULL +for(i in 1:length(data)){ +quanti <-c(quanti, data[, i]) +} +quali <- rep(names(data), each = nrow(data)) +output.data <- data.frame(quanti, quali) +names(output.data) <- c(quanti.col.name, quali.col.name) +# add the ini_rowname column +ini.rownames <- rownames(data) +tempo.data <- data +rownames(tempo.data) <- NULL +null.rownames <- (tempo.data) +if( ! identical(ini.rownames, null.rownames)){ +ini_rowname <- rep(ini.rownames, times = ncol(data)) +output.data <- cbind(output.data, ini_rowname) +} +}else{ # transfo 2 +if(class(data[, 1]) == "character"){ +data <- cbind(data[2], data[1]) +} +nc.max <- max(table(data[, 2])) # effectif maximum des classes +nb.na <- nc.max - table(data[,2]) # nombre de NA à ajouter pour réaliser la data frame +tempo<-split(data[, 1], data[, 2]) +for(i in 1:length(tempo)){tempo[[i]] <- append(tempo[[i]], rep(NA, nb.na[i]))} # des NA doivent être ajoutés lorsque les effectifs sont différents entre les classes. C'est uniquement pour que chaque colonne ait le même nombre de lignes +output.data<-data.frame(tempo) +} +return(output.data) } @@ -1237,156 +1312,180 @@ fun_dataframe_remodeling <- function(data, quanti.col.name = "quanti", quali.col # Check OK: clear to go Apollo fun_refactorization <- function(data, also.ordered = TRUE){ - # AIM: - # refactorize a factor or the factor columns of a data frame, such as only the class present are in the levels (no empty levels). The class order in levels is kept - # useful to remove the empty classes after row removing for instance - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS - # data: factor (ordered or not) or data frame - # also.ordered: refactorize also ordered factors? This to deal with ordered factors that have class "ordered" "factor" - # RETURN - # a list containing: - # $data: the modified object - # $removed: the removed classes for a factor and a list of the removed classes for each factor class of the data frame - # EXAMPLES - # obs <- data.frame(a = LETTERS[1:6], b = paste0(letters[1.6], c(1,1,2,2,3,3)), c = ordered(LETTERS[7:12]), d = 1:6, e = "A")[-c(1:2),] ; sapply(obs, levels) ; fun_refactorization(obs, FALSE) - # obs <- data.frame(a = LETTERS[1:6], b = paste0(letters[1.6], c(1,1,2,2,3,3)), c = ordered(LETTERS[7:12]), d = 1:6, e = "A")[-c(1:2),] ; sapply(obs, levels) ; fun_refactorization(obs, TRUE) - # obs <- factor(LETTERS[1:6])[-c(1:2)] ; obs ; fun_refactorization(obs, TRUE) - # obs <- ordered(LETTERS[1:6])[-c(1:2)] ; obs ; fun_refactorization(obs, TRUE) - # obs <- factor(LETTERS[1:6], levels = rev(LETTERS[1:6]))[-c(1:2)] ; obs ; fun_refactorization(obs, FALSE) - # DEBUGGING - # data <- data.frame(a = LETTERS[1:6], b = paste0(letters[1.6], c(1,1,2,2,3,3)), c = ordered(LETTERS[7:12]), d = 1:6, e = "A") ; data <- data[-c(1:2),] ; also.ordered <- TRUE # for function debugging - # data <- factor(LETTERS[1:6])[-c(1:2)] ; also.ordered <- TRUE # for function debugging - # data <- ordered(LETTERS[1:6])[-c(1:2)] ; also.ordered <- TRUE # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_refactorization(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = also.ordered, class = "logical", length = 1) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if(also.ordered == FALSE){ - if( ! (all(class(data) == "data.frame") | all(class(data) == "factor"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_refactorization(): data ARGUMENT MUST BE A FACTOR (NON ORDERED BECAUSE THE also.ordered ARGUMENT IS SET TO FALSE) OR A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - } - } - if(also.ordered == TRUE){ - if( ! (all(class(data) == "data.frame") | all(class(data) == "factor") | all(class(data) %in% c("ordered", "factor")))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_refactorization(): data ARGUMENT MUST BE A FACTOR OR A DATA FRAME\n\n================\n\n") - stop(tempo.cat) - } - } - # end argument checking - text <- NULL - if(all(class(data) == "factor")){ - tempo.keep.log <- levels(data) %in% unique(data) - text <- levels(data)[ ! tempo.keep.log] - data <- factor(data, levels = levels(data)[tempo.keep.log]) - }else if(all(class(data) %in% c("ordered", "factor"))){ - tempo.keep.log <- levels(data) %in% unique(data) - text <- levels(data)[ ! tempo.keep.log] - data <- ordered(data, levels = levels(data)[tempo.keep.log]) - }else if(all(class(data) == "data.frame")){ - text <- vector("list", length(data)) - names(text) <- names(data) - tempo.factor.col <- sapply(sapply(lapply(data, class), FUN = "%in%", "factor"), FUN = "all") # get the factor column (logical) - for(i in 1:length(tempo.factor.col)){ - if(tempo.factor.col[i] == TRUE){ - tempo.keep.log <- levels(data[[i]]) %in% unique(data[[i]]) - text[[i]] <- levels(data[[i]])[ ! tempo.keep.log] - data[[i]] <- factor(data[[i]], levels = levels(data[[i]])[tempo.keep.log]) - } - } - tempo.ordered.col <- sapply(sapply(lapply(data, class), FUN = "%in%", "ordered"), FUN = "any") # get the ordered factor column (logical) if they exist - if(also.ordered == TRUE){ - for(i in 1:length(tempo.ordered.col)){ - if(tempo.ordered.col[i] == TRUE){ - tempo.keep.log <- levels(data[[i]]) %in% unique(data[[i]]) - text[[i]] <- levels(data[[i]])[ ! tempo.keep.log] - data[[i]] <- ordered(data[[i]], levels = levels(data[[i]])[tempo.keep.log]) - } - } - } - text <- text[(tempo.factor.col | tempo.ordered.col) & ! (sapply(text, FUN = length) == 0)] # remove the compartments of text that are not modified factors columns of data frame - } - output <- list(data = data, removed = text) - return(output) -} - - -######## fun_rounding() #### Rounding number if decimal present +# AIM +# refactorize a factor or the factor columns of a data frame, such as only the class present are in the levels (no empty levels). The class order in levels is kept. Do not work on character vector or column of data frame +# useful to remove the empty classes after row removing for instance +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS +# data: factor (ordered or not) or data frame +# also.ordered: refactorize also ordered factors? This to deal with ordered factors that have class "ordered" "factor" +# RETURN +# a list containing: +# $data: the modified object +# $removed: the removed classes for a factor and a list of the removed classes for each factor class of the data frame +# EXAMPLES +# obs <- data.frame(a = LETTERS[1:6], b = paste0(letters[1.6], c(1,1,2,2,3,3)), c = ordered(LETTERS[7:12]), d = 1:6, e = "A")[-c(1:2),] ; sapply(obs, levels) ; fun_refactorization(obs, FALSE) +# obs <- data.frame(a = LETTERS[1:6], b = paste0(letters[1.6], c(1,1,2,2,3,3)), c = ordered(LETTERS[7:12]), d = 1:6, e = "A")[-c(1:2),] ; sapply(obs, levels) ; fun_refactorization(obs, TRUE) +# obs <- factor(LETTERS[1:6])[-c(1:2)] ; obs ; fun_refactorization(obs, TRUE) +# obs <- ordered(LETTERS[1:6])[-c(1:2)] ; obs ; fun_refactorization(obs, TRUE) +# obs <- factor(LETTERS[1:6], levels = rev(LETTERS[1:6]))[-c(1:2)] ; obs ; fun_refactorization(obs, FALSE) +# DEBUGGING +# data <- data.frame(a = LETTERS[1:6], b = paste0(letters[1.6], c(1,1,2,2,3,3)), c = ordered(LETTERS[7:12]), d = 1:6, e = "A") ; data <- data[-c(1:2),] ; also.ordered <- TRUE # for function debugging +# data <- factor(LETTERS[1:6])[-c(1:2)] ; also.ordered <- TRUE # for function debugging +# data <- ordered(LETTERS[1:6])[-c(1:2)] ; also.ordered <- TRUE # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = also.ordered, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# argument checking without fun_param_check() +if(also.ordered == FALSE){ +if( ! (all(class(data) == "data.frame") | all(class(data) == "factor"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT MUST BE A FACTOR (NON ORDERED BECAUSE THE also.ordered ARGUMENT IS SET TO FALSE) OR A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +} +} +if(also.ordered == TRUE){ +if( ! (all(class(data) == "data.frame") | all(class(data) == "factor") | all(class(data) %in% c("ordered", "factor")))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT MUST BE A FACTOR OR A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +} +} +# end argument checking without fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +text <- NULL +if(all(class(data) == "factor")){ +tempo.keep.log <- levels(data) %in% unique(data) +text <- levels(data)[ ! tempo.keep.log] +data <- factor(data, levels = levels(data)[tempo.keep.log]) +}else if(all(class(data) %in% c("ordered", "factor"))){ +tempo.keep.log <- levels(data) %in% unique(data) +text <- levels(data)[ ! tempo.keep.log] +data <- ordered(data, levels = levels(data)[tempo.keep.log]) +}else if(all(class(data) == "data.frame")){ +text <- vector("list", length(data)) +names(text) <- names(data) +tempo.factor.col <- sapply(sapply(lapply(data, class), FUN = "%in%", "factor"), FUN = "all") # get the factor column (logical) +for(i in 1:length(tempo.factor.col)){ +if(tempo.factor.col[i] == TRUE){ +tempo.keep.log <- levels(data[[i]]) %in% unique(data[[i]]) +text[[i]] <- levels(data[[i]])[ ! tempo.keep.log] +data[[i]] <- factor(data[[i]], levels = levels(data[[i]])[tempo.keep.log]) +} +} +tempo.ordered.col <- sapply(sapply(lapply(data, class), FUN = "%in%", "ordered"), FUN = "any") # get the ordered factor column (logical) if they exist +if(also.ordered == TRUE){ +for(i in 1:length(tempo.ordered.col)){ +if(tempo.ordered.col[i] == TRUE){ +tempo.keep.log <- levels(data[[i]]) %in% unique(data[[i]]) +text[[i]] <- levels(data[[i]])[ ! tempo.keep.log] +data[[i]] <- ordered(data[[i]], levels = levels(data[[i]])[tempo.keep.log]) +} +} +} +text <- text[(tempo.factor.col | tempo.ordered.col) & ! (sapply(text, FUN = length) == 0)] # remove the compartments of text that are not modified factors columns of data frame +} +output <- list(data = data, removed = text) +return(output) +} + + +######## fun_round() #### Rounding number if decimal present # Check OK: clear to go Apollo -fun_rounding <- function(data, dec.nb = 2, after.lead.zero = TRUE){ - # AIM: - # round a vector of values, if decimal, with the desired number of decimal digits after the decimal leading zeros - # BEWARE - # Work well with numbers as character strings, but not always with numerical numbers because of the floating point - # Numeric values are really truncated from a part of their decimal digits, whatever options(digits) settings - # ARGUMENTS - # data: a vector of numbers (numeric or character mode) - # dec.nb: number of required decimal digits - # after.lead.zero: logical. If FALSE, rounding is performed for all the decimal numbers, whatever the leading zeros (e.g., 0.123 -> 0.12 and 0.00128 -> 0.00). If TRUE, dec.nb are taken after the leading zeros (e.g., 0.123 -> 0.12 and 0.00128 -> 0.0013) - # REQUIRED FUNCTIONS - # fun_param_check() - # RETURN - # the modified vector - # EXAMPLES - # cat(fun_rounding(data = c(10, 100.001, 333.0001254, 12312.1235), dec.nb = 2, after.lead.zero = FALSE)) - # cat(fun_rounding(data = c("10", "100.001", "333.0001254", "12312.1235"), dec.nb = 2, after.lead.zero = FALSE)) - # DEBUGGING - # data = data = c(10, 100.001, 333.0001254, 12312.1235) ; dec.nb = 2 ; after.lead.zero = FALSE # # for function debugging - # data = data = c("10", "100.001", "333.0001254", "12312.1235") ; dec.nb = 2 ; after.lead.zero = TRUE # # for function debugging - # argument checking - if( ! (all(typeof(data) == "character") | all(typeof(data) == "double") | all(typeof(data) == "integer"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_rounding(): data ARGUMENT MUST BE A VECTOR OF NUMBERS (IN NUMERIC OR CHARACTER MODE)\n\n================\n\n") - stop(tempo.cat) - } - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = dec.nb, typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = after.lead.zero, class = "logical", length = 1) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - # end argument checking - tempo <- grepl(x = data, pattern = "\\.") # detection of decimal numbers - ini.mode <- mode(data) - data <- as.character(data) # to really truncate decimal digits - for(i in 1:length(data)){ # scan all the numbers of the vector - if(tempo[i] == TRUE){ # means decimal number - if(after.lead.zero == TRUE){ - zero.pos <- unlist(gregexpr(text=data[i], pattern = 0)) # recover all the position of the zeros in the number. -1 if no zeros (do not record the leading and trailing zeros) - }else{ - zero.pos <- -1 # -1 as if no zero - } - dot.pos <- unlist(gregexpr(text=data[i], pattern = "\\.")) # recover all the position of the zeros in the number - digit.pos <- unlist(gregexpr(text=data[i], pattern = "[[:digit:]]")) # recover all the position of the digits in the number - dec.pos <- digit.pos[digit.pos > dot.pos] - count <- 0 - while((dot.pos + count + 1) %in% zero.pos & (dot.pos + count + 1) <= max(dec.pos) & (count + dec.nb) < length(dec.pos)){ # count the number of leading zeros in the decimal part - count <- count + 1 - } - data[i] <- formatC(as.numeric(data[i]), digits = (count + dec.nb), format = "f") - } - } - if(ini.mode != "character"){ - data <- as.numeric(data) - } - return(data) +fun_round <- function(data, dec.nb = 2, after.lead.zero = TRUE){ +# AIM +# round a vector of values, if decimal, with the desired number of decimal digits after the decimal leading zeros +# BEWARE +# Work well with numbers as character strings, but not always with numerical numbers because of the floating point +# Numeric values are really truncated from a part of their decimal digits, whatever options(digits) settings +# ARGUMENTS +# data: a vector of numbers (numeric or character mode) +# dec.nb: number of required decimal digits +# after.lead.zero: logical. If FALSE, rounding is performed for all the decimal numbers, whatever the leading zeros (e.g., 0.123 -> 0.12 and 0.00128 -> 0.00). If TRUE, dec.nb are taken after the leading zeros (e.g., 0.123 -> 0.12 and 0.00128 -> 0.0013) +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# RETURN +# the modified vector +# EXAMPLES +# cat(fun_round(data = c(10, 100.001, 333.0001254, 12312.1235), dec.nb = 2, after.lead.zero = FALSE), "\n\n") +# cat(fun_round(data = c("10", "100.001", "333.0001254", "12312.1235"), dec.nb = 2, after.lead.zero = FALSE), "\n\n") +# cat(fun_round(data = c("10", "100.001", "333.0001254", "12312.1235"), dec.nb = 2, after.lead.zero = TRUE), "\n\n") +# DEBUGGING +# data = data = c(10, 100.001, 333.0001254, 12312.1235) ; dec.nb = 2 ; after.lead.zero = FALSE # # for function debugging +# data = data = c("10", "100.001", "333.0001254", "12312.1235") ; dec.nb = 2 ; after.lead.zero = TRUE # # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_param_check() +if( ! (all(typeof(data) == "character") | all(typeof(data) == "double") | all(typeof(data) == "integer"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT MUST BE A VECTOR OF NUMBERS (IN NUMERIC OR CHARACTER MODE)\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_param_check() +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = data, class = "vector", fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = dec.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = after.lead.zero, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +tempo <- grepl(x = data, pattern = "\\.") # detection of decimal numbers +ini.mode <- mode(data) +data <- as.character(data) # to really truncate decimal digits +for(i in 1:length(data)){ # scan all the numbers of the vector +if(tempo[i] == TRUE){ # means decimal number +if(after.lead.zero == TRUE){ +zero.pos <- unlist(gregexpr(text=data[i], pattern = 0)) # recover all the position of the zeros in the number. -1 if no zeros (do not record the leading and trailing zeros) +}else{ +zero.pos <- -1 # -1 as if no zero +} +dot.pos <- unlist(gregexpr(text=data[i], pattern = "\\.")) # recover all the position of the zeros in the number +digit.pos <- unlist(gregexpr(text=data[i], pattern = "[[:digit:]]")) # recover all the position of the digits in the number +dec.pos <- digit.pos[digit.pos > dot.pos] +count <- 0 +while((dot.pos + count + 1) %in% zero.pos & (dot.pos + count + 1) <= max(dec.pos) & (count + dec.nb) < length(dec.pos)){ # count the number of leading zeros in the decimal part +count <- count + 1 +} +data[i] <- formatC(as.numeric(data[i]), digits = (count + dec.nb), format = "f") +} +} +if(ini.mode != "character"){ +data <- as.numeric(data) +} +return(data) } @@ -1395,327 +1494,688 @@ fun_rounding <- function(data, dec.nb = 2, after.lead.zero = TRUE){ # Check OK: clear to go Apollo fun_90clock_matrix_rot <- function(data){ - # AIM: - # 90° clockwise matrix rotation - # applied twice, the function provide the mirror matrix, according to vertical and horizontal symmetry - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS - # data: matrix (matrix class) - # RETURN - # the modified matrix - # EXAMPLES - # obs <- matrix(1:10, ncol = 1) ; obs ; fun_90clock_matrix_rot(obs) - # obs <- matrix(LETTERS[1:10], ncol = 5) ; obs ; fun_90clock_matrix_rot(obs) - # DEBUGGING - # data = matrix(1:10, ncol = 1) - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_90clock_matrix_rot(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if( ! any(class(data) %in% "matrix")){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_90clock_matrix_rot(): THE data ARGUMENT MUST BE A MATRIX\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking - for (i in 1:ncol(data)){data[,i] <- rev(data[,i])} - data <- t(data) - return(data) -} - - -######## fun_hexa_hsv_color_matrix() #### Conversion of a numeric matrix into hexadecimal color matrix - - -# Check OK: clear to go Apollo -fun_hexa_hsv_color_matrix <- function(mat1, mat.hsv.h = TRUE, notch = 1, s = 1, v = 1, forced.color = NULL){ - # AIM: - # convert a matrix made of numbers into a hexadecimal matrix for rgb colorization - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS: - # mat1: matrix 1 of non negative numerical values that has to be colored (matrix class). NA allowed - # mat.hsv.h: logical. Is mat1 the h of hsv colors ? (if TRUE, mat1 must be between zero and 1) - # notch: single value between 0 and 1 to shift the successive colors on the hsv circle by + notch - # s: s argument of hsv(). Must be between 0 and 1 - # v: v argument of hsv(). Must be between 0 and 1 - # forced.color: Must be NULL or hexadecimal color code or name given by colors(). The first minimal values of mat1 will be these colors. All the color of mat1 can be forced using this argument - # RETURN - # a list containing: - # $mat1.name: name of mat1 - # $colored.mat: colors of mat1 in hexa - # $problem: logical. Is any colors of forced.color overlap the colors designed by the function. NULL if forced.color = NULL - # $text.problem: text when overlapping colors. NULL if forced.color = NULL or problem == FALSE - # EXAMPLES - # mat1 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; dimnames(mat1) <- list(LETTERS[1:4], letters[1:2]) ; fun_hexa_hsv_color_matrix(mat1, mat.hsv.h = FALSE, notch = 1, s = 1, v = 1, forced.color = NULL) - # DEBUGGING - # mat1 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; dimnames(mat1) <- list(LETTERS[1:4], letters[1:2]); mat.hsv.h = FALSE ; notch = 1 ; s = 1 ; v = 1 ; forced.color = c(hsv(1,1,1), hsv(0,0,0)) # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_hexa_hsv_color_matrix(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = mat1, mode = "numeric", class = "matrix", na.contain = TRUE, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = mat.hsv.h, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = notch, mode = "numeric", length = 1, prop = TRUE) ; eval(ee) - tempo <- fun_param_check(data = s, mode = "numeric", length = 1, prop = TRUE) ; eval(ee) - tempo <- fun_param_check(data = v, mode = "numeric", length = 1, prop = TRUE) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if(mat.hsv.h == TRUE & fun_param_check(data = mat1, mode = "numeric", prop = TRUE, print = FALSE)$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_hexa_hsv_color_matrix(): mat1 ARGUMENT MUST BE A MATRIX OF PROPORTIONS SINCE THE mat.hsv.h ARGUMENT IS SET TO TRUE\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(forced.color)){ - tempo <- fun_param_check(data = forced.color, class = "character") - if(tempo$problem == TRUE){ - stop() - } - if( ! all(forced.color %in% colors() | grepl(pattern = "^#", forced.color))){ # check that all strings of forced.color start by # - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_hexa_hsv_color_matrix(): forced.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") - stop(tempo.cat) - } - } - # end argument checking - problem <- NULL - text.problem <- NULL - mat1.name <- deparse(substitute(mat1)) - # change the scale of the plotted matrix - if(mat.hsv.h == TRUE){ - if(any(min(mat1, na.rm = TRUE) < 0 | max(mat1, na.rm = TRUE) > 1, na.rm = TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_hexa_hsv_color_matrix(): mat1 MUST BE MADE OF VALUES BETWEEN 0 AND 1 BECAUSE mat.hsv.h ARGUMENT SET TO TRUE\n\n================\n\n") - stop(tempo.cat) - } - }else{ - if(any(mat1 - floor(mat1) > 0, na.rm = TRUE) | any(mat1 == 0, na.rm = TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_hexa_hsv_color_matrix(): mat1 MUST BE MADE OF INTEGER VALUES WITHOUT 0 BECAUSE mat.hsv.h ARGUMENT SET TO FALSE\n\n================\n\n") - stop(tempo.cat) - }else{ - mat1 <- mat1 / max(mat1, na.rm = TRUE) - } - } - if(notch != 1){ - different.color <- unique(as.vector(mat1)) - different.color <- different.color[ ! is.na(different.color)] - tempo.different.color <- different.color + c(0, cumsum(rep(notch, length(different.color) - 1))) - tempo.different.color <- tempo.different.color - floor(tempo.different.color) - if(any(duplicated(tempo.different.color) == TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_hexa_hsv_color_matrix(): DUPLICATED VALUES AFTER USING notch (", paste(tempo.different.color[duplicated(tempo.different.color)], collapse = " "), "). TRY ANOTHER notch VALUE\n\n================\n\n") - stop(tempo.cat) - }else if(length(different.color) != length(tempo.different.color)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_hexa_hsv_color_matrix(): LENGTH OF different.color (", paste(different.color, collapse = " "), ") DIFFERENT FROM LENGTH OF tempo.different.color (", paste(tempo.different.color, collapse = " "), ")\n\n================\n\n") - stop(tempo.cat) - }else{ - for(i in 1:length(different.color)){ - mat1[mat1 == different.color[i]] <- tempo.different.color[i] - } - } - } - if( ! is.null(forced.color)){ - hexa.values.to.change <- hsv(unique(sort(mat1))[1:length(forced.color)], s, v) - } - mat1[ ! is.na(mat1)] <- hsv(mat1[ ! is.na(mat1)], s, v) - if( ! is.null(forced.color)){ - if(any(forced.color %in% mat1, na.rm = TRUE)){ - problem <- TRUE - text.problem <- paste0("THE FOLLOWING COLORS WHERE INTRODUCED USING forced.color BUT WHERE ALREADY PRESENT IN THE COLORED MATRIX :", paste(forced.color[forced.color %in% mat1], collapse = " ")) - }else{ - problem <- FALSE - } - for(i in 1:length(hexa.values.to.change)){ - if( ! any(mat1 == hexa.values.to.change[i], na.rm = TRUE)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_hexa_hsv_color_matrix(): THE ", hexa.values.to.change[i], " VALUE FROM hexa.values.to.change IS NOT REPRESENTED IN mat1 : ", paste(unique(as.vector(mat1)), collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - }else{ - mat1[which(mat1 == hexa.values.to.change[i])] <- forced.color[i] - } - } - } - output <- list(mat1.name = mat1.name, colored.mat = mat1, problem = problem, text.problem = text.problem) - return(output) +# AIM +# 90° clockwise matrix rotation +# applied twice, the function provide the mirror matrix, according to vertical and horizontal symmetry +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS +# data: matrix (matrix class) +# RETURN +# the modified matrix +# EXAMPLES +# obs <- matrix(1:10, ncol = 1) ; obs ; fun_90clock_matrix_rot(obs) +# obs <- matrix(LETTERS[1:10], ncol = 5) ; obs ; fun_90clock_matrix_rot(obs) +# DEBUGGING +# data = matrix(1:10, ncol = 1) +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = data, class = "matrix", fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +for (i in 1:ncol(data)){data[,i] <- rev(data[,i])} +data <- t(data) +return(data) } -######## fun_by_case_matrix_op() #### assembling of several matrices with operation +######## fun_num2color_mat() #### Conversion of a numeric matrix into hexadecimal color matrix # Check OK: clear to go Apollo -fun_by_case_matrix_op <- function(mat.list, kind.of.operation = "+"){ - # AIM: - # assemble several matrices of same dimensions by performing by case operation. For instance add the value of all the case 1 (row1 & column1) of the matrices and put it in the case 1 of a new matrix M, add the value of all the case 2 (row2 & column1) of the matrices and put it in the case 2 of a new matrix M, etc. - - # c: case - # i: row number - # j: column number - # k: matrix number - # z: number of matrices - # REQUIRED FUNCTIONS - # fun_param_check() - # fun_2D_comp() - # ARGUMENTS: - # mat.list: list of matrices - # kind.of.operation: either "+" (by case addition), "-" (by case subtraction) or "*" (by case multiplication) - # RETURN - # the assembled matrix, with row and/or column names only if all the matrices have identical row/column names - # EXAMPLES - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2), kind.of.operation = "+") - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2), kind.of.operation = "*") - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], c(NA, NA))) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2), kind.of.operation = "-") - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(c("A1", "A2", "A3", "A4"), letters[1:2])) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat3 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2, mat3), kind.of.operation = "+") - # DEBUGGING - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; mat.list = list(mat1, mat2) ; kind.of.operation = "+" # for function debugging - # mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], c(NA, NA))) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat.list = list(mat1, mat2) ; kind.of.operation = "*" # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_by_case_matrix_op(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_by_case_matrix_op(): REQUIRED fun_2D_comp() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = mat.list, class = "list") ; eval(ee) - tempo <- fun_param_check(data = kind.of.operation, options = c("+", "-", "*"), length = 1) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if(length(mat.list) < 2){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_by_case_matrix_op(): mat.list ARGUMENT MUST BE A LIST CONTAINING AT LEAST 2 MATRICES\n\n================\n\n") - stop(tempo.cat) - } - for(i0 in 1:length(mat.list)){ - tempo <- fun_param_check(data = mat.list[[i0]], class = "matrix", mode = "numeric", na.contain = TRUE) - if(tempo$problem == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_by_case_matrix_op(): ELEMENT ", i0, " OF mat.list ARGUMENT MUST BE A NUMERIC MATRIX\n\n================\n\n") - stop(tempo.cat) - } - } - ident.row.names <- TRUE - ident.col.names <- TRUE - for(i0 in 2:length(mat.list)){ - tempo <- fun_2D_comp(data1 = mat.list[[1]], data2 = mat.list[[i0]]) - if(tempo$same.dim == FALSE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_by_case_matrix_op(): MATRIX ", i0, " OF mat.list ARGUMENT MUST HAVE THE SAME DIMENSION (", paste(dim(mat.list[[i0]]), collapse = " "), ") THAN THE MATRIX 1 IN mat.list (", paste(dim(mat.list[[1]]), collapse = " "), ")\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(tempo$same.row.name)){ - if(tempo$same.row.name != TRUE){ # != TRUE to deal with NA - ident.row.names <- FALSE - } - } - if( ! is.null(tempo$same.col.name)){ - if(tempo$same.col.name != TRUE){ # != TRUE to deal with NA - ident.col.names <- FALSE - } - } - } - # end argument checking - output <- mat.list[[1]] - for(i0 in 2:length(mat.list)){ - output <- get(kind.of.operation)(output, mat.list[[i0]]) - } - dimnames(output) <- NULL - if(ident.row.names == TRUE){ - rownames(output) <- rownames(mat.list[[1]]) - } - if(ident.col.names == TRUE){ - colnames(output) <- colnames(mat.list[[1]]) - } - return(output) +fun_num2color_mat <- function(mat1, mat.hsv.h = TRUE, notch = 1, s = 1, v = 1, forced.color = NULL){ +# AIM +# convert a matrix made of numbers into a hexadecimal matrix for rgb colorization +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS: +# mat1: matrix 1 of non negative numerical values that has to be colored (matrix class). NA allowed +# mat.hsv.h: logical. Is mat1 the h of hsv colors ? (if TRUE, mat1 must be between zero and 1) +# notch: single value between 0 and 1 to shift the successive colors on the hsv circle by + notch +# s: s argument of hsv(). Must be between 0 and 1 +# v: v argument of hsv(). Must be between 0 and 1 +# forced.color: Must be NULL or hexadecimal color code or name given by colors(). The first minimal values of mat1 will be these colors. All the color of mat1 can be forced using this argument +# RETURN +# a list containing: +# $mat1.name: name of mat1 +# $colored.mat: colors of mat1 in hexa +# $problem: logical. Is any colors of forced.color overlap the colors designed by the function. NULL if forced.color = NULL +# $text.problem: text when overlapping colors. NULL if forced.color = NULL or problem == FALSE +# EXAMPLES +# mat1 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; dimnames(mat1) <- list(LETTERS[1:4], letters[1:2]) ; fun_num2color_mat(mat1, mat.hsv.h = FALSE, notch = 1, s = 1, v = 1, forced.color = NULL) +# DEBUGGING +# mat1 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; dimnames(mat1) <- list(LETTERS[1:4], letters[1:2]); mat.hsv.h = FALSE ; notch = 1 ; s = 1 ; v = 1 ; forced.color = c(hsv(1,1,1), hsv(0,0,0)) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = mat1, mode = "numeric", class = "matrix", na.contain = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = mat.hsv.h, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = notch, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = s, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = v, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# argument checking without fun_param_check() +if(mat.hsv.h == TRUE & fun_param_check(data = mat1, mode = "numeric", prop = TRUE, print = FALSE)$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat1 ARGUMENT MUST BE A MATRIX OF PROPORTIONS SINCE THE mat.hsv.h ARGUMENT IS SET TO TRUE\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(forced.color)){ +tempo <- fun_param_check(data = forced.color, class = "character") +if(tempo$problem == TRUE){ +stop() +} +if( ! all(forced.color %in% colors() | grepl(pattern = "^#", forced.color))){ # check that all strings of forced.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": forced.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") +stop(tempo.cat) +} +} +# end argument checking without fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +problem <- NULL +text.problem <- NULL +mat1.name <- deparse(substitute(mat1)) +# change the scale of the plotted matrix +if(mat.hsv.h == TRUE){ +if(any(min(mat1, na.rm = TRUE) < 0 | max(mat1, na.rm = TRUE) > 1, na.rm = TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat1 MUST BE MADE OF VALUES BETWEEN 0 AND 1 BECAUSE mat.hsv.h ARGUMENT SET TO TRUE\n\n================\n\n") +stop(tempo.cat) +} +}else{ +if(any(mat1 - floor(mat1) > 0, na.rm = TRUE) | any(mat1 == 0, na.rm = TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat1 MUST BE MADE OF INTEGER VALUES WITHOUT 0 BECAUSE mat.hsv.h ARGUMENT SET TO FALSE\n\n================\n\n") +stop(tempo.cat) +}else{ +mat1 <- mat1 / max(mat1, na.rm = TRUE) +} +} +if(notch != 1){ +different.color <- unique(as.vector(mat1)) +different.color <- different.color[ ! is.na(different.color)] +tempo.different.color <- different.color + c(0, cumsum(rep(notch, length(different.color) - 1))) +tempo.different.color <- tempo.different.color - floor(tempo.different.color) +if(any(duplicated(tempo.different.color) == TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DUPLICATED VALUES AFTER USING notch (", paste(tempo.different.color[duplicated(tempo.different.color)], collapse = " "), "). TRY ANOTHER notch VALUE\n\n================\n\n") +stop(tempo.cat) +}else if(length(different.color) != length(tempo.different.color)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": LENGTH OF different.color (", paste(different.color, collapse = " "), ") DIFFERENT FROM LENGTH OF tempo.different.color (", paste(tempo.different.color, collapse = " "), ")\n\n================\n\n") +stop(tempo.cat) +}else{ +for(i in 1:length(different.color)){ +mat1[mat1 == different.color[i]] <- tempo.different.color[i] +} +} +} +if( ! is.null(forced.color)){ +hexa.values.to.change <- hsv(unique(sort(mat1))[1:length(forced.color)], s, v) +} +mat1[ ! is.na(mat1)] <- hsv(mat1[ ! is.na(mat1)], s, v) +if( ! is.null(forced.color)){ +if(any(forced.color %in% mat1, na.rm = TRUE)){ +problem <- TRUE +text.problem <- paste0("THE FOLLOWING COLORS WHERE INTRODUCED USING forced.color BUT WHERE ALREADY PRESENT IN THE COLORED MATRIX :", paste(forced.color[forced.color %in% mat1], collapse = " ")) +}else{ +problem <- FALSE +} +for(i in 1:length(hexa.values.to.change)){ +if( ! any(mat1 == hexa.values.to.change[i], na.rm = TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE ", hexa.values.to.change[i], " VALUE FROM hexa.values.to.change IS NOT REPRESENTED IN mat1 : ", paste(unique(as.vector(mat1)), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else{ +mat1[which(mat1 == hexa.values.to.change[i])] <- forced.color[i] +} +} +} +output <- list(mat1.name = mat1.name, colored.mat = mat1, problem = problem, text.problem = text.problem) +return(output) } -######## fun_mat_inv() #### return the inverse of a square matrix +######## fun_by_case_matrix_op() #### assembling of several matrices with operation + + +# Check OK: clear to go Apollo +fun_by_case_matrix_op <- function(mat.list, kind.of.operation = "+"){ +# AIM +# assemble several matrices of same dimensions by performing by case operation. For instance add the value of all the case 1 (row1 & column1) of the matrices and put it in the case 1 of a new matrix M, add the value of all the case 2 (row2 & column1) of the matrices and put it in the case 2 of a new matrix M, etc. + +# c: case +# i: row number +# j: column number +# k: matrix number +# z: number of matrices +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# fun_2D_comp() +# ARGUMENTS: +# mat.list: list of matrices +# kind.of.operation: either "+" (by case addition), "-" (by case subtraction) or "*" (by case multiplication) +# RETURN +# the assembled matrix, with row and/or column names only if all the matrices have identical row/column names +# EXAMPLES +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2), kind.of.operation = "+") +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2), kind.of.operation = "*") +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], c(NA, NA))) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2), kind.of.operation = "-") +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(c("A1", "A2", "A3", "A4"), letters[1:2])) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat3 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2, mat3), kind.of.operation = "+") +# DEBUGGING +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; mat.list = list(mat1, mat2) ; kind.of.operation = "+" # for function debugging +# mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], c(NA, NA))) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat.list = list(mat1, mat2) ; kind.of.operation = "*" # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_2D_comp() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = mat.list, class = "list", fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = kind.of.operation, options = c("+", "-", "*"), length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# argument checking without fun_param_check() +if(length(mat.list) < 2){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat.list ARGUMENT MUST BE A LIST CONTAINING AT LEAST 2 MATRICES\n\n================\n\n") +stop(tempo.cat) +} +for(i0 in 1:length(mat.list)){ +tempo <- fun_param_check(data = mat.list[[i0]], class = "matrix", mode = "numeric", na.contain = TRUE) +if(tempo$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ELEMENT ", i0, " OF mat.list ARGUMENT MUST BE A NUMERIC MATRIX\n\n================\n\n") +stop(tempo.cat) +} +} +ident.row.names <- TRUE +ident.col.names <- TRUE +for(i0 in 2:length(mat.list)){ +tempo <- fun_2D_comp(data1 = mat.list[[1]], data2 = mat.list[[i0]]) +if(tempo$same.dim == FALSE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MATRIX ", i0, " OF mat.list ARGUMENT MUST HAVE THE SAME DIMENSION (", paste(dim(mat.list[[i0]]), collapse = " "), ") THAN THE MATRIX 1 IN mat.list (", paste(dim(mat.list[[1]]), collapse = " "), ")\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(tempo$same.row.name)){ +if(tempo$same.row.name != TRUE){ # != TRUE to deal with NA +ident.row.names <- FALSE +} +} +if( ! is.null(tempo$same.col.name)){ +if(tempo$same.col.name != TRUE){ # != TRUE to deal with NA +ident.col.names <- FALSE +} +} +} +# end argument checking without fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +output <- mat.list[[1]] +for(i0 in 2:length(mat.list)){ +output <- get(kind.of.operation)(output, mat.list[[i0]]) +} +dimnames(output) <- NULL +if(ident.row.names == TRUE){ +rownames(output) <- rownames(mat.list[[1]]) +} +if(ident.col.names == TRUE){ +colnames(output) <- colnames(mat.list[[1]]) +} +return(output) +} + + +######## fun_mat_inv() #### return the inverse of a square matrix # Check OK: clear to go Apollo fun_mat_inv <- function(mat){ - # AIM: - # return the inverse of a square matrix when solve() cannot - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS: - # mat: a square numeric matrix without NULL, NA, Inf or single case (dimension 1, 1) of 0 - # RETURN - # the inversed matrix - # EXAMPLES - # mat1 = matrix(c(1,1,1,2,1,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) # use solve() - # mat1 = matrix(c(0,0,0,0,0,0,0,0,0), ncol = 3) ; fun_mat_inv(mat = mat1) # use the trick - # mat1 = matrix(c(1,1,1,2,Inf,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) - # mat1 = matrix(c(1,1,1,2,NA,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) - # mat1 = matrix(c(1,2), ncol = 1) ; fun_mat_inv(mat = mat1) - # mat1 = matrix(0, ncol = 1) ; fun_mat_inv(mat = mat1) - # mat1 = matrix(2, ncol = 1) ; fun_mat_inv(mat = mat1) - # DEBUGGING - # mat = matrix(c(1,1,1,2,1,5,9,8,9), ncol = 3) # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_mat_inv(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = mat, class = "matrix", mode = "numeric") ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - if(ncol(mat) != nrow(mat)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_mat_inv(): mat ARGUMENT MUST BE A SQUARE MATRIX\n\n================\n\n") - stop(tempo.cat) - } - if(any(mat %in% c(Inf, -Inf, NA))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_mat_inv(): mat ARGUMENT MUST BE A MATRIX WITHOUT Inf, -Inf OR NA\n\n================\n\n") - stop(tempo.cat) - } - if(all(mat == 0) & ncol(mat) == 1){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_mat_inv(): mat ARGUMENT CANNOT BE A SQUARE MATRIX MADE OF A SINGLE CASE OF 0\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking - if(any(grepl(x = try(solve(mat), silent = TRUE)[], pattern = "Error"))){ - tempo <- svd(mat) - val.critique <- which(tempo$d < 10^-8) - Diag.mod <- diag(1 / tempo$d) - for(i in val.critique){ - Diag.mod[i, i] <- 0 - } - return(tempo$v %*% Diag.mod %*% t(tempo$u)) - }else{ - return(solve(mat)) - } -} - - -################ Graphics +# AIM +# return the inverse of a square matrix when solve() cannot +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS: +# mat: a square numeric matrix without NULL, NA, Inf or single case (dimension 1, 1) of 0 +# RETURN +# the inversed matrix +# EXAMPLES +# mat1 = matrix(c(1,1,1,2,1,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) # use solve() +# mat1 = matrix(c(0,0,0,0,0,0,0,0,0), ncol = 3) ; fun_mat_inv(mat = mat1) # use the trick +# mat1 = matrix(c(1,1,1,2,Inf,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) +# mat1 = matrix(c(1,1,1,2,NA,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) +# mat1 = matrix(c(1,2), ncol = 1) ; fun_mat_inv(mat = mat1) +# mat1 = matrix(0, ncol = 1) ; fun_mat_inv(mat = mat1) +# mat1 = matrix(2, ncol = 1) ; fun_mat_inv(mat = mat1) +# DEBUGGING +# mat = matrix(c(1,1,1,2,1,5,9,8,9), ncol = 3) # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = mat, class = "matrix", mode = "numeric", fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# argument checking without fun_param_check() +if(ncol(mat) != nrow(mat)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A SQUARE MATRIX\n\n================\n\n") +stop(tempo.cat) +} +if(any(mat %in% c(Inf, -Inf, NA))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A MATRIX WITHOUT Inf, -Inf OR NA\n\n================\n\n") +stop(tempo.cat) +} +if(all(mat == 0) & ncol(mat) == 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT CANNOT BE A SQUARE MATRIX MADE OF A SINGLE CASE OF 0\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +if(any(grepl(x = try(solve(mat), silent = TRUE)[], pattern = "[Ee]rror"))){ +tempo <- svd(mat) +val.critique <- which(tempo$d < 10^-8) +Diag.mod <- diag(1 / tempo$d) +for(i in val.critique){ +Diag.mod[i, i] <- 0 +} +return(tempo$v %*% Diag.mod %*% t(tempo$u)) +}else{ +return(solve(mat)) +} +} + + +######## fun_mat_fill() #### fill the empty half part of a symmetric square matrix + + +# Check OK: clear to go Apollo +fun_mat_fill <- function(mat, empty.cell.string = 0, warning.print = TRUE){ +# AIM +# detect the empty half part of a symmetric square matrix (either topleft, topright, bottomleft or bottomright) +# fill this empty half part using the other symmetric half part of the matrix +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS: +# mat: a numeric or character square matrix with the half part (according to the grand diagonal) filled with NA (any kind of matrix), "0" (character matrix) or 0 (numeric matrix) exclusively (not a mix of 0 and NA in the empty part) +# empty.cell.string: a numeric, character or NA (no quotes) indicating what empty cells are filled with +# warning.print: logical. Print warning message? +# RETURN +# if warning.print = FALSE, the filled matrix +# if warning.print = TRUE, a list containing: +# $mat: the filled matrix +# $warnings: the warning messages +# a plot verification using fun_gg_heatmap() is recommanded +# EXAMPLES +# mat1 = matrix(c(1,NA,NA,NA, 0,2,NA,NA, NA,3,4,NA, 5,6,7,8), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = NA, warning.print = TRUE) # bottomleft example +# mat1 = matrix(c(1,1,1,2, 0,2,3,0, NA,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = NA, warning.print = TRUE) # error example +# mat1 = matrix(c(1,1,1,2, 0,2,3,0, NA,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warning.print = TRUE) # bottomright example +# mat1 = matrix(c(1,1,1,2, "a",2,3,NA, "a","a",0,0, "a","a","a",0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = "a", warning.print = TRUE) # topright example +# mat1 = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,NA, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warning.print = TRUE) # topleft example +# mat1 = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warning.print = TRUE) # error example +# DEBUGGING +# mat = matrix(c(1,NA,NA,NA, 0,2,NA,NA, NA,3,4,NA, 5,6,7,8), ncol = 4) ; empty.cell.string = NA ; warning.print = TRUE # for function debugging +# mat = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,NA, 5,0,0,0), ncol = 4) ; empty.cell.string = 0 ; warning.print = TRUE # for function debugging # topleft example +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = mat, class = "matrix", na.contain = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = empty.cell.string, class = "vector", na.contain = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = warning.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# argument checking without fun_param_check() +if(ncol(mat) != nrow(mat)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A SQUARE MATRIX\n\n================\n\n") +stop(tempo.cat) +} +if( ! (mode(mat) %in% c("numeric", "character"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MUST BE A NUMERIC OR CHARACTER MATRIX\n\n================\n\n") +stop(tempo.cat) +} +if(nrow(mat) == 1 & ncol(mat) == 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT CANNOT BE A SQUARE MATRIX MADE OF A SINGLE CASE\n\n================\n\n") +stop(tempo.cat) +} +if(ifelse(is.na(empty.cell.string), ! any(is.na(mat)), ! any(mat == empty.cell.string, na.rm = TRUE))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mat ARGUMENT MATRIX MUST HAVE CELLS WITH THE EMPTY STRING SPECIFIED IN empty.cell.string ARGUMENT\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +list.diag <- vector("list", length = nrow(mat) - 1) +for(i0 in 1:(nrow(mat) - 1)){ +list.diag[[i0]] <- numeric(length = nrow(mat) - i0) +} +sector <- c("topleft", "topright", "bottomright", "bottomleft") +diag.scan <-c( # same order as sector. Recover each diag from center to corner +"mat[as.matrix(as.data.frame(list(1:(nrow(mat) - i1), (ncol(mat) -i1):1)))]", # topleft part +"mat[as.matrix(as.data.frame(list(1:(nrow(mat) - i1), (1:ncol(mat))[-(1:i1)])))]", # topright part +"mat[as.matrix(as.data.frame(list((1 + i1):nrow(mat), ncol(mat):(1 + i1))))]", # bottomright part +"mat[as.matrix(as.data.frame(list((1 + i1):nrow(mat), 1:(ncol(mat) -i1))))]" # bottomleft part +) +# empty part detection +tempo.list.diag <- list.diag +empty.sector <- NULL +full.sector <- NULL +warning <- NULL +for(i0 in 1:length(sector)){ +tempo.list.diag <- list.diag +for(i1 in 1:(nrow(mat) - 1)){ +tempo.list.diag[[i1]] <- eval(parse(text = diag.scan[i0])) +if(ifelse(is.na(empty.cell.string), ! all(is.na(tempo.list.diag[[i1]])), ! (all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = TRUE) & ! (is.na(all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = FALSE)))))){ # I had to add this ! (is.na(all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = FALSE))) because all(tempo.list.diag[[i1]] == empty.cell.string, na.rm = FALSE) gives NA and not FALSE if one NA in tempo.list.diag[[i1]] -> not good for if() +full.sector <- c(full.sector, sector[i0]) +break +} +} +if(i1 == nrow(mat) - 1){ +if(all(unlist(lapply(tempo.list.diag, FUN = function(x){if(is.na(empty.cell.string)){is.na(x)}else{x == empty.cell.string}})), na.rm = TRUE)){ +empty.sector <- c(empty.sector, sector[i0]) +tempo.warning <- paste0("THE EMPTY SECTOR IS ", toupper(sector[i0])) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE ", toupper(sector[i0]), " SECTOR, DETECTED AS EMPTY, IS NOT? DIFFERENT VALUES IN THIS SECTOR:\n", paste(names(table(unlist(tempo.list.diag), useNA = "ifany")), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +} +} +if(length(empty.sector) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ACCORDING TO empty.cell.string ARGUMENT (", empty.cell.string, "), mat ARGUMENT MATRIX HAS ZERO EMPTY HALF PART\n\n================\n\n") +stop(tempo.cat) +}else if(length(empty.sector) > 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ACCORDING TO empty.cell.string ARGUMENT (", empty.cell.string, "), mat ARGUMENT MATRIX HAS MORE THAN ONE EMPTY HALF PART (ACCORDING TO THE GRAND DIAGONAL): ", paste(empty.sector, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else if(any(full.sector %in% empty.sector, na.rm = TRUE)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE FUNCTION HAS DETECTED EMPTY AND NON EMPTY HALF PART IN THE SAME SECTOR: ", paste(full.sector[full.sector %in% empty.sector], collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else if(length(empty.sector) + length(full.sector)!= 4){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE FUNCTION HAS DETECTED MORE OR LESS SECTORS THAN 4:\nEMPTY SECTORS:", paste(empty.sector, collapse = " "), "\nFULL SECTORS:", paste(full.sector, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +# end empty part detection +# matrix filling +for(i1 in 1:(nrow(mat) - 1)){ +if(empty.sector == "topleft"){ +eval(parse(text = paste0(diag.scan[1], " <- ", diag.scan[3]))) +}else if(empty.sector == "topright"){ +eval(parse(text = paste0(diag.scan[2], " <- ", diag.scan[4]))) +}else if(empty.sector == "bottomright"){ +eval(parse(text = paste0(diag.scan[3], " <- ", diag.scan[1]))) +}else if(empty.sector == "bottomleft"){ +eval(parse(text = paste0(diag.scan[4], " <- ", diag.scan[2]))) +} +} +# end matrix filling +if(warning.print == TRUE){ +return(list(mat = mat, warnings = warning)) +}else{ +return(mat) +} +} + + +######## fun_consec_pos_perm() #### progressively breaks a vector order + + +fun_consec_pos_perm <- function(data1, data2 = NULL, n = 20, seed = NULL, count.print = 10, text.print = "", cor.method = "spearman", cor.limit = 0.2, path.lib = NULL){ +# AIM +# reorder the elements of the data1 vector by flipping 2 randomly selected consecutive positions either: +# 1) n times (when n is precised) or +# 2) until the correlation between data1 and data2 decreases down to the cor.limit (0.2 by default). See cor.limit below to deal with negative correlations +# Example of consecutive position flipping: ABCD -> BACD -> BADC, etc. +# ARGUMENTS +# data1: a vector of at least 2 elements. Must be numeric if data2 is specified +# data2: a numeric vector of same length as data1 +# n: number of times "flipping 2 randomly selected consecutive positions". Ignored if data2 is specified +# seed: integer number used by set.seed(). BEWARE: if not NULL, fun_consec_pos_perm() will systematically return the same result when the other parameters keep the same settings +# count.print: print a working progress message every count.print loop. If count.print > n, then no message will be printed +# text.print: optional message to add to the working progress message every count.print loop +# cor.method: correlation method. Either "pearson", "kendall" or "spearman". Ignored if data2 is not specified +# cor.limit: a correlation limit (between 0 and 1). If cor(data1, data2) is negative and cor.limit is positive, then -cor.limit is used and the process stops until the correlation between data1 and data2 increases up cor.limit (-0.2 by default). Beware: write a positive cor.limit even if cor(data1, data2) is known to be negative. The function will automately use -cor.limit. Ignored if data2 is not specified +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# lubridate +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# fun_pack_import() +# RETURN +# a list containing: +# $data: the modified vector +# $warnings: potential warning messages (in case of negative correlation when data2 is specified) +# $cor: a spearman correlation between the initial positions (1:length(data1) and the final positions if data2 is not specified and the final correlation between data1 and data2 otherwise +# EXAMPLES +# fun_consec_pos_perm(data1 = LETTERS[1:5], data2 = NULL, n = 20, seed = 1, count.print = 10, text.print = "", cor.method = "spearman", cor.limit = 0.2) +# fun_consec_pos_perm(data1 = 101:110, data2 = 21:30, n = 20, seed = 1, count.print = 10, text.print = "", cor.method = "spearman", cor.limit = 0.2) +# DEBUGGING +# data1 = LETTERS[1:5] ; data2 = NULL ; n = 10 ; seed = NULL ; count.print = 10 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.2 ; path.lib = NULL +# data1 = LETTERS[1:5] ; data2 = NULL ; n = 10 ; seed = 22 ; count.print = 10 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.2 ; path.lib = NULL +# data1 = 101:110 ; data2 = 21:30 ; n = 10 ; seed = 22 ; count.print = 10 ; text.print = "" ; cor.method = "spearman" ; cor.limit = 0.2 ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack_import", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack_import() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_param_check() +if( ! all(is.vector(data1))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 ARGUMENT MUST BE A VECTOR\n\n================\n\n") +stop(tempo.cat) +} +if(length(data1) < 2){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 ARGUMENT MUST BE A VECTOR OF MINIMUM LENGTH 2. HERE IT IS: ", length(data1),"\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_param_check() +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +if( ! is.null(data2)){ +tempo <- fun_param_check(data = data1, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) +if(tempo$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 MUST BE A NUMERIC VECTOR IF data2 ARGUMENT IS SPECIFIED\n\n================\n\n") +stop(tempo.cat) +} +if( ! all(is.vector(data2))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data2 ARGUMENT MUST BE A VECTOR\n\n================\n\n") +stop(tempo.cat) +} +tempo <- fun_param_check(data = data2, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) +if(length(data1) != length(data2)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 AND data2 MUST BE VECTOR OF SAME LENGTH. HERE IT IS ", length(data1)," AND ", length(data2), "\n\n================\n\n") +stop(tempo.cat) +} +} +tempo <- fun_param_check(data = n, class = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +if( ! is.null(seed)){ +tempo <- fun_param_check(data = seed, class = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = count.print, class = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = text.print, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = cor.method, options = c("pearson", "kendall", "spearman"), length =1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = cor.limit, class = "vector", mode = "numeric", prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_param_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# package checking +fun_pack_import(req.package = "lubridate", path.lib = path.lib) +# end package checking +# main code +if( ! is.null(seed)){ +# code that does not affect set.seed() in the global environment +# as soon as set.seed() or a random function, like runif() or sample(), is used, R creates the .Random.seed in the global environment, that will control the subsequent random operations (vector of number used by the random number generator). The .Random.seed object is systematically stored in the global environment, wherever the environment of set.seed() or runif() execution +# thanks to this code, when the function end, .Random.seed recovers the last vector of .Random.seed, whatever random execution performed by the function. Thus, if a set.seed() was performed in the global environment, the reproducibility of successive random operation in this environment will not be impaired +# Example: +## open a new R session. Then +## myfunction <- function (){if(exists(".Random.seed", envir = .GlobalEnv)){old <- .Random.seed ; on.exit(assign(".Random.seed", old, env = .GlobalEnv))} ; set.seed(2) ; runif(1)} +## set.seed(1) ; rnorm(1) ; rnorm(1) ; rnorm(1) +## rerun the same in a new session but without the previous line +## set.seed(1) ; rnorm(1) ; myfunction() ; rnorm(1) ; rnorm(1) +if(exists(".Random.seed", envir = .GlobalEnv)){ # .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 set.seed() +} +# end code that does not affect set.seed() in the global environment +set.seed(seed) +} +ini.date <- Sys.time() +ini.time <- as.numeric(ini.date) # time of process begin, converted into seconds +ini.pos <- 1:length(data1) # positions of data1 before permutation loops +tempo.pos <- ini.pos # positions of data1 that will be modified during loops +warnings <- NULL +# variable allocation before the loops to save time +date.tempo <- Sys.time() +time.tempo <- as.numeric(date.tempo) +lapse.tempo <- lubridate::seconds_to_period(time.tempo - ini.time) +pos <- 0 # position randomly selected +tempo.count.print <- count.print # for the printing message +# end variable allocation before the loops to save time +if(is.null(data2)){ +if(tempo.count.print > n){ +tempo.count.print <- n +} +count <- 0 +# pos.check <- NULL +for(i2 in 1:n){ +count[1] <- count + 1 +pos[1] <- sample(x = ini.pos[-length(data1)], size = 1, replace = FALSE) # selection of 1 position in initial position, without the last because always up permutation (pos -> pos+1 & pos+1 -> pos) +tempo.pos[(pos + 1):pos] <- tempo.pos[pos:(pos + 1)] +if(count == tempo.count.print){ +tempo.count.print[1] <- tempo.count.print + count.print +date.tempo[1] <- Sys.time() +time.tempo[1] <- as.numeric(date.tempo) +lapse.tempo[1] <- lubridate::seconds_to_period(time.tempo - ini.time) +print(paste0("LOOP ", i2, " / ", n, ifelse(text.print == "", "", paste0(" | ", text.print)), " | TIME SPENT: ", lapse.tempo)) +} +# pos.check <- c(pos.check, pos) +} +}else{ +tempo.cor <- cor(x = data1, y = data2, use = "pairwise.complete.obs", method = "spearman") +if(tempo.cor < 0){ +tempo.warnings <- paste0("INITIAL ", toupper(cor.method), " CORRELATION BETWEEN data1 AND data2 HAS BEEN DETECTED AS NEGATIVE: ", tempo.cor, ".THE cor.limit PARAMETER WILL BE SWITCHED TO THE NEGATIVE EQUIVALENT: ", -datacor.limit) +warnings <- paste0(warnings, ifelse(is.null(warnings), "", "\n"), tempo.warnings) # in fact, abs(tempo.cor) is systematicallu used +} +if(abs(tempo.cor) < cor.limit){ # randomize directly all the position to be close to correlation zero +for(i1 in 1:5){ # done 5 times to be sure of the complete randomness +tempo.pos <- sample(x = tempo.pos, size = length(tempo.pos), replace = FALSE) +} +}else{ +count <- 0 +while(abs(tempo.cor) > cor.limit){ +count[1] <- count + 1 +pos[1] <- sample(x = ini.pos[-length(data1)], size = 1, replace = FALSE) # selection of 1 position in initial position, without the last because always up permutation (pos -> pos+1 & pos+1 -> pos) +tempo.pos[(pos + 1):pos] <- tempo.pos[pos:(pos + 1)] +tempo.cor[1] <- cor(x = data1[tempo.pos], y = data2, use = "pairwise.complete.obs", method = cor.method) +if(count == tempo.count.print){ +tempo.count.print[1] <- tempo.count.print + count.print +date.tempo[1] <- Sys.time() +time.tempo[1] <- as.numeric(date.tempo) +lapse.tempo[1] <- lubridate::seconds_to_period(time.tempo - ini.time) +print(paste0("LOOP ", count, " / ? (WHILE LOOP) ", ifelse(text.print == "", "", paste0(" | ", text.print)), " PERMUTATION IN data1 | CORRELATION LIMIT: ", cor.limit, " | TEMPO CORRELATION: ", round(tempo.cor, 3), " | TIME SPENT: ", lapse.tempo)) +} +} +} +} +output <- list(data = data1[tempo.pos], warnings = warnings, cor = ifelse(is.null(data2), cor(ini.pos, tempo.pos, method = "spearman"), tempo.cor)) +return(output) +} + + +################ Graphics management # this order can be used: # fun_window_width_resizing() # fun_open_window() -# fun_graph_param_prior_plot() # not for ggplot2 +# fun_prior_plot() # not for ggplot2 # plot() or any other plotting -# fun_feature_post_plot() if fun_graph_param_prior_plot() has been used # not for ggplot2 +# fun_post_plot() if fun_prior_plot() has been used # not for ggplot2 # fun_close_specif_window() @@ -1724,56 +2184,60 @@ fun_mat_inv <- function(mat){ # Check OK: clear to go Apollo fun_window_width_resizing <- function(class.nb, inches.per.class.nb = 1, ini.window.width = 7, inch.left.space, inch.right.space, boundarie.space = 0.5){ - # AIM: - # rescale the width of a window to open depending on the number of classes to plot - # can be used for height, considering that it is as if it was a width - # this order can be used: - # fun_window_width_resizing() - # fun_open_window() - # fun_graph_param_prior_plot() # not for ggplot2 - # plot() or any other plotting - # fun_feature_post_plot() if fun_graph_param_prior_plot() has been used # not for ggplot2 - # fun_close_specif_window() - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS - # class.nb: number of class to plot - # inches.per.class.nb: number of inches per unit of class.nb. 2 means 2 inches for each boxplot for instance - # ini.window.width:initial window width in inches - # inch.left.space: left horizontal margin of the figure region (in inches) - # inch.right.space: right horizontal margin of the figure region (in inches) - # boundarie.space: space between the right and left limits of the plotting region and the plot (0.5 means half a class width) - # RETURN - # the new window width in inches - # EXAMPLES - # fun_window_width_resizing(class.nb = 10, inches.per.class.nb = 0.2, ini.window.width = 7, inch.left.space = 1, inch.right.space = 1, boundarie.space = 0.5) - # DEBUGGING - # class.nb = 10 ; inches.per.class.nb = 0.2 ; ini.window.width = 7 ; inch.left.space = 1 ; inch.right.space = 1 ; boundarie.space = 0.5 # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_window_width_resizing(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = class.nb, typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = inches.per.class.nb, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = ini.window.width, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = inch.left.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = inch.right.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = boundarie.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - # end argument checking - range.max <- class.nb + boundarie.space # the max range of the future plot - range.min <- boundarie.space # the min range of the future plot - window.width <- inch.left.space + inch.right.space + inches.per.class.nb * (range.max - range.min) - return(window.width) +# AIM +# rescale the width of a window to open depending on the number of classes to plot +# can be used for height, considering that it is as if it was a width +# this order can be used: +# fun_window_width_resizing() +# fun_open_window() +# fun_prior_plot() # not for ggplot2 +# plot() or any other plotting +# fun_post_plot() if fun_prior_plot() has been used # not for ggplot2 +# fun_close_specif_window() +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS +# class.nb: number of class to plot +# inches.per.class.nb: number of inches per unit of class.nb. 2 means 2 inches for each boxplot for instance +# ini.window.width:initial window width in inches +# inch.left.space: left horizontal margin of the figure region (in inches) +# inch.right.space: right horizontal margin of the figure region (in inches) +# boundarie.space: space between the right and left limits of the plotting region and the plot (0.5 means half a class width) +# RETURN +# the new window width in inches +# EXAMPLES +# fun_window_width_resizing(class.nb = 10, inches.per.class.nb = 0.2, ini.window.width = 7, inch.left.space = 1, inch.right.space = 1, boundarie.space = 0.5) +# DEBUGGING +# class.nb = 10 ; inches.per.class.nb = 0.2 ; ini.window.width = 7 ; inch.left.space = 1 ; inch.right.space = 1 ; boundarie.space = 0.5 # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = class.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = inches.per.class.nb, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = ini.window.width, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = inch.left.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = inch.right.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = boundarie.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +range.max <- class.nb + boundarie.space # the max range of the future plot +range.min <- boundarie.space # the min range of the future plot +window.width <- inch.left.space + inch.right.space + inches.per.class.nb * (range.max - range.min) +return(window.width) } @@ -1782,642 +2246,654 @@ fun_window_width_resizing <- function(class.nb, inches.per.class.nb = 1, ini.win # Check OK: clear to go Apollo fun_open_window <- function(pdf.disp = TRUE, path.fun = "working.dir", pdf.name.file = "graph", width.fun = 7, height.fun = 7, paper = "special", no.pdf.overwrite = TRUE, return.output = FALSE){ - # AIM: - # open a pdf or screen (GUI) graphic window - # BEWARE: on Linux, use pdf.disp = TRUE, if (GUI) graphic window is not always available, meaning that X is not installed (clusters for instance). Use X11() in R to test if available - # this order can be used: - # fun_window_width_resizing() - # fun_open_window() - # fun_graph_param_prior_plot() # not for ggplot2 - # plot() or any other plotting - # fun_feature_post_plot() if fun_graph_param_prior_plot() has been used # not for ggplot2 - # fun_close_specif_window() - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS: - # pdf.disp: use pdf or not - # path.fun: where the pdf is saved. Write "working.dir" if working directory is required (default) - # pdf.name.file: name of the pdf file containing the graphs (the .pdf extension is added by the function) - # width.fun: width of the windows (in inches) - # height.fun: height of the windows (in inches) - # paper: paper argument of the pdf function (paper format). Only used for pdf(). Either "a4", "letter", "legal", "us", "executive", "a4r", "USr" or "special". If "special", means that width.fun and height.fun specify the paper size - # no.pdf.overwrite: existing pdf can be overwritten ? Only used if pdf.disp = TRUE - # return.output: return output ? If TRUE but function not assigned, the output list is displayed - # RETURN - # a list containing: - # $pdf.loc: path of the pdf created - # $ini.par: initial par() parameters (to reset in a new graph) - # $zone.ini: initial window spliting (to reset in a new graph) - # EXAMPLES - # fun_open_window(pdf.disp = FALSE, path.fun = "C:/Users/Gael/Desktop", pdf.name.file = "graph", width.fun = 7, height.fun = 7, paper = "special", no.pdf.overwrite = TRUE, return.output = TRUE) - # DEBUGGING - # pdf.disp = TRUE ; path.fun = "C:/Users/Gael/Desktop" ; pdf.name.file = "graphs" ; width.fun = 7 ; height.fun = 7 ; paper = "special" ; no.pdf.overwrite = TRUE ; return.output = TRUE # for function debugging - # pdf.disp = TRUE ; path.fun = "/pasteur/homes/gmillot/" ; pdf.name.file = "graphs" ; width.fun = 7 ; height.fun = 7 ; paper = "special" ; no.pdf.overwrite = TRUE ; return.output = TRUE # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_open_window(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = pdf.disp, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = path.fun, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = pdf.name.file, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = width.fun, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = height.fun, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = path.fun, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = paper, options = c("a4", "letter", "legal", "us", "executive", "a4r", "USr", "special", "A4", "LETTER", "LEGAL", "US"), length = 1) ; eval(ee) - tempo <- fun_param_check(data =no.pdf.overwrite, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = return.output, class = "logical", length = 1) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - # end argument checking - if(path.fun == "working.dir"){ - path.fun <- getwd() - }else{ - if(grepl(x = path.fun, pattern = ".+/$")){ - path.fun <- substr(path.fun, 1, nchar(path.fun) - 1) # remove the last / - } - if(dir.exists(path.fun) == FALSE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_open_window(): path.fun ARGUMENT DOES NOT CORRESPOND TO EXISTING DIRECTORY\n\n================\n\n") - stop(tempo.cat) - } - } - if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows - open.fail <- NULL - windows() - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code bacause always a tempo window opened - invisible(dev.off()) # close the new window - }else if(Sys.info()["sysname"] == "Linux"){ - if(pdf.disp == TRUE){ - if(file.exists(paste0(path.fun, "/recover_ini_par.pdf"))){ - tempo.cat <- paste0("\n\n================\n\nPROBLEM IN fun_open_window(): THIS FUNCTION CANNOT BE USED ON LINUX IF A recover_ini_par.pdf FILE ALREADY EXISTS HERE: ", paste(path.fun, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - }else{ - pdf(width = width.fun, height = height.fun, file=paste0(path.fun, "/recover_ini_par.pdf"), paper = paper) - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code bacause always a tempo window opened - invisible(dev.off()) # close the pdf windows - file.remove(paste0(path.fun, "/recover_ini_par.pdf")) # remove the pdf file - } - }else{ - # test if X11 can be opened - if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_open_window(): THIS FUNCTION CANNOT BE USED ON LINUX IF A Rplots.pdf FILE ALREADY EXISTS HERE: ", getwd(), "\n\n================\n\n") - stop(tempo.cat) - }else{ - open.fail <- suppressWarnings(try(X11(), silent = TRUE))[] # try to open a X11 window. If open.fail == NULL, no problem, meaning that the X11 window is opened. If open.fail != NULL, a pdf can be opened here paste0(getwd(), "/Rplots.pdf") - if(is.null(open.fail)){ - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code bacause always a tempo window opened - invisible(dev.off()) # close the new window - }else if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ - file.remove(paste0(getwd(), "/Rplots.pdf")) # remove the pdf file - tempo.cat <- ("\n\n================\n\nPROBLEM IN fun_open_window(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE SET pdf.disp ARGUMENT TO TRUE AND RERUN\n\n================\n\n") - stop(tempo.cat) - } - } - } - }else{ - open.fail <- NULL - quartz() - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code bacause always a tempo window opened - invisible(dev.off()) # close the new window - } - zone.ini <- matrix(1, ncol=1) # to recover the initial parameters for next figure region when device region split into several figure regions - if(pdf.disp == TRUE){ - pdf.loc <- paste0(path.fun, "/", pdf.name.file, ".pdf") - if(file.exists(pdf.loc) == TRUE & no.pdf.overwrite == TRUE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_open_window(): pdf.loc FILE ALREADY EXISTS AND CANNOT BE OVERWRITTEN DUE TO no.pdf.overwrite ARGUMENT SET TO TRUE: ", pdf.loc, "\n\n================\n\n") - stop(tempo.cat) - }else{ - pdf(width = width.fun, height = height.fun, file=pdf.loc, paper = paper) - } - }else if(pdf.disp == FALSE){ - pdf.loc <- NULL - if(Sys.info()["sysname"] == "Windows"){ # .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows - windows(width = width.fun, height = height.fun, rescale="fixed") - }else if(Sys.info()["sysname"] == "Linux"){ - if( ! is.null(open.fail)){ - stop("\n\n================\n\nPROBLEM IN fun_open_window(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE SET pdf.disp ARGUMENT TO TRUE AND RERUN\n\n================\n\n") - }else{ - X11(width = width.fun, height = height.fun) - } - }else{ - quartz(width = width.fun, height = height.fun) - } - } - if(return.output == TRUE){ - output <- list(pdf.loc = pdf.loc, ini.par = ini.par, zone.ini = zone.ini) - return(output) - } -} - - -######## fun_graph_param_prior_plot() #### Graph param before plotting +# AIM +# open a pdf or screen (GUI) graphic window +# BEWARE: on Linux, use pdf.disp = TRUE, if (GUI) graphic window is not always available, meaning that X is not installed (clusters for instance). Use X11() in R to test if available +# this order can be used: +# fun_window_width_resizing() +# fun_open_window() +# fun_prior_plot() # not for ggplot2 +# plot() or any other plotting +# fun_post_plot() if fun_prior_plot() has been used # not for ggplot2 +# fun_close_specif_window() +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS: +# pdf.disp: use pdf or not +# path.fun: where the pdf is saved. Write "working.dir" if working directory is required (default) +# pdf.name.file: name of the pdf file containing the graphs (the .pdf extension is added by the function) +# width.fun: width of the windows (in inches) +# height.fun: height of the windows (in inches) +# paper: paper argument of the pdf function (paper format). Only used for pdf(). Either "a4", "letter", "legal", "us", "executive", "a4r", "USr" or "special". If "special", means that width.fun and height.fun specify the paper size +# no.pdf.overwrite: existing pdf can be overwritten ? Only used if pdf.disp = TRUE +# return.output: return output ? If TRUE but function not assigned, the output list is displayed +# RETURN +# a list containing: +# $pdf.loc: path of the pdf created +# $ini.par: initial par() parameters (to reset in a new graph) +# $zone.ini: initial window spliting (to reset in a new graph) +# EXAMPLES +# fun_open_window(pdf.disp = FALSE, path.fun = "C:/Users/Gael/Desktop", pdf.name.file = "graph", width.fun = 7, height.fun = 7, paper = "special", no.pdf.overwrite = TRUE, return.output = TRUE) +# DEBUGGING +# pdf.disp = TRUE ; path.fun = "C:/Users/Gael/Desktop" ; pdf.name.file = "graphs" ; width.fun = 7 ; height.fun = 7 ; paper = "special" ; no.pdf.overwrite = TRUE ; return.output = TRUE # for function debugging +# pdf.disp = TRUE ; path.fun = "/pasteur/homes/gmillot/" ; pdf.name.file = "graphs" ; width.fun = 7 ; height.fun = 7 ; paper = "special" ; no.pdf.overwrite = TRUE ; return.output = TRUE # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = pdf.disp, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = path.fun, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = pdf.name.file, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = width.fun, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = height.fun, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = path.fun, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = paper, options = c("a4", "letter", "legal", "us", "executive", "a4r", "USr", "special", "A4", "LETTER", "LEGAL", "US"), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data =no.pdf.overwrite, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = return.output, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +if(path.fun == "working.dir"){ +path.fun <- getwd() +}else{ +if(grepl(x = path.fun, pattern = ".+/$")){ +path.fun <- substr(path.fun, 1, nchar(path.fun) - 1) # remove the last / +} +if(dir.exists(path.fun) == FALSE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": path.fun ARGUMENT DOES NOT CORRESPOND TO EXISTING DIRECTORY\n\n================\n\n") +stop(tempo.cat) +} +} +if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows +open.fail <- NULL +windows() +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +}else if(Sys.info()["sysname"] == "Linux"){ +if(pdf.disp == TRUE){ +if(file.exists(paste0(path.fun, "/recover_ini_par.pdf"))){ +tempo.cat <- paste0("\n\n================\n\nPROBLEM IN fun_open_window(): THIS FUNCTION CANNOT BE USED ON LINUX IF A recover_ini_par.pdf FILE ALREADY EXISTS HERE: ", paste(path.fun, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else{ +pdf(width = width.fun, height = height.fun, file=paste0(path.fun, "/recover_ini_par.pdf"), paper = paper) +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the pdf windows +file.remove(paste0(path.fun, "/recover_ini_par.pdf")) # remove the pdf file +} +}else{ +# test if X11 can be opened +if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIS FUNCTION CANNOT BE USED ON LINUX IF A Rplots.pdf FILE ALREADY EXISTS HERE: ", getwd(), "\n\n================\n\n") +stop(tempo.cat) +}else{ +open.fail <- suppressWarnings(try(X11(), silent = TRUE))[] # try to open a X11 window. If open.fail == NULL, no problem, meaning that the X11 window is opened. If open.fail != NULL, a pdf can be opened here paste0(getwd(), "/Rplots.pdf") +if(is.null(open.fail)){ +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +}else if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ +file.remove(paste0(getwd(), "/Rplots.pdf")) # remove the pdf file +tempo.cat <- ("\n\n================\n\nPROBLEM IN fun_open_window(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE SET pdf.disp ARGUMENT TO TRUE AND RERUN\n\n================\n\n") +stop(tempo.cat) +} +} +} +}else{ +open.fail <- NULL +quartz() +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +} +zone.ini <- matrix(1, ncol=1) # to recover the initial parameters for next figure region when device region split into several figure regions +if(pdf.disp == TRUE){ +pdf.loc <- paste0(path.fun, "/", pdf.name.file, ".pdf") +if(file.exists(pdf.loc) == TRUE & no.pdf.overwrite == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": pdf.loc FILE ALREADY EXISTS AND CANNOT BE OVERWRITTEN DUE TO no.pdf.overwrite ARGUMENT SET TO TRUE: ", pdf.loc, "\n\n================\n\n") +stop(tempo.cat) +}else{ +pdf(width = width.fun, height = height.fun, file=pdf.loc, paper = paper) +} +}else if(pdf.disp == FALSE){ +pdf.loc <- NULL +if(Sys.info()["sysname"] == "Windows"){ # .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows +windows(width = width.fun, height = height.fun, rescale="fixed") +}else if(Sys.info()["sysname"] == "Linux"){ +if( ! is.null(open.fail)){ +stop("\n\n================\n\nPROBLEM IN fun_open_window(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE SET pdf.disp ARGUMENT TO TRUE AND RERUN\n\n================\n\n") +}else{ +X11(width = width.fun, height = height.fun) +} +}else{ +quartz(width = width.fun, height = height.fun) +} +} +if(return.output == TRUE){ +output <- list(pdf.loc = pdf.loc, ini.par = ini.par, zone.ini = zone.ini) +return(output) +} +} + + +######## fun_prior_plot() #### Graph param before plotting # Check OK: clear to go Apollo -fun_graph_param_prior_plot <- function(param.reinitial = FALSE, xlog.scale = FALSE, ylog.scale = FALSE, remove.label = TRUE, remove.x.axis = TRUE, remove.y.axis = TRUE, std.x.range = TRUE, std.y.range = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 3.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = FALSE){ - # AIM: - # very convenient to erase the axes for post plot axis redrawing using fun_feature_post_plot() - # reinitialize and set the graphic parameters before plotting - # CANNOT be used if no graphic device already opened - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS - # param.reinitial: reinitialize graphic parameters before applying the new ones, as defined by the other arguments? Either TRUE or FALSE - # xlog.scale: Log scale for the x-axis? Either TRUE or FALSE. If TRUE, erases the x-axis, except legend, for further drawing by fun_feature_post_plot()(xlog argument of par()) - # ylog.scale: Log scale for the y-axis? Either TRUE or FALSE. If TRUE, erases the y-axis, except legend, for further drawing by fun_feature_post_plot()(ylog argument of par()) - # remove.label: remove labels (axis legend) of the two axes? Either TRUE or FALSE (ann argument of par()) - # remove.x.axis: remove x-axis except legend? Either TRUE or FALSE (control the xaxt argument of par()). Automately set to TRUE if xlog.scale == TRUE - # remove.y.axis: remove y-axis except legend? Either TRUE or FALSE (control the yaxt argument of par()). Automately set to TRUE if ylog.scale == TRUE - # std.x.range: standard range on the x-axis? TRUE (no range extend) or FALSE (4% range extend). Controls xaxs argument of par() (TRUE is xaxs = "i", FALSE is xaxs = "r") - # std.y.range: standard range on the y-axis? TRUE (no range extend) or FALSE (4% range extend). Controls yaxs argument of par() (TRUE is yaxs = "i", FALSE is yaxs = "r") - # down.space: lower vertical margin (in inches, mai argument of par()) - # left.space: left horizontal margin (in inches, mai argument of par()) - # up.space: upper vertical margin between plot region and grapical window (in inches, mai argument of par()) - # right.space: right horizontal margin (in inches, mai argument of par()) - # orient: scale number orientation (las argument of par()). 0, always parallel to the axis; 1, always horizontal; 2, always perpendicular to the axis; 3, always vertical - # dist.legend: numeric value that moves axis legends away in inches (first number of mgp argument of par() but in inches thus / 0.2) - # tick.length: length of the ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc. 0 means no tick - # box.type: bty argument of par(). Either "o", "l", "7", "c", "u", "]", the resulting box resembles the corresponding upper case letter. A value of "n" suppresses the box - # amplif.label: increase or decrease the size of the text in legends - # amplif.axis: increase or decrease the size of the scale numbers in axis - # display.extend: extend display beyond plotting region? Either TRUE or FALSE (xpd argument of par() without NA) - # return.par: return graphic parameter modification? - # RETURN - # return graphic parameter modification - # EXAMPLES - # fun_graph_param_prior_plot(param.reinitial = FALSE, xlog.scale = FALSE, ylog.scale = FALSE, remove.label = TRUE, remove.x.axis = TRUE, remove.y.axis = TRUE, std.x.range = TRUE, std.y.range = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 4.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = FALSE) - # DEBUGGING - # param.reinitial = FALSE ; xlog.scale = FALSE ; ylog.scale = FALSE ; remove.label = TRUE ; remove.x.axis = TRUE ; remove.y.axis = TRUE ; std.x.range = TRUE ; std.y.range = TRUE ; down.space = 1 ; left.space = 1 ; up.space = 1 ; right.space = 1 ; orient = 1 ; dist.legend = 4.5 ; tick.length = 0.5 ; box.type = "n" ; amplif.label = 1 ; amplif.axis = 1 ; display.extend = FALSE ; return.par = FALSE # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_graph_param_prior_plot(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = param.reinitial, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = xlog.scale, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = ylog.scale, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = remove.label, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = remove.x.axis, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = remove.y.axis, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = std.x.range, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = std.y.range, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = down.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = left.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = up.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = right.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = orient, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = dist.legend, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = tick.length, mode = "numeric", length = 1, prop = TRUE) ; eval(ee) - tempo <- fun_param_check(data = box.type, options = c("o", "l", "7", "c", "u", "]", "n"), length = 1) ; eval(ee) - tempo <- fun_param_check(data = amplif.label, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = amplif.axis, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = display.extend, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = return.par, class = "logical", length = 1) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - # end argument checking - if(is.null(dev.list())){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_graph_param_prior_plot(): THIS FUNCTION CANNOT BE USED IF NO GRAPHIC DEVICE ALREADY OPENED (dev.list() IS CURRENTLY NULL)\n\n================\n\n") - stop(tempo.cat) - } - if(param.reinitial == TRUE){ - if( ! all(names(dev.cur()) == "null device")){ - active.wind.nb <- dev.cur() - }else{ - active.wind.nb <- 0 - } - if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows - windows() - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code bacause always a tempo window opened - invisible(dev.off()) # close the new window - }else if(Sys.info()["sysname"] == "Linux"){ - if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_graph_param_prior_plot(): THIS FUNCTION CANNOT BE USED ON LINUX WITH param.reinitial SET TO TRUE IF A Rplots.pdf FILE ALREADY EXISTS HERE: ", getwd(), "\n\n================\n\n") - stop(tempo.cat) - }else{ - open.fail <- suppressWarnings(try(X11(), silent = TRUE))[] # try to open a X11 window. If open.fail == NULL, no problem, meaning that the X11 window is opened. If open.fail != NULL, a pdf can be opened here paste0(getwd(), "/Rplots.pdf") - if(is.null(open.fail)){ - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code bacause always a tempo window opened - invisible(dev.off()) # close the new window - }else if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code bacause always a tempo window opened - invisible(dev.off()) # close the new window - file.remove(paste0(getwd(), "/Rplots.pdf")) # remove the pdf file - }else{ - tempo.cat <- ("\n\n================\n\nPROBLEM IN fun_graph_param_prior_plot(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE USE PDF GRAPHIC INTERFACES AND RERUN\n\n================\n\n") - stop(tempo.cat) - } - } - }else{ # macOS - quartz() - ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code bacause always a tempo window opened) - invisible(dev.off()) # close the new window - } - if( ! all(names(dev.cur()) == "null device")){ - dev.set(active.wind.nb) # go back to the active windows if exists - par(ini.par) # apply the initial par to current window - } - } - if(remove.x.axis == TRUE){ - par(xaxt = "n") # suppress the y-axis label - }else{ - par(xaxt = "s") - } - if(remove.y.axis == TRUE){ - par(yaxt = "n") # suppress the y-axis label - }else{ - par(yaxt = "s") - } - if(std.x.range == TRUE){ - par(xaxs = "i") - }else{ - par(xaxs = "r") - } - if(std.y.range == TRUE){ - par(yaxs = "i") - }else{ - par(yaxs = "r") - } - par(mai = c(down.space, left.space, up.space, right.space), ann = ! remove.label, las = orient, mgp = c(dist.legend/0.2, 1, 0), xpd = display.extend, bty= box.type, cex.lab = amplif.label, cex.axis = amplif.axis) - par(tcl = -par()$mgp[2] * tick.length) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) - if(xlog.scale == TRUE){ - par(xaxt = "n", xlog = TRUE) # suppress the x-axis label - }else{ - par(xlog = FALSE) - } - if(ylog.scale == TRUE){ - par(yaxt = "n", ylog = TRUE) # suppress the y-axis label - }else{ - par(ylog = FALSE) - } - if(return.par == TRUE){ - tempo.par <- par() - return(tempo.par) - } -} - - -######## fun_feature_post_plot() #### Graph param after plotting +fun_prior_plot <- function(param.reinitial = FALSE, xlog.scale = FALSE, ylog.scale = FALSE, remove.label = TRUE, remove.x.axis = TRUE, remove.y.axis = TRUE, std.x.range = TRUE, std.y.range = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 3.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = FALSE){ +# AIM +# very convenient to erase the axes for post plot axis redrawing using fun_post_plot() +# reinitialize and set the graphic parameters before plotting +# CANNOT be used if no graphic device already opened +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS +# param.reinitial: reinitialize graphic parameters before applying the new ones, as defined by the other arguments? Either TRUE or FALSE +# xlog.scale: Log scale for the x-axis? Either TRUE or FALSE. If TRUE, erases the x-axis, except legend, for further drawing by fun_post_plot()(xlog argument of par()) +# ylog.scale: Log scale for the y-axis? Either TRUE or FALSE. If TRUE, erases the y-axis, except legend, for further drawing by fun_post_plot()(ylog argument of par()) +# remove.label: remove labels (axis legend) of the two axes? Either TRUE or FALSE (ann argument of par()) +# remove.x.axis: remove x-axis except legend? Either TRUE or FALSE (control the xaxt argument of par()). Automately set to TRUE if xlog.scale == TRUE +# remove.y.axis: remove y-axis except legend? Either TRUE or FALSE (control the yaxt argument of par()). Automately set to TRUE if ylog.scale == TRUE +# std.x.range: standard range on the x-axis? TRUE (no range extend) or FALSE (4% range extend). Controls xaxs argument of par() (TRUE is xaxs = "i", FALSE is xaxs = "r") +# std.y.range: standard range on the y-axis? TRUE (no range extend) or FALSE (4% range extend). Controls yaxs argument of par() (TRUE is yaxs = "i", FALSE is yaxs = "r") +# down.space: lower vertical margin (in inches, mai argument of par()) +# left.space: left horizontal margin (in inches, mai argument of par()) +# up.space: upper vertical margin between plot region and grapical window (in inches, mai argument of par()) +# right.space: right horizontal margin (in inches, mai argument of par()) +# orient: scale number orientation (las argument of par()). 0, always parallel to the axis; 1, always horizontal; 2, always perpendicular to the axis; 3, always vertical +# dist.legend: numeric value that moves axis legends away in inches (first number of mgp argument of par() but in inches thus / 0.2) +# tick.length: length of the ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc. 0 means no tick +# box.type: bty argument of par(). Either "o", "l", "7", "c", "u", "]", the resulting box resembles the corresponding upper case letter. A value of "n" suppresses the box +# amplif.label: increase or decrease the size of the text in legends +# amplif.axis: increase or decrease the size of the scale numbers in axis +# display.extend: extend display beyond plotting region? Either TRUE or FALSE (xpd argument of par() without NA) +# return.par: return graphic parameter modification? +# RETURN +# return graphic parameter modification +# EXAMPLES +# fun_prior_plot(param.reinitial = FALSE, xlog.scale = FALSE, ylog.scale = FALSE, remove.label = TRUE, remove.x.axis = TRUE, remove.y.axis = TRUE, std.x.range = TRUE, std.y.range = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 4.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = FALSE) +# DEBUGGING +# param.reinitial = FALSE ; xlog.scale = FALSE ; ylog.scale = FALSE ; remove.label = TRUE ; remove.x.axis = TRUE ; remove.y.axis = TRUE ; std.x.range = TRUE ; std.y.range = TRUE ; down.space = 1 ; left.space = 1 ; up.space = 1 ; right.space = 1 ; orient = 1 ; dist.legend = 4.5 ; tick.length = 0.5 ; box.type = "n" ; amplif.label = 1 ; amplif.axis = 1 ; display.extend = FALSE ; return.par = FALSE # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = param.reinitial, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = xlog.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = ylog.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = remove.label, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = remove.x.axis, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = remove.y.axis, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = std.x.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = std.y.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = down.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = left.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = up.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = right.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = orient, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = box.type, options = c("o", "l", "7", "c", "u", "]", "n"), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = amplif.label, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = amplif.axis, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = display.extend, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = return.par, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +if(is.null(dev.list())){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIS FUNCTION CANNOT BE USED IF NO GRAPHIC DEVICE ALREADY OPENED (dev.list() IS CURRENTLY NULL)\n\n================\n\n") +stop(tempo.cat) +} +if(param.reinitial == TRUE){ +if( ! all(names(dev.cur()) == "null device")){ +active.wind.nb <- dev.cur() +}else{ +active.wind.nb <- 0 +} +if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows +windows() +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +}else if(Sys.info()["sysname"] == "Linux"){ +if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIS FUNCTION CANNOT BE USED ON LINUX WITH param.reinitial SET TO TRUE IF A Rplots.pdf FILE ALREADY EXISTS HERE: ", getwd(), "\n\n================\n\n") +stop(tempo.cat) +}else{ +open.fail <- suppressWarnings(try(X11(), silent = TRUE))[] # try to open a X11 window. If open.fail == NULL, no problem, meaning that the X11 window is opened. If open.fail != NULL, a pdf can be opened here paste0(getwd(), "/Rplots.pdf") +if(is.null(open.fail)){ +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +}else if(file.exists(paste0(getwd(), "/Rplots.pdf"))){ +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +invisible(dev.off()) # close the new window +file.remove(paste0(getwd(), "/Rplots.pdf")) # remove the pdf file +}else{ +tempo.cat <- ("\n\n================\n\nPROBLEM IN fun_prior_plot(): THIS FUNCTION CANNOT OPEN GUI ON LINUX OR NON MACOS UNIX SYSTEM (X GRAPHIC INTERFACE HAS TO BE SET).\nTO OVERCOME THIS, PLEASE USE PDF GRAPHIC INTERFACES AND RERUN\n\n================\n\n") +stop(tempo.cat) +} +} +}else{ # macOS +quartz() +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened) +invisible(dev.off()) # close the new window +} +if( ! all(names(dev.cur()) == "null device")){ +dev.set(active.wind.nb) # go back to the active windows if exists +par(ini.par) # apply the initial par to current window +} +} +if(remove.x.axis == TRUE){ +par(xaxt = "n") # suppress the y-axis label +}else{ +par(xaxt = "s") +} +if(remove.y.axis == TRUE){ +par(yaxt = "n") # suppress the y-axis label +}else{ +par(yaxt = "s") +} +if(std.x.range == TRUE){ +par(xaxs = "i") +}else{ +par(xaxs = "r") +} +if(std.y.range == TRUE){ +par(yaxs = "i") +}else{ +par(yaxs = "r") +} +par(mai = c(down.space, left.space, up.space, right.space), ann = ! remove.label, las = orient, mgp = c(dist.legend/0.2, 1, 0), xpd = display.extend, bty= box.type, cex.lab = amplif.label, cex.axis = amplif.axis) +par(tcl = -par()$mgp[2] * tick.length) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) +if(xlog.scale == TRUE){ +par(xaxt = "n", xlog = TRUE) # suppress the x-axis label +}else{ +par(xlog = FALSE) +} +if(ylog.scale == TRUE){ +par(yaxt = "n", ylog = TRUE) # suppress the y-axis label +}else{ +par(ylog = FALSE) +} +if(return.par == TRUE){ +tempo.par <- par() +return(tempo.par) +} +} + + +######## fun_post_plot() #### Graph param after plotting # Check OK: clear to go Apollo -fun_feature_post_plot <- function(x.side = 0, x.log.scale = FALSE, x.categ = NULL, x.categ.pos = NULL, x.lab = "", x.axis.magnific = 1.5, x.label.magnific = 1.5, x.dist.legend = 0.5, x.nb.inter.tick = 1, y.side = 0, y.log.scale = FALSE, y.categ = NULL, y.categ.pos = NULL, y.lab = "", y.axis.magnific = 1.5, y.label.magnific = 1.5, y.dist.legend = 0.5, y.nb.inter.tick = 1, text.angle = 90, tick.length = 0.5, sec.tick.length = 0.3, bg.color = NULL, grid.lwd = NULL, grid.col = "white", corner.text = "", magnific.corner.text = 1, just.label.add = FALSE, par.reset = FALSE, custom.par = NULL){ - # AIM: - # redesign axis. If x.side = 0, y.side = 0, the function just adds text at topright of the graph and reset par() for next graphics and provides outputs (see below) - # provide also positions for legend or additional text on the graph - # use fun_graph_param_prior_plot() before this function for initial inactivation of the axis drawings - # REQUIRED FUNCTIONS - # fun_param_check() - # fun_open_window() to reinitialize graph parameters if par.reset = TRUE and custom.par = NULL - # ARGUMENTS - # x.side: axis at the bottom (1) or top (3) of the region figure. Write 0 for no change - # x.log.scale: Log scale for the x-axis? Either TRUE or FALSE - # x.categ: character vector representing the classes (levels()) to specify when the x-axis is qualititative(stripchart, boxplot) - # x.categ.pos: position of the classes names (numeric vector of identical length than x.categ). If left NULL, this will be 1:length(levels()) - # x.lab: label of the x-axis. If x.side == 0 and x.lab != "", then x.lab is printed - # x.axis.magnific: increase or decrease the value to increase or decrease the size of the x axis numbers. Also control the size of displayed categories - # x.label.magnific: increase or decrease the value to increase or decrease the size of the x axis legend - # x.dist.legend: increase the number to move x-axis legends away in inches (first number of mgp argument of par() but in inches) - # x.nb.inter.tick: number of secondary ticks between main ticks on x-axis (only if not log scale). 0 means no secondary ticks - # y.side: axis at the left (2) or right (4) of the region figure. Write 0 for no change - # y.log.scale: Log scale for the y-axis? Either TRUE or FALSE - # y.categ: classes (levels()) to specify when the y-axis is qualititative(stripchart, boxplot) - # y.categ.pos: position of the classes names (numeric vector of identical length than y.categ). If left NULL, this will be 1:length(levels()) - # y.lab: label of the y-axis. If y.side == 0 and y.lab != "", then y.lab is printed - # y.axis.magnific: increase or decrease the value to increase or decrease the size of the y axis numbers. Also control the size of displayed categories - # y.label.magnific: increase or decrease the value to increase or decrease the size of the y axis legend - # y.dist.legend: increase the number to move y-axis legends away in inches (first number of mgp argument of par() but in inches) - # y.nb.inter.tick: number of secondary ticks between main ticks on y-axis (only if not log scale). 0 means non secondary ticks - # text.angle: angle of the text when axis is qualitative - # tick.length: length of the main ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) - # sec.tick.length: length of the secondary ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) - # bg.color: background color of the plot region. NULL for no color. BEWARE: cover/hide an existing plot ! - # grid.lwd: if non NULL, activate the grid line (specify the line width) - # grid.col: grid line color (only if grid.lwd non NULL) - # corner.text: text to add at the top right corner of the window - # magnific.corner.text: increase or decrease the size of the text - # par.reset: to reset all the graphics parameters. BEWARE: TRUE can generate display problems, mainly in graphic devices with multiple figure regions - # just.label.add: just add axis labels (legend)? Either TRUE or FALSE. If TRUE, at least (x.side == 0 & x.lab != "") or (y.side == 0 & y.lab != "") must be set to display the corresponding x.lab or y.lab - # custom.par: list that provides the parameters that reset all the graphics parameters. BEWARE: if NULL and par.reset == TRUE, the default par() parameters are used - # RETURN - # a list containing: - # $x.mid.left.dev.region: middle of the left margin of the device region, in coordinates of the x-axis - # $x.left.dev.region: left side of the left margin (including the potential margin of the device region), in coordinates of the x-axis - # $x.mid.right.dev.region: middle of the right margin of the device region, in coordinates of the x-axis - # $x.right.dev.region: right side of the right margin (including the potential margin of the device region), in coordinates of the x-axis - # $x.mid.left.fig.region: middle of the left margin of the figure region, in coordinates of the x-axis - # $x.left.fig.region: left side of the left margin, in coordinates of the x-axis - # $x.mid.right.fig.region: middle of the right margin of the figure region, in coordinates of the x-axis - # $x.right.fig.region: right side of the right margin, in coordinates of the x-axis - # $x.left.plot.region: left side of the plot region, in coordinates of the x-axis - # $x.right.plot.region: right side of the plot region, in coordinates of the x-axis - # $x.mid.plot.region: middle of the plot region, in coordinates of the x-axis - # $y.mid.bottom.dev.region: middle of the bottom margin of the device region, in coordinates of the y-axis - # $y.bottom.dev.region: bottom side of the bottom margin (including the potential margin of the device region), in coordinates of the y-axis - # $y.mid.top.dev.region: middle of the top margin of the device region, in coordinates of the y-axis - # $y.top.dev.region: top side of the top margin (including the potential margin of the device region), in coordinates of the y-axis - # $y.mid.bottom.fig.region: middle of the bottom margin of the figure region, in coordinates of the y-axis - # $y.bottom.fig.region: bottom of the bottom margin of the figure region, in coordinates of the y-axis - # $y.mid.top.fig.region: middle of the top margin of the figure region, in coordinates of the y-axis - # $y.top.fig.region: top of the top margin of the figure region, in coordinates of the y-axis - # $y.top.plot.region: top of the plot region, in coordinates of the y-axis - # $y.bottom.plot.region: bottom of the plot region, in coordinates of the y-axis - # $y.mid.plot.region: middle of the plot region, in coordinates of the y-axis - # $text: warning text - # EXAMPLES - # Example of log axis with log y-axis and unmodified x-axis: - # prior.par <- fun_graph_param_prior_plot(param.reinitial = TRUE, xlog.scale = FALSE, ylog.scale = TRUE, remove.label = TRUE, remove.x.axis = FALSE, remove.y.axis = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 0.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = TRUE) ; plot(1:100, log = "y") ; fun_feature_post_plot(y.side = 2, y.log.scale = prior.par$ylog, x.lab = "Values", y.lab = "TEST", y.axis.magnific = 1.25, y.label.magnific = 1.5, y.dist.legend = 0.7, just.label.add = ! prior.par$ann) - # Example of log axis with redrawn x-axis and y-axis: - # prior.par <- fun_graph_param_prior_plot(param.reinitial = TRUE) ; plot(1:100) ; fun_feature_post_plot(x.side = 1, x.lab = "Values", y.side = 2, y.lab = "TEST", y.axis.magnific = 1, y.label.magnific = 2, y.dist.legend = 0.6) - # example with margins in the device region: - # windows(5,5) ; par(mai=c(0.5,0.5,0.5,0.5), omi = c(0.25,0.25,1,0.25), xaxs = "i", yaxs = "i") ; plot(0:10) ; a <- fun_feature_post_plot(x.side = 0, y.side = 0) ; x <- c(a$x.mid.left.dev.region, a$x.left.dev.region, a$x.mid.right.dev.region, a$x.right.dev.region, a$x.mid.left.fig.region, a$x.left.fig.region, a$x.mid.right.fig.region, a$x.right.fig.region, a$x.right.plot.region, a$x.left.plot.region, a$x.mid.plot.region) ; y <- c(a$y.mid.bottom.dev.region, a$y.bottom.dev.region, a$y.mid.top.dev.region, a$y.top.dev.region, a$y.mid.bottom.fig.region, a$y.bottom.fig.region, a$y.mid.top.fig.region, a$y.top.fig.region, a$y.top.plot.region, a$y.bottom.plot.region, a$y.mid.plot.region) ; par(xpd = NA) ; points(x = rep(5, length(y)), y = y, pch = 16, col = "red") ; text(x = rep(5, length(y)), y = y, c("y.mid.bottom.dev.region", "y.bottom.dev.region", "y.mid.top.dev.region", "y.top.dev.region", "y.mid.bottom.fig.region", "y.bottom.fig.region", "y.mid.top.fig.region", "y.top.fig.region", "y.top.plot.region", "y.bottom.plot.region", "y.mid.plot.region"), cex = 0.65, col = grey(0.25)) ; points(y = rep(5, length(x)), x = x, pch = 16, col = "blue") ; text(y = rep(5, length(x)), x = x, c("x.mid.left.dev.region", "x.left.dev.region", "x.mid.right.dev.region", "x.right.dev.region", "x.mid.left.fig.region", "x.left.fig.region", "x.mid.right.fig.region", "x.right.fig.region", "x.right.plot.region", "x.left.plot.region", "x.mid.plot.region"), cex = 0.65, srt = 90, col = grey(0.25)) - # DEBUGGING - # x.side = 0 ; x.log.scale = FALSE ; x.categ = NULL ; x.categ.pos = NULL ; x.lab = "" ; x.axis.magnific = 1.5 ; x.label.magnific = 1.5 ; x.dist.legend = 1 ; x.nb.inter.tick = 1 ; y.side = 0 ; y.log.scale = FALSE ; y.categ = NULL ; y.categ.pos = NULL ; y.lab = "" ; y.axis.magnific = 1.5 ; y.label.magnific = 1.5 ; y.dist.legend = 0.7 ; y.nb.inter.tick = 1 ; text.angle = 90 ; tick.length = 0.5 ; sec.tick.length = 0.3 ; bg.color = NULL ; grid.lwd = NULL ; grid.col = "white" ; corner.text = "" ; magnific.corner.text = 1 ; just.label.add = FALSE ; par.reset = FALSE ; custom.par = NULL # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_feature_post_plot(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - if(length(find("fun_open_window", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_feature_post_plot(): REQUIRED fun_open_window() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = x.side, options = c(0, 1, 3), length = 1) ; eval(ee) - tempo <- fun_param_check(data = x.log.scale, class = "logical", length = 1) ; eval(ee) - if( ! is.null(x.categ)){ - tempo <- fun_param_check(data = x.categ, class = "character", na.contain = TRUE) ; eval(ee) - } - if( ! is.null(x.categ.pos)){ - tempo <- fun_param_check(data = x.categ.pos, mode = "numeric") ; eval(ee) - } - tempo <- fun_param_check(data = x.lab, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = x.axis.magnific, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = x.label.magnific, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = x.dist.legend, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = x.nb.inter.tick, typeof = "integer", length = 1, double.as.integer.allowed = TRUE) ; eval(ee) - tempo <- fun_param_check(data = y.side, options = c(0, 2, 4), length = 1) ; eval(ee) - tempo <- fun_param_check(data = y.log.scale, class = "logical", length = 1) ; eval(ee) - if( ! is.null(y.categ)){ - tempo <- fun_param_check(data = y.categ, class = "character", na.contain = TRUE) ; eval(ee) - } - if( ! is.null(y.categ.pos)){ - tempo <- fun_param_check(data = y.categ.pos, mode = "numeric") ; eval(ee) - } - tempo <- fun_param_check(data = y.lab, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = y.axis.magnific, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = y.label.magnific, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = y.dist.legend, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = y.nb.inter.tick, typeof = "integer", length = 1, double.as.integer.allowed = TRUE) ; eval(ee) - tempo <- fun_param_check(data = text.angle, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = tick.length, mode = "numeric", length = 1, prop = TRUE) ; eval(ee) - tempo <- fun_param_check(data = sec.tick.length, mode = "numeric", length = 1, prop = TRUE) ; eval(ee) - if( ! is.null(bg.color)){ - tempo <- fun_param_check(data = bg.color, class = "character", length = 1) ; eval(ee) - if( ! (bg.color %in% colors() | grepl(pattern = "^#", bg.color))){ # check color - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_feature_post_plot(): bg.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # OR A COLOR NAME GIVEN BY colors()\n\n================\n\n") - stop(tempo.cat) - } - } - if( ! is.null(grid.lwd)){ - tempo <- fun_param_check(data = grid.lwd, mode = "numeric", neg.values = FALSE) ; eval(ee) - } - if( ! is.null(grid.col)){ - tempo <- fun_param_check(data = grid.col, class = "character", length = 1) ; eval(ee) - if( ! (grid.col %in% colors() | grepl(pattern = "^#", grid.col))){ # check color - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_feature_post_plot(): grid.col ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # OR A COLOR NAME GIVEN BY colors()\n\n================\n\n") - stop(tempo.cat) - } - } - tempo <- fun_param_check(data = corner.text, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = magnific.corner.text, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = just.label.add, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = par.reset, class = "logical", length = 1) ; eval(ee) - if( ! is.null(custom.par)){ - tempo <- fun_param_check(data = custom.par, typeof = "list", length = 1) ; eval(ee) - } - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - # end argument checking - text <- NULL - par(tcl = -par()$mgp[2] * tick.length) - if(x.log.scale == TRUE){ - grid.coord.x <- c(10^par("usr")[1], 10^par("usr")[2]) - }else{ - grid.coord.x <- c(par("usr")[1], par("usr")[2]) - } - if(y.log.scale == TRUE){ - grid.coord.y <- c(10^par("usr")[3], 10^par("usr")[4]) - }else{ - grid.coord.y <- c(par("usr")[3], par("usr")[4]) - } - if( ! is.null(bg.color)){ - rect(grid.coord.x[1], grid.coord.y[1], grid.coord.x[2], grid.coord.y[2], col = bg.color, border = NA) - } - if( ! is.null(grid.lwd)){ - grid(nx = NA, ny = NULL, col = grid.col, lty = 1, lwd = grid.lwd) - } - if(x.log.scale == TRUE){ - x.mid.left.dev.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) - x.left.dev.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) # in x coordinates - x.mid.right.dev.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) - x.right.dev.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2])) # in x coordinates - x.mid.left.fig.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) - x.left.fig.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1]) # in x coordinates - x.mid.right.fig.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) - x.right.fig.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2])) # in x coordinates - x.left.plot.region <- 10^par("usr")[1] # in x coordinates, left of the plot region (according to x scale) - x.right.plot.region <- 10^par("usr")[2] # in x coordinates, right of the plot region (according to x scale) - x.mid.plot.region <- 10^((par("usr")[2] + par("usr")[1]) / 2) # in x coordinates, right of the plot region (according to x scale) - }else{ - x.mid.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) - x.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) # in x coordinates - x.mid.right.dev.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) - x.right.dev.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2])) # in x coordinates - x.mid.left.fig.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) - x.left.fig.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1]) # in x coordinates - x.mid.right.fig.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) - x.right.fig.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2])) # in x coordinates - x.left.plot.region <- par("usr")[1] # in x coordinates, left of the plot region (according to x scale) - x.right.plot.region <- par("usr")[2] # in x coordinates, right of the plot region (according to x scale) - x.mid.plot.region <- (par("usr")[2] + par("usr")[1]) / 2 # in x coordinates, right of the plot region (according to x scale) - } - if(y.log.scale == TRUE){ - y.mid.bottom.dev.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (par("omd")[3] / 2)) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space - y.bottom.dev.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * par("omd")[3]) # in y coordinates - y.mid.top.dev.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space - y.top.dev.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) # in y coordinates - y.mid.bottom.fig.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] / 2) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space - y.bottom.fig.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3]) # in y coordinates - y.mid.top.fig.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space - y.top.fig.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4])) # in y coordinates - y.top.plot.region <- 10^par("usr")[4] # in y coordinates, top of the plot region (according to y scale) - y.bottom.plot.region <- 10^par("usr")[3] # in y coordinates, bottom of the plot region (according to y scale) - y.mid.plot.region <- (par("usr")[3] + par("usr")[4]) / 2 # in x coordinates, right of the plot region (according to x scale) - }else{ - y.mid.bottom.dev.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (par("omd")[3] / 2)) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space - y.bottom.dev.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * par("omd")[3]) # in y coordinates - y.mid.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space - y.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) # in y coordinates - y.mid.bottom.fig.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] / 2) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space - y.bottom.fig.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3]) # in y coordinates - y.mid.top.fig.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space - y.top.fig.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4])) # in y coordinates - y.top.plot.region <- par("usr")[4] # in y coordinates, top of the plot region (according to y scale) - y.bottom.plot.region <- par("usr")[3] # in y coordinates, bottom of the plot region (according to y scale) - y.mid.plot.region <- ((par("usr")[3] + par("usr")[4]) / 2) # in x coordinates, right of the plot region (according to x scale) - } - if(x.side == 1 | x.side == 3){ - par(xpd=FALSE, xaxt="s") - if(is.null(x.categ) & x.log.scale == TRUE){ - if(any(par()$xaxp[1:2] == 0)){ - if(par()$xaxp[1] == 0){ - par(xaxp = c(10^-30, par()$xaxp[2:3])) # because log10(par()$xaxp[1] == 0) == -Inf - } - if(par()$xaxp[2] == 0){ - par(xaxp = c(par()$xaxp[1], 10^-30, par()$xaxp[3])) # because log10(par()$xaxp[2] == 0) == -Inf - } - } - axis(side=x.side, at=c(10^par()$usr[1], 10^par()$usr[2]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line - mtext(side = x.side, text = x.lab, line = x.dist.legend / 0.2, las = 0, cex = x.label.magnific) - par(tcl = -par()$mgp[2] * sec.tick.length) # length of the secondary ticks are reduced - suppressWarnings(rug(10^outer(c((log10(par("xaxp")[1]) -1):log10(par("xaxp")[2])), log10(1:10), "+"), ticksize = NA, side = x.side)) # ticksize = NA to allow the use of par()$tcl value - par(tcl = -par()$mgp[2] * tick.length) # back to main ticks - axis(side = x.side, at = c(1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10), labels = expression(10^-15, 10^-14, 10^-13, 10^-12, 10^-11, 10^-10, 10^-9, 10^-8, 10^-7, 10^-6, 10^-5, 10^-4, 10^-3, 10^-2, 10^-1, 10^0, 10^1, 10^2, 10^3, 10^4, 10^5, 10^6, 10^7, 10^8, 10^9, 10^10), lwd = 0, lwd.ticks = 1, cex.axis = x.axis.magnific) - x.text <- 10^par("usr")[2] - }else if(is.null(x.categ) & x.log.scale == FALSE){ - axis(side=x.side, at=c(par()$usr[1], par()$usr[2]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line - axis(side=x.side, at=round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), cex.axis = x.axis.magnific) # axis(side=x.side, at=round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), labels = format(round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), big.mark=','), cex.axis = x.axis.magnific) # to get the 1000 comma separator - mtext(side = x.side, text = x.lab, line = x.dist.legend / 0.2, las = 0, cex = x.label.magnific) - if(x.nb.inter.tick > 0){ - inter.tick.unit <- (par("xaxp")[2] - par("xaxp")[1]) / par("xaxp")[3] - par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced - suppressWarnings(rug(seq(par("xaxp")[1] - 10 * inter.tick.unit, par("xaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + x.nb.inter.tick)), ticksize = NA, x.side)) # ticksize = NA to allow the use of par()$tcl value - par(tcl = -par()$mgp[2] * tick.length) # back to main ticks - } - x.text <- par("usr")[2] - }else if(( ! is.null(x.categ)) & x.log.scale == FALSE){ - if(is.null(x.categ.pos)){ - x.categ.pos <- 1:length(x.categ) - }else if(length(x.categ.pos) != length(x.categ)){ - stop("\n\nPROBLEM: x.categ.pos MUST BE THE SAME LENGTH AS x.categ\n\n") - } - par(xpd = TRUE) - if(x.side == 1){ - segments(x0 = x.left.plot.region, x1 = x.right.plot.region, y0 = y.bottom.plot.region, y1 = y.bottom.plot.region) # draw the line of the axis - text(x = x.categ.pos, y = y.mid.bottom.fig.region, labels = x.categ, srt = text.angle, cex = x.axis.magnific) - }else if(x.side == 3){ - segments(x0 = x.left.plot.region, x1 = x.right.plot.region, y0 = y.top.plot.region, y1 = y.top.plot.region) # draw the line of the axis - text(x = x.categ.pos, y = y.mid.top.fig.region, labels = x.categ, srt = text.angle, cex = x.axis.magnific) - }else{ - stop("\n\nARGUMENT x.side CAN ONLY BE 1 OR 3\n\n") - } - par(xpd = FALSE) - x.text <- par("usr")[2] - }else{ - stop("\n\nPROBLEM WITH THE x.side (", x.side ,") OR x.log.scale (", x.log.scale,") ARGUMENTS\n\n") - } - }else{ - x.text <- par("usr")[2] - } - if(y.side == 2 | y.side == 4){ - par(xpd=FALSE, yaxt="s") - if(is.null(y.categ) & y.log.scale == TRUE){ - if(any(par()$yaxp[1:2] == 0)){ - if(par()$yaxp[1] == 0){ - par(yaxp = c(10^-30, par()$yaxp[2:3])) # because log10(par()$yaxp[1] == 0) == -Inf - } - if(par()$yaxp[2] == 0){ - par(yaxp = c(par()$yaxp[1], 10^-30, par()$yaxp[3])) # because log10(par()$yaxp[2] == 0) == -Inf - } - } - axis(side=y.side, at=c(10^par()$usr[3], 10^par()$usr[4]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line - par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced - suppressWarnings(rug(10^outer(c((log10(par("yaxp")[1])-1):log10(par("yaxp")[2])), log10(1:10), "+"), ticksize = NA, side = y.side)) # ticksize = NA to allow the use of par()$tcl value - par(tcl = -par()$mgp[2] * tick.length) # back to main tick length - axis(side = y.side, at = c(1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10), labels = expression(10^-15, 10^-14, 10^-13, 10^-12, 10^-11, 10^-10, 10^-9, 10^-8, 10^-7, 10^-6, 10^-5, 10^-4, 10^-3, 10^-2, 10^-1, 10^0, 10^1, 10^2, 10^3, 10^4, 10^5, 10^6, 10^7, 10^8, 10^9, 10^10), lwd = 0, lwd.ticks = 1, cex.axis = y.axis.magnific) - y.text <- 10^(par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) - mtext(side = y.side, text = y.lab, line = y.dist.legend / 0.2, las = 0, cex = y.label.magnific) - }else if(is.null(y.categ) & y.log.scale == FALSE){ - axis(side=y.side, at=c(par()$usr[3], par()$usr[4]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line - axis(side=y.side, at=round(seq(par()$yaxp[1], par()$yaxp[2], length.out=par()$yaxp[3]+1), 2), cex.axis = y.axis.magnific) - mtext(side = y.side, text = y.lab, line = y.dist.legend / 0.2, las = 0, cex = y.label.magnific) - if(y.nb.inter.tick > 0){ - inter.tick.unit <- (par("yaxp")[2] - par("yaxp")[1]) / par("yaxp")[3] - par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced - suppressWarnings(rug(seq(par("yaxp")[1] - 10 * inter.tick.unit, par("yaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + y.nb.inter.tick)), ticksize = NA, side=y.side)) # ticksize = NA to allow the use of par()$tcl value - par(tcl = -par()$mgp[2] * tick.length) # back to main tick length - } - y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) - }else if(( ! is.null(y.categ)) & y.log.scale == FALSE){ - if(is.null(y.categ.pos)){ - y.categ.pos <- 1:length(y.categ) - }else if(length(y.categ.pos) != length(y.categ)){ - stop("\n\nPROBLEM: y.categ.pos MUST BE THE SAME LENGTH AS y.categ\n\n") - } - axis(side = y.side, at = y.categ.pos, labels = rep("", length(y.categ)), lwd=0, lwd.ticks=1) # draw the line of the axis - par(xpd = TRUE) - if(y.side == 2){ - text(x = x.mid.left.fig.region, y = y.categ.pos, labels = y.categ, srt = text.angle, cex = y.axis.magnific) - }else if(y.side == 4){ - text(x = x.mid.right.fig.region, y = y.categ.pos, labels = y.categ, srt = text.angle, cex = y.axis.magnific) - }else{ - stop("\n\nARGUMENT y.side CAN ONLY BE 2 OR 4\n\n") - } - par(xpd = FALSE) - y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) - }else{ - stop("\n\nPROBLEM WITH THE y.side (", y.side ,") OR y.log.scale (", y.log.scale,") ARGUMENTS\n\n") - } - }else{ - y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) - } - par(xpd=NA) - text(x = x.mid.right.fig.region, y = y.text, corner.text, adj=c(1, 1.1), cex = magnific.corner.text) # text at the topright corner. Replace x.right.fig.region by x.text if text at the right edge of the plot region - if(just.label.add == TRUE & x.side == 0 & x.lab != ""){ - text(x = x.mid.plot.region, y = y.mid.bottom.fig.region, x.lab, adj=c(0.5, 0.5), cex = x.label.magnific) # x label - } - if(just.label.add == TRUE & y.side == 0 & y.lab != ""){ - text(x = y.mid.plot.region, y = x.mid.left.fig.region, y.lab, adj=c(0.5, 0.5), cex = y.label.magnific) # x label - } - par(xpd=FALSE) - if(par.reset == TRUE){ - tempo.par <- fun_open_window(pdf.disp = FALSE, return.output = TRUE) - invisible(dev.off()) # close the new window - if( ! is.null(custom.par)){ - if( ! names(custom.par) %in% names(tempo.par$ini.par)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_feature_post_plot(): custom.par ARGUMENT SHOULD HAVE THE NAMES OF THE COMPARTMENT LIST COMING FROM THE par() LIST\n\n================\n\n") - stop(tempo.cat) - } - par(custom.par) - text <- c(text, "\nGRAPH PARAMETERS SET TO VALUES DEFINED BY custom.par ARGUMENT\n") - }else{ - par(tempo.par$ini.par) - text <- c(text, "\nGRAPH PARAMETERS RESET TO par() DEFAULT VALUES\n") - } - } - output <- list(x.mid.left.dev.region = x.mid.left.dev.region, x.left.dev.region = x.left.dev.region, x.mid.right.dev.region = x.mid.right.dev.region, x.right.dev.region = x.right.dev.region, x.mid.left.fig.region = x.mid.left.fig.region, x.left.fig.region = x.left.fig.region, x.mid.right.fig.region = x.mid.right.fig.region, x.right.fig.region = x.right.fig.region, x.left.plot.region = x.left.plot.region, x.right.plot.region = x.right.plot.region, x.mid.plot.region = x.mid.plot.region, y.mid.bottom.dev.region = y.mid.bottom.dev.region, y.bottom.dev.region = y.bottom.dev.region, y.mid.top.dev.region = y.mid.top.dev.region, y.top.dev.region = y.top.dev.region, y.mid.bottom.fig.region = y.mid.bottom.fig.region, y.bottom.fig.region = y.bottom.fig.region, y.mid.top.fig.region = y.mid.top.fig.region, y.top.fig.region = y.top.fig.region, y.top.plot.region = y.top.plot.region, y.bottom.plot.region = y.bottom.plot.region, y.mid.plot.region = y.mid.plot.region, text = text) - return(output) +fun_post_plot <- function(x.side = 0, x.log.scale = FALSE, x.categ = NULL, x.categ.pos = NULL, x.lab = "", x.axis.magnific = 1.5, x.label.magnific = 1.5, x.dist.legend = 0.5, x.nb.inter.tick = 1, y.side = 0, y.log.scale = FALSE, y.categ = NULL, y.categ.pos = NULL, y.lab = "", y.axis.magnific = 1.5, y.label.magnific = 1.5, y.dist.legend = 0.5, y.nb.inter.tick = 1, text.angle = 90, tick.length = 0.5, sec.tick.length = 0.3, bg.color = NULL, grid.lwd = NULL, grid.col = "white", corner.text = "", magnific.corner.text = 1, just.label.add = FALSE, par.reset = FALSE, custom.par = NULL){ +# AIM +# redesign axis. If x.side = 0, y.side = 0, the function just adds text at topright of the graph and reset par() for next graphics and provides outputs (see below) +# provide also positions for legend or additional text on the graph +# use fun_prior_plot() before this function for initial inactivation of the axis drawings +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# fun_open_window() to reinitialize graph parameters if par.reset = TRUE and custom.par = NULL +# ARGUMENTS +# x.side: axis at the bottom (1) or top (3) of the region figure. Write 0 for no change +# x.log.scale: Log scale for the x-axis? Either TRUE or FALSE +# x.categ: character vector representing the classes (levels()) to specify when the x-axis is qualititative(stripchart, boxplot) +# x.categ.pos: position of the classes names (numeric vector of identical length than x.categ). If left NULL, this will be 1:length(levels()) +# x.lab: label of the x-axis. If x.side == 0 and x.lab != "", then x.lab is printed +# x.axis.magnific: increase or decrease the value to increase or decrease the size of the x axis numbers. Also control the size of displayed categories +# x.label.magnific: increase or decrease the value to increase or decrease the size of the x axis legend +# x.dist.legend: increase the number to move x-axis legends away in inches (first number of mgp argument of par() but in inches) +# x.nb.inter.tick: number of secondary ticks between main ticks on x-axis (only if not log scale). 0 means no secondary ticks +# y.side: axis at the left (2) or right (4) of the region figure. Write 0 for no change +# y.log.scale: Log scale for the y-axis? Either TRUE or FALSE +# y.categ: classes (levels()) to specify when the y-axis is qualititative(stripchart, boxplot) +# y.categ.pos: position of the classes names (numeric vector of identical length than y.categ). If left NULL, this will be 1:length(levels()) +# y.lab: label of the y-axis. If y.side == 0 and y.lab != "", then y.lab is printed +# y.axis.magnific: increase or decrease the value to increase or decrease the size of the y axis numbers. Also control the size of displayed categories +# y.label.magnific: increase or decrease the value to increase or decrease the size of the y axis legend +# y.dist.legend: increase the number to move y-axis legends away in inches (first number of mgp argument of par() but in inches) +# y.nb.inter.tick: number of secondary ticks between main ticks on y-axis (only if not log scale). 0 means non secondary ticks +# text.angle: angle of the text when axis is qualitative +# tick.length: length of the main ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) +# sec.tick.length: length of the secondary ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) +# bg.color: background color of the plot region. NULL for no color. BEWARE: cover/hide an existing plot ! +# grid.lwd: if non NULL, activate the grid line (specify the line width) +# grid.col: grid line color (only if grid.lwd non NULL) +# corner.text: text to add at the top right corner of the window +# magnific.corner.text: increase or decrease the size of the text +# par.reset: to reset all the graphics parameters. BEWARE: TRUE can generate display problems, mainly in graphic devices with multiple figure regions +# just.label.add: just add axis labels (legend)? Either TRUE or FALSE. If TRUE, at least (x.side == 0 & x.lab != "") or (y.side == 0 & y.lab != "") must be set to display the corresponding x.lab or y.lab +# custom.par: list that provides the parameters that reset all the graphics parameters. BEWARE: if NULL and par.reset == TRUE, the default par() parameters are used +# RETURN +# a list containing: +# $x.mid.left.dev.region: middle of the left margin of the device region, in coordinates of the x-axis +# $x.left.dev.region: left side of the left margin (including the potential margin of the device region), in coordinates of the x-axis +# $x.mid.right.dev.region: middle of the right margin of the device region, in coordinates of the x-axis +# $x.right.dev.region: right side of the right margin (including the potential margin of the device region), in coordinates of the x-axis +# $x.mid.left.fig.region: middle of the left margin of the figure region, in coordinates of the x-axis +# $x.left.fig.region: left side of the left margin, in coordinates of the x-axis +# $x.mid.right.fig.region: middle of the right margin of the figure region, in coordinates of the x-axis +# $x.right.fig.region: right side of the right margin, in coordinates of the x-axis +# $x.left.plot.region: left side of the plot region, in coordinates of the x-axis +# $x.right.plot.region: right side of the plot region, in coordinates of the x-axis +# $x.mid.plot.region: middle of the plot region, in coordinates of the x-axis +# $y.mid.bottom.dev.region: middle of the bottom margin of the device region, in coordinates of the y-axis +# $y.bottom.dev.region: bottom side of the bottom margin (including the potential margin of the device region), in coordinates of the y-axis +# $y.mid.top.dev.region: middle of the top margin of the device region, in coordinates of the y-axis +# $y.top.dev.region: top side of the top margin (including the potential margin of the device region), in coordinates of the y-axis +# $y.mid.bottom.fig.region: middle of the bottom margin of the figure region, in coordinates of the y-axis +# $y.bottom.fig.region: bottom of the bottom margin of the figure region, in coordinates of the y-axis +# $y.mid.top.fig.region: middle of the top margin of the figure region, in coordinates of the y-axis +# $y.top.fig.region: top of the top margin of the figure region, in coordinates of the y-axis +# $y.top.plot.region: top of the plot region, in coordinates of the y-axis +# $y.bottom.plot.region: bottom of the plot region, in coordinates of the y-axis +# $y.mid.plot.region: middle of the plot region, in coordinates of the y-axis +# $text: warning text +# EXAMPLES +# Example of log axis with log y-axis and unmodified x-axis: +# prior.par <- fun_prior_plot(param.reinitial = TRUE, xlog.scale = FALSE, ylog.scale = TRUE, remove.label = TRUE, remove.x.axis = FALSE, remove.y.axis = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 0.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = TRUE) ; plot(1:100, log = "y") ; fun_post_plot(y.side = 2, y.log.scale = prior.par$ylog, x.lab = "Values", y.lab = "TEST", y.axis.magnific = 1.25, y.label.magnific = 1.5, y.dist.legend = 0.7, just.label.add = ! prior.par$ann) +# Example of log axis with redrawn x-axis and y-axis: +# prior.par <- fun_prior_plot(param.reinitial = TRUE) ; plot(1:100) ; fun_post_plot(x.side = 1, x.lab = "Values", y.side = 2, y.lab = "TEST", y.axis.magnific = 1, y.label.magnific = 2, y.dist.legend = 0.6) +# example with margins in the device region: +# windows(5,5) ; par(mai=c(0.5,0.5,0.5,0.5), omi = c(0.25,0.25,1,0.25), xaxs = "i", yaxs = "i") ; plot(0:10) ; a <- fun_post_plot(x.side = 0, y.side = 0) ; x <- c(a$x.mid.left.dev.region, a$x.left.dev.region, a$x.mid.right.dev.region, a$x.right.dev.region, a$x.mid.left.fig.region, a$x.left.fig.region, a$x.mid.right.fig.region, a$x.right.fig.region, a$x.right.plot.region, a$x.left.plot.region, a$x.mid.plot.region) ; y <- c(a$y.mid.bottom.dev.region, a$y.bottom.dev.region, a$y.mid.top.dev.region, a$y.top.dev.region, a$y.mid.bottom.fig.region, a$y.bottom.fig.region, a$y.mid.top.fig.region, a$y.top.fig.region, a$y.top.plot.region, a$y.bottom.plot.region, a$y.mid.plot.region) ; par(xpd = NA) ; points(x = rep(5, length(y)), y = y, pch = 16, col = "red") ; text(x = rep(5, length(y)), y = y, c("y.mid.bottom.dev.region", "y.bottom.dev.region", "y.mid.top.dev.region", "y.top.dev.region", "y.mid.bottom.fig.region", "y.bottom.fig.region", "y.mid.top.fig.region", "y.top.fig.region", "y.top.plot.region", "y.bottom.plot.region", "y.mid.plot.region"), cex = 0.65, col = grey(0.25)) ; points(y = rep(5, length(x)), x = x, pch = 16, col = "blue") ; text(y = rep(5, length(x)), x = x, c("x.mid.left.dev.region", "x.left.dev.region", "x.mid.right.dev.region", "x.right.dev.region", "x.mid.left.fig.region", "x.left.fig.region", "x.mid.right.fig.region", "x.right.fig.region", "x.right.plot.region", "x.left.plot.region", "x.mid.plot.region"), cex = 0.65, srt = 90, col = grey(0.25)) +# DEBUGGING +# x.side = 0 ; x.log.scale = FALSE ; x.categ = NULL ; x.categ.pos = NULL ; x.lab = "" ; x.axis.magnific = 1.5 ; x.label.magnific = 1.5 ; x.dist.legend = 1 ; x.nb.inter.tick = 1 ; y.side = 0 ; y.log.scale = FALSE ; y.categ = NULL ; y.categ.pos = NULL ; y.lab = "" ; y.axis.magnific = 1.5 ; y.label.magnific = 1.5 ; y.dist.legend = 0.7 ; y.nb.inter.tick = 1 ; text.angle = 90 ; tick.length = 0.5 ; sec.tick.length = 0.3 ; bg.color = NULL ; grid.lwd = NULL ; grid.col = "white" ; corner.text = "" ; magnific.corner.text = 1 ; just.label.add = FALSE ; par.reset = FALSE ; custom.par = NULL # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_open_window", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_open_window() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = x.side, options = c(0, 1, 3), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = x.log.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(x.categ)){ +tempo <- fun_param_check(data = x.categ, class = "character", na.contain = TRUE, fun.name = function.name) ; eval(ee) +} +if( ! is.null(x.categ.pos)){ +tempo <- fun_param_check(data = x.categ.pos, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = x.lab, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = x.axis.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = x.label.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = x.dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = x.nb.inter.tick, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = y.side, options = c(0, 2, 4), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = y.log.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(y.categ)){ +tempo <- fun_param_check(data = y.categ, class = "character", na.contain = TRUE, fun.name = function.name) ; eval(ee) +} +if( ! is.null(y.categ.pos)){ +tempo <- fun_param_check(data = y.categ.pos, class = "vector", mode = "numeric", fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = y.lab, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = y.axis.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = y.label.magnific, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = y.dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = y.nb.inter.tick, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = text.angle, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = sec.tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +if( ! is.null(bg.color)){ +tempo <- fun_param_check(data = bg.color, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if( ! (bg.color %in% colors() | grepl(pattern = "^#", bg.color))){ # check color +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": bg.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # OR A COLOR NAME GIVEN BY colors()\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(grid.lwd)){ +tempo <- fun_param_check(data = grid.lwd, class = "vector", mode = "numeric", neg.values = FALSE, fun.name = function.name) ; eval(ee) +} +if( ! is.null(grid.col)){ +tempo <- fun_param_check(data = grid.col, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if( ! (grid.col %in% colors() | grepl(pattern = "^#", grid.col))){ # check color +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": grid.col ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # OR A COLOR NAME GIVEN BY colors()\n\n================\n\n") +stop(tempo.cat) +} +} +tempo <- fun_param_check(data = corner.text, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = magnific.corner.text, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = just.label.add, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = par.reset, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(custom.par)){ +tempo <- fun_param_check(data = custom.par, typeof = "list", length = 1, fun.name = function.name) ; eval(ee) +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +text <- NULL +par(tcl = -par()$mgp[2] * tick.length) +if(x.log.scale == TRUE){ +grid.coord.x <- c(10^par("usr")[1], 10^par("usr")[2]) +}else{ +grid.coord.x <- c(par("usr")[1], par("usr")[2]) +} +if(y.log.scale == TRUE){ +grid.coord.y <- c(10^par("usr")[3], 10^par("usr")[4]) +}else{ +grid.coord.y <- c(par("usr")[3], par("usr")[4]) +} +if( ! is.null(bg.color)){ +rect(grid.coord.x[1], grid.coord.y[1], grid.coord.x[2], grid.coord.y[2], col = bg.color, border = NA) +} +if( ! is.null(grid.lwd)){ +grid(nx = NA, ny = NULL, col = grid.col, lty = 1, lwd = grid.lwd) +} +if(x.log.scale == TRUE){ +x.mid.left.dev.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) +x.left.dev.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) # in x coordinates +x.mid.right.dev.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) +x.right.dev.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2])) # in x coordinates +x.mid.left.fig.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) +x.left.fig.region <- 10^(par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1]) # in x coordinates +x.mid.right.fig.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) +x.right.fig.region <- 10^(par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2])) # in x coordinates +x.left.plot.region <- 10^par("usr")[1] # in x coordinates, left of the plot region (according to x scale) +x.right.plot.region <- 10^par("usr")[2] # in x coordinates, right of the plot region (according to x scale) +x.mid.plot.region <- 10^((par("usr")[2] + par("usr")[1]) / 2) # in x coordinates, right of the plot region (according to x scale) +}else{ +x.mid.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) +x.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) # in x coordinates +x.mid.right.dev.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) +x.right.dev.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) + ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * (1 - par("omd")[2])) # in x coordinates +x.mid.left.fig.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] / 2) # in x coordinates, to position axis labeling at the bottom of the graph (according to x scale) +x.left.fig.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1]) # in x coordinates +x.mid.right.fig.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2]) / 2) # in x coordinates, to position axis labeling at the top of the graph (according to x scale) +x.right.fig.region <- (par("usr")[2] + ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * (1 - par("plt")[2])) # in x coordinates +x.left.plot.region <- par("usr")[1] # in x coordinates, left of the plot region (according to x scale) +x.right.plot.region <- par("usr")[2] # in x coordinates, right of the plot region (according to x scale) +x.mid.plot.region <- (par("usr")[2] + par("usr")[1]) / 2 # in x coordinates, right of the plot region (according to x scale) +} +if(y.log.scale == TRUE){ +y.mid.bottom.dev.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (par("omd")[3] / 2)) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space +y.bottom.dev.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * par("omd")[3]) # in y coordinates +y.mid.top.dev.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space +y.top.dev.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) # in y coordinates +y.mid.bottom.fig.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] / 2) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space +y.bottom.fig.region <- 10^(par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3]) # in y coordinates +y.mid.top.fig.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space +y.top.fig.region <- 10^(par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4])) # in y coordinates +y.top.plot.region <- 10^par("usr")[4] # in y coordinates, top of the plot region (according to y scale) +y.bottom.plot.region <- 10^par("usr")[3] # in y coordinates, bottom of the plot region (according to y scale) +y.mid.plot.region <- (par("usr")[3] + par("usr")[4]) / 2 # in x coordinates, right of the plot region (according to x scale) +}else{ +y.mid.bottom.dev.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (par("omd")[3] / 2)) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space +y.bottom.dev.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] - ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * par("omd")[3]) # in y coordinates +y.mid.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space +y.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) # in y coordinates +y.mid.bottom.fig.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3] / 2) # in y coordinates, to position axis labeling at the bottom of the graph (according to y scale). Ex mid.bottom.space +y.bottom.fig.region <- (par("usr")[3] - ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * par("plt")[3]) # in y coordinates +y.mid.top.fig.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) / 2) # in y coordinates, to position axis labeling at the top of the graph (according to y scale). Ex mid.top.space +y.top.fig.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4])) # in y coordinates +y.top.plot.region <- par("usr")[4] # in y coordinates, top of the plot region (according to y scale) +y.bottom.plot.region <- par("usr")[3] # in y coordinates, bottom of the plot region (according to y scale) +y.mid.plot.region <- ((par("usr")[3] + par("usr")[4]) / 2) # in x coordinates, right of the plot region (according to x scale) +} +if(x.side == 1 | x.side == 3){ +par(xpd=FALSE, xaxt="s") +if(is.null(x.categ) & x.log.scale == TRUE){ +if(any(par()$xaxp[1:2] == 0)){ +if(par()$xaxp[1] == 0){ +par(xaxp = c(10^-30, par()$xaxp[2:3])) # because log10(par()$xaxp[1] == 0) == -Inf +} +if(par()$xaxp[2] == 0){ +par(xaxp = c(par()$xaxp[1], 10^-30, par()$xaxp[3])) # because log10(par()$xaxp[2] == 0) == -Inf +} +} +axis(side=x.side, at=c(10^par()$usr[1], 10^par()$usr[2]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line +mtext(side = x.side, text = x.lab, line = x.dist.legend / 0.2, las = 0, cex = x.label.magnific) +par(tcl = -par()$mgp[2] * sec.tick.length) # length of the secondary ticks are reduced +suppressWarnings(rug(10^outer(c((log10(par("xaxp")[1]) -1):log10(par("xaxp")[2])), log10(1:10), "+"), ticksize = NA, side = x.side)) # ticksize = NA to allow the use of par()$tcl value +par(tcl = -par()$mgp[2] * tick.length) # back to main ticks +axis(side = x.side, at = c(1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10), labels = expression(10^-15, 10^-14, 10^-13, 10^-12, 10^-11, 10^-10, 10^-9, 10^-8, 10^-7, 10^-6, 10^-5, 10^-4, 10^-3, 10^-2, 10^-1, 10^0, 10^1, 10^2, 10^3, 10^4, 10^5, 10^6, 10^7, 10^8, 10^9, 10^10), lwd = 0, lwd.ticks = 1, cex.axis = x.axis.magnific) +x.text <- 10^par("usr")[2] +}else if(is.null(x.categ) & x.log.scale == FALSE){ +axis(side=x.side, at=c(par()$usr[1], par()$usr[2]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line +axis(side=x.side, at=round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), cex.axis = x.axis.magnific) # axis(side=x.side, at=round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), labels = format(round(seq(par()$xaxp[1], par()$xaxp[2], length.out=par()$xaxp[3]+1), 2), big.mark=','), cex.axis = x.axis.magnific) # to get the 1000 comma separator +mtext(side = x.side, text = x.lab, line = x.dist.legend / 0.2, las = 0, cex = x.label.magnific) +if(x.nb.inter.tick > 0){ +inter.tick.unit <- (par("xaxp")[2] - par("xaxp")[1]) / par("xaxp")[3] +par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced +suppressWarnings(rug(seq(par("xaxp")[1] - 10 * inter.tick.unit, par("xaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + x.nb.inter.tick)), ticksize = NA, x.side)) # ticksize = NA to allow the use of par()$tcl value +par(tcl = -par()$mgp[2] * tick.length) # back to main ticks +} +x.text <- par("usr")[2] +}else if(( ! is.null(x.categ)) & x.log.scale == FALSE){ +if(is.null(x.categ.pos)){ +x.categ.pos <- 1:length(x.categ) +}else if(length(x.categ.pos) != length(x.categ)){ +stop("\n\nPROBLEM: x.categ.pos MUST BE THE SAME LENGTH AS x.categ\n\n") +} +par(xpd = TRUE) +if(x.side == 1){ +segments(x0 = x.left.plot.region, x1 = x.right.plot.region, y0 = y.bottom.plot.region, y1 = y.bottom.plot.region) # draw the line of the axis +text(x = x.categ.pos, y = y.mid.bottom.fig.region, labels = x.categ, srt = text.angle, cex = x.axis.magnific) +}else if(x.side == 3){ +segments(x0 = x.left.plot.region, x1 = x.right.plot.region, y0 = y.top.plot.region, y1 = y.top.plot.region) # draw the line of the axis +text(x = x.categ.pos, y = y.mid.top.fig.region, labels = x.categ, srt = text.angle, cex = x.axis.magnific) +}else{ +stop("\n\nARGUMENT x.side CAN ONLY BE 1 OR 3\n\n") +} +par(xpd = FALSE) +x.text <- par("usr")[2] +}else{ +stop("\n\nPROBLEM WITH THE x.side (", x.side ,") OR x.log.scale (", x.log.scale,") ARGUMENTS\n\n") +} +}else{ +x.text <- par("usr")[2] +} +if(y.side == 2 | y.side == 4){ +par(xpd=FALSE, yaxt="s") +if(is.null(y.categ) & y.log.scale == TRUE){ +if(any(par()$yaxp[1:2] == 0)){ +if(par()$yaxp[1] == 0){ +par(yaxp = c(10^-30, par()$yaxp[2:3])) # because log10(par()$yaxp[1] == 0) == -Inf +} +if(par()$yaxp[2] == 0){ +par(yaxp = c(par()$yaxp[1], 10^-30, par()$yaxp[3])) # because log10(par()$yaxp[2] == 0) == -Inf +} +} +axis(side=y.side, at=c(10^par()$usr[3], 10^par()$usr[4]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line +par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced +suppressWarnings(rug(10^outer(c((log10(par("yaxp")[1])-1):log10(par("yaxp")[2])), log10(1:10), "+"), ticksize = NA, side = y.side)) # ticksize = NA to allow the use of par()$tcl value +par(tcl = -par()$mgp[2] * tick.length) # back to main tick length +axis(side = y.side, at = c(1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10), labels = expression(10^-15, 10^-14, 10^-13, 10^-12, 10^-11, 10^-10, 10^-9, 10^-8, 10^-7, 10^-6, 10^-5, 10^-4, 10^-3, 10^-2, 10^-1, 10^0, 10^1, 10^2, 10^3, 10^4, 10^5, 10^6, 10^7, 10^8, 10^9, 10^10), lwd = 0, lwd.ticks = 1, cex.axis = y.axis.magnific) +y.text <- 10^(par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) +mtext(side = y.side, text = y.lab, line = y.dist.legend / 0.2, las = 0, cex = y.label.magnific) +}else if(is.null(y.categ) & y.log.scale == FALSE){ +axis(side=y.side, at=c(par()$usr[3], par()$usr[4]), labels=rep("", 2), lwd=1, lwd.ticks=0) # draw the axis line +axis(side=y.side, at=round(seq(par()$yaxp[1], par()$yaxp[2], length.out=par()$yaxp[3]+1), 2), cex.axis = y.axis.magnific) +mtext(side = y.side, text = y.lab, line = y.dist.legend / 0.2, las = 0, cex = y.label.magnific) +if(y.nb.inter.tick > 0){ +inter.tick.unit <- (par("yaxp")[2] - par("yaxp")[1]) / par("yaxp")[3] +par(tcl = -par()$mgp[2] * sec.tick.length) # length of the ticks are reduced +suppressWarnings(rug(seq(par("yaxp")[1] - 10 * inter.tick.unit, par("yaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + y.nb.inter.tick)), ticksize = NA, side=y.side)) # ticksize = NA to allow the use of par()$tcl value +par(tcl = -par()$mgp[2] * tick.length) # back to main tick length +} +y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) +}else if(( ! is.null(y.categ)) & y.log.scale == FALSE){ +if(is.null(y.categ.pos)){ +y.categ.pos <- 1:length(y.categ) +}else if(length(y.categ.pos) != length(y.categ)){ +stop("\n\nPROBLEM: y.categ.pos MUST BE THE SAME LENGTH AS y.categ\n\n") +} +axis(side = y.side, at = y.categ.pos, labels = rep("", length(y.categ)), lwd=0, lwd.ticks=1) # draw the line of the axis +par(xpd = TRUE) +if(y.side == 2){ +text(x = x.mid.left.fig.region, y = y.categ.pos, labels = y.categ, srt = text.angle, cex = y.axis.magnific) +}else if(y.side == 4){ +text(x = x.mid.right.fig.region, y = y.categ.pos, labels = y.categ, srt = text.angle, cex = y.axis.magnific) +}else{ +stop("\n\nARGUMENT y.side CAN ONLY BE 2 OR 4\n\n") +} +par(xpd = FALSE) +y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) +}else{ +stop("\n\nPROBLEM WITH THE y.side (", y.side ,") OR y.log.scale (", y.log.scale,") ARGUMENTS\n\n") +} +}else{ +y.text <- (par("usr")[4] + (par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3]) * (1 - par("plt")[4])) +} +par(xpd=NA) +text(x = x.mid.right.fig.region, y = y.text, corner.text, adj=c(1, 1.1), cex = magnific.corner.text) # text at the topright corner. Replace x.right.fig.region by x.text if text at the right edge of the plot region +if(just.label.add == TRUE & x.side == 0 & x.lab != ""){ +text(x = x.mid.plot.region, y = y.mid.bottom.fig.region, x.lab, adj=c(0.5, 0.5), cex = x.label.magnific) # x label +} +if(just.label.add == TRUE & y.side == 0 & y.lab != ""){ +text(x = y.mid.plot.region, y = x.mid.left.fig.region, y.lab, adj=c(0.5, 0.5), cex = y.label.magnific) # x label +} +par(xpd=FALSE) +if(par.reset == TRUE){ +tempo.par <- fun_open_window(pdf.disp = FALSE, return.output = TRUE) +invisible(dev.off()) # close the new window +if( ! is.null(custom.par)){ +if( ! names(custom.par) %in% names(tempo.par$ini.par)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": custom.par ARGUMENT SHOULD HAVE THE NAMES OF THE COMPARTMENT LIST COMING FROM THE par() LIST\n\n================\n\n") +stop(tempo.cat) +} +par(custom.par) +text <- c(text, "\nGRAPH PARAMETERS SET TO VALUES DEFINED BY custom.par ARGUMENT\n") +}else{ +par(tempo.par$ini.par) +text <- c(text, "\nGRAPH PARAMETERS RESET TO par() DEFAULT VALUES\n") +} +} +output <- list(x.mid.left.dev.region = x.mid.left.dev.region, x.left.dev.region = x.left.dev.region, x.mid.right.dev.region = x.mid.right.dev.region, x.right.dev.region = x.right.dev.region, x.mid.left.fig.region = x.mid.left.fig.region, x.left.fig.region = x.left.fig.region, x.mid.right.fig.region = x.mid.right.fig.region, x.right.fig.region = x.right.fig.region, x.left.plot.region = x.left.plot.region, x.right.plot.region = x.right.plot.region, x.mid.plot.region = x.mid.plot.region, y.mid.bottom.dev.region = y.mid.bottom.dev.region, y.bottom.dev.region = y.bottom.dev.region, y.mid.top.dev.region = y.mid.top.dev.region, y.top.dev.region = y.top.dev.region, y.mid.bottom.fig.region = y.mid.bottom.fig.region, y.bottom.fig.region = y.bottom.fig.region, y.mid.top.fig.region = y.mid.top.fig.region, y.top.fig.region = y.top.fig.region, y.top.plot.region = y.top.plot.region, y.bottom.plot.region = y.bottom.plot.region, y.mid.plot.region = y.mid.plot.region, text = text) +return(output) } @@ -2426,456 +2902,3156 @@ fun_feature_post_plot <- function(x.side = 0, x.log.scale = FALSE, x.categ = NUL # Check OK: clear to go Apollo fun_close_specif_window <- function(kind = "pdf", return.text = FALSE){ - # AIM: - # close only specific graphic windows (devices) - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS: - # kind: vector, among c("windows", "quartz", "x11", "X11", "pdf", "bmp", "png", "tiff"), indicating the kind of graphic windows (devices) to close. BEWARE: either "windows", "quartz", "x11" or "X11" means that all the X11 GUI graphics devices will be closed, whatever the OS used - # return.text: print text regarding the kind parameter and the devices that were finally closed? - # RETURN - # text regarding the kind parameter and the devices that were finally closed - # EXAMPLES - # windows() ; windows() ; pdf() ; dev.list() ; fun_close_specif_window(kind = c("pdf", "x11"), return.text = TRUE) ; dev.list() - # DEBUGGING - # kind = c("windows", "pdf") ; return.text = FALSE # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_close_specif_window(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = kind, options = c("windows", "quartz", "x11", "X11", "pdf", "bmp", "png", "tiff")) ; eval(ee) - tempo <- fun_param_check(data = return.text, class = "logical", length = 1) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - # end argument checking - text <- paste0("THE REQUIRED KIND OF GRAPHIC DEVICES TO CLOSE ARE ", paste(kind, collapse = " ")) - if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows - if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ - tempo <- kind %in% c("windows", "quartz", "x11", "X11") - kind[tempo] <- "windows" # # term are replaced by what is displayed when using a <- dev.list() ; names(a) - } - }else if(Sys.info()["sysname"] == "Linux"){ - if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ - tempo.device <- suppressWarnings(try(X11(), silent = TRUE))[] # open a X11 window to try to recover the X11 system used - if( ! is.null(tempo.device)){ - text <- paste0(text, "\nCANNOT CLOSE GUI GRAPHIC DEVICES AS REQUIRED BECAUSE THIS LINUX SYSTEM DOES NOT HAVE IT") - }else{ - tempo <- kind %in% c("windows", "quartz", "x11", "X11") - kind[tempo] <- names(dev.list()[length(dev.list())]) # # term are replaced by what is displayed when using a <- dev.list() ; names(a) - invisible(dev.off()) # close the X11 opened by tempo - } - } - }else{ # for macOS - if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ - tempo <- kind %in% c("windows", "quartz", "x11", "X11") - kind[tempo] <- "quartz" # term are replaced by what is displayed when using a <- dev.list() ; names(a) - } - } - kind <- unique(kind) - if(length(dev.list()) != 0){ - for(i in length(names(dev.list())):1){ - if(names(dev.list())[i] %in% kind){ - text <- paste0(text, "\n", names(dev.list())[i], " DEVICE NUMBER ", dev.list()[i], " HAS BEEN CLOSED") - invisible(dev.off(dev.list()[i])) - } - } - } - if(return.text == TRUE){ - return(text) - } +# AIM +# close only specific graphic windows (devices) +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS: +# kind: vector, among c("windows", "quartz", "x11", "X11", "pdf", "bmp", "png", "tiff"), indicating the kind of graphic windows (devices) to close. BEWARE: either "windows", "quartz", "x11" or "X11" means that all the X11 GUI graphics devices will be closed, whatever the OS used +# return.text: print text regarding the kind parameter and the devices that were finally closed? +# RETURN +# text regarding the kind parameter and the devices that were finally closed +# EXAMPLES +# windows() ; windows() ; pdf() ; dev.list() ; fun_close_specif_window(kind = c("pdf", "x11"), return.text = TRUE) ; dev.list() +# DEBUGGING +# kind = c("windows", "pdf") ; return.text = FALSE # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = kind, options = c("windows", "quartz", "x11", "X11", "pdf", "bmp", "png", "tiff"), fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = return.text, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +text <- paste0("THE REQUIRED KIND OF GRAPHIC DEVICES TO CLOSE ARE ", paste(kind, collapse = " ")) +if(Sys.info()["sysname"] == "Windows"){ # Note that .Platform$OS.type() only says "unix" for macOS and Linux and "Windows" for Windows +if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ +tempo <- kind %in% c("windows", "quartz", "x11", "X11") +kind[tempo] <- "windows" # term are replaced by what is displayed when using a <- dev.list() ; names(a) +} +}else if(Sys.info()["sysname"] == "Linux"){ +if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ +tempo.device <- suppressWarnings(try(X11(), silent = TRUE))[] # open a X11 window to try to recover the X11 system used +if( ! is.null(tempo.device)){ +text <- paste0(text, "\nCANNOT CLOSE GUI GRAPHIC DEVICES AS REQUIRED BECAUSE THIS LINUX SYSTEM DOES NOT HAVE IT") +}else{ +tempo <- kind %in% c("windows", "quartz", "x11", "X11") +kind[tempo] <- names(dev.list()[length(dev.list())]) # term are replaced by what is displayed when using a <- dev.list() ; names(a) +invisible(dev.off()) # close the X11 opened by tempo +} +} +}else{ # for macOS +if(any(kind %in% c("windows", "quartz", "x11", "X11"))){ +tempo <- kind %in% c("windows", "quartz", "x11", "X11") +kind[tempo] <- "quartz" # term are replaced by what is displayed when using a <- dev.list() ; names(a) +} +} +kind <- unique(kind) +if(length(dev.list()) != 0){ +for(i in length(names(dev.list())):1){ +if(names(dev.list())[i] %in% kind){ +text <- paste0(text, "\n", names(dev.list())[i], " DEVICE NUMBER ", dev.list()[i], " HAS BEEN CLOSED") +invisible(dev.off(dev.list()[i])) +} +} +} +if(return.text == TRUE){ +return(text) +} } -######## fun_var_trim_display() #### Display values from a quantitative variable and trim according to defined cut-offs +################ Standard graphics -fun_var_trim_display <- function(data, displayed.nb = NULL, single.value.display = FALSE, trim.method = "", trim.cutoffs = c(0.05, 0.975), interval.scale.disp = TRUE, down.space = 0.75, left.space = 0.75, up.space = 0.3, right.space = 0.25, orient = 1, dist.legend = 0.37, box.type = "l", amplif.label = 1.25, amplif.axis = 1.25, std.x.range = TRUE, std.y.range = TRUE, cex.pt = 0.2, col.box = hsv(0.55, 0.8, 0.8), x.nb.inter.tick = 4, y.nb.inter.tick = 0, tick.length = 1, sec.tick.length = 0.75, corner.text = "", amplif.legend = 1, magnific.corner.text = 0.75, trim.return = FALSE){ - # AIM: - # trim and display values from a numeric vector or matrix - # plot 4 graphs: stripchart of values, stripchart of rank of values, hitogramme and normal QQPlot - # different kinds of intervals are displayed on the top of graphes to facilitate the analysis of the variable and a trimming setting - # the trimming interval chosen is displayed on top of graphs - # both trimmed and not trimmed values are returned in a list - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS - # data: values to plot (either a numeric vector or a numeric matrix) - # displayed.nb: number of values displayed. If NULL, all the values are displayed. Otherwise, if the number of values is over displayed.nb, then displayed.nb values are displayed after random selection - # single.value.display: provide the 4 graphs if data is made of a single (potentially repeated value)? If FALSE, an empty graph is displayed if data is made of a single (potentially repeated value). And the return list is made of NULL compartments - # trim.method: Write "" if not required. write "mean.sd" if mean +/- sd has to be displayed as a trimming interval (only recommanded for normal distribution). Write "quantile" to display a trimming interval based on quantile cut-offs. No other possibility allowed. See trim.cutoffs below - # trim.cutoffs: 2 values cutoff for the trimming interval displayed, each value between 0 and 1. Not used if trim.method == "".The couple of values c(lower, upper) represents the lower and upper boundaries of the trimming interval (in proportion), which represent the interval of distribution kept (between 0 and 1). Example: trim.cutoffs = c(0.05, 0.975). What is strictly kept for the display is ]lower , upper[, boundaries excluded. Using the "mean.sd" method, 0.025 and 0.975 represent 95% CI which is mean +/- 1.96 * sd - # interval.scale.disp: display sd and quantiles intervals on top of graphs ? - # down.space: lower vertical margin (in inches, mai argument of par()) - # left.space: left horizontal margin (in inches, mai argument of par()) - # up.space: upper vertical margin between plot region and grapical window (in inches, mai argument of par()) - # right.space: right horizontal margin (in inches, mai argument of par()) - # orient: scale number orientation (las argument of par()). 0, always parallel to the axis; 1, always horizontal; 2, always perpendicular to the axis; 3, always vertical - # dist.legend: numeric value that moves axis legends away in inches (first number of mgp argument of par() but in inches thus / 0.2) - # box.type: bty argument of par(). Either "o", "l", "7", "c", "u", "]", the resulting box resembles the corresponding upper case letter. A value of "n" suppresses the box - # amplif.label: increase or decrease the size of the text in legends - # amplif.axis: increase or decrease the size of the scale numbers in axis - # std.x.range: standard range on the x-axis? TRUE (no range extend) or FALSE (4% range extend). Controls xaxs argument of par() (TRUE is xaxs = "i", FALSE is xaxs = "r") - # std.y.range: standard range on the y-axis? TRUE (no range extend) or FALSE (4% range extend). Controls yaxs argument of par() (TRUE is yaxs = "i", FALSE is yaxs = "r") - # cex.pt: size of points in stripcharts (in inches, thus cex.pt will be thereafter / 0.2) - # col.box: color of boxplot - # x.nb.inter.tick: number of secondary ticks between main ticks on x-axis (only if not log scale). Zero means non secondary ticks - # y.nb.inter.tick: number of secondary ticks between main ticks on y-axis (only if not log scale). Zero means non secondary ticks - # tick.length: length of the ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc. 0 means no tick - # sec.tick.length: length of the secondary ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) - # corner.text: text to add at the top right corner of the window - # amplif.legend: increase or decrease the size of the text of legend - # magnific.corner.text: increase or decrease the size of the text - # trim.return: return the trimmed and non trimmed values? NULL returned for trimmed and non trimmed values if trim.method == "" - # RETURN - # a list containing: - # $trim.method: correspond to trim.method above - # $trim.cutoffs: correspond to trim.cutoffs above - # $real.trim.cutoffs: the two boundary values (in the unit of the numeric vector or numeric matrix analyzed). NULL - # $trimmed.values: the values outside of the trimming interval as defined in trim.cutoffs above - # $kept.values: the values inside the trimming interval as defined in trim.cutoffs above - # EXAMPLES - # fun_var_trim_display(data = c(1:100, 1:10), displayed.nb = NULL, single.value.display = FALSE, trim.method = "mean.sd", trim.cutoffs = c(0.05, 0.975), interval.scale.disp = TRUE, down.space = 0.75, left.space = 0.75, up.space = 0.3, right.space = 0.25, orient = 1, dist.legend = 0.37, box.type = "l", amplif.label = 1.25, amplif.axis = 1.25, std.x.range = TRUE, std.y.range = TRUE, cex.pt = 0.2, col.box = hsv(0.55, 0.8, 0.8), x.nb.inter.tick = 4, y.nb.inter.tick = 0, tick.length = 0.5, sec.tick.length = 0.3, corner.text = "", amplif.legend = 1, magnific.corner.text = 0.75, trim.return = TRUE) - # DEBUGGING - # data = c(1:100, 1:10) ; displayed.nb = NULL ; single.value.display = FALSE ; trim.method = "quantile" ; trim.cutoffs = c(0.05, 0.975) ; interval.scale.disp = TRUE ; down.space = 1 ; left.space = 1 ; up.space = 0.5 ; right.space = 0.25 ; orient = 1 ; dist.legend = 0.5 ; box.type = "l" ; amplif.label = 1 ; amplif.axis = 1 ; std.x.range = TRUE ; std.y.range = TRUE ; cex.pt = 0.1 ; col.box = hsv(0.55, 0.8, 0.8) ; x.nb.inter.tick = 4 ; y.nb.inter.tick = 0 ; tick.length = 0.5 ; sec.tick.length = 0.3 ; corner.text = "" ; amplif.legend = 1 ; magnific.corner.text = 0.75 ; trim.return = TRUE # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_var_trim_display(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - if( ! (all(class(data) == "numeric") | all(class(data) == "integer") | (all(class(data) == "matrix") & mode(data) == "numeric"))){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_var_trim_display(): data ARGUMENT MUST BE A NUMERIC VECTOR OR NUMERIC MATRIX\n\n================\n\n") - stop(tempo.cat) - } - if( ! is.null(displayed.nb)){ - tempo <- fun_param_check(data = displayed.nb, mode = "numeric", length = 1) ; eval(ee) - if(displayed.nb < 2){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_var_trim_display(): displayed.nb ARGUMENT MUST BE A SINGLE INTEGER VALUE GREATER THAN 1 AND NOT: ", paste(displayed.nb, collapse = " "), "\n\n================\n\n") - stop(tempo.cat) - } - } - tempo <- fun_param_check(data = single.value.display, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = trim.method, options = c("", "mean.sd", "quantile"), length = 1) ; eval(ee) - tempo <- fun_param_check(data = trim.cutoffs, mode = "numeric", length = 2, prop = TRUE) ; eval(ee) - tempo <- fun_param_check(data = interval.scale.disp, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = down.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = left.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = up.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = right.space, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = orient, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = dist.legend, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = box.type, options = c("o", "l", "7", "c", "u", "]", "n"), length = 1) ; eval(ee) - tempo <- fun_param_check(data = amplif.label, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = amplif.axis, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = std.x.range, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = std.y.range, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = cex.pt, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = col.box, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = x.nb.inter.tick, class = "integer", length = 1, neg.values = FALSE, double.as.integer.allowed = TRUE) ; eval(ee) - tempo <- fun_param_check(data = y.nb.inter.tick, class = "integer", length = 1, neg.values = FALSE, double.as.integer.allowed = TRUE) ; eval(ee) - tempo <- fun_param_check(data = tick.length, mode = "numeric", length = 1, prop = TRUE) ; eval(ee) - tempo <- fun_param_check(data = sec.tick.length, mode = "numeric", length = 1, prop = TRUE) ; eval(ee) - tempo <- fun_param_check(data = corner.text, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = amplif.legend, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = magnific.corner.text, mode = "numeric", length = 1, neg.values = FALSE) ; eval(ee) - tempo <- fun_param_check(data = trim.return, class = "logical", length = 1) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - # end argument checking - if(class(data) == "matrix"){ - data <- as.vector(data) - } - color.cut <- hsv(0.75, 1, 1) # color of interval selected - col.mean <- hsv(0.25, 1, 0.8) # color of interval using mean+/-sd - col.quantile <- "orange" # color of interval using quantiles - quantiles.selection <- c(0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.975, 0.99) # quantiles used in axis to help for choosing trimming cutoffs - if(single.value.display == FALSE & length(unique(data)) == 1){ - par(bty = "n", xaxt = "n", yaxt = "n", xpd = TRUE) - plot(1, pch = 16, col = "white", xlab = "", ylab = "") - text(x = 1, y = 1, paste0("No graphic displayed\nBecause data made of a single different value (", formatC(as.double(table(data))), ")"), cex = 2) - output <- list(trim.method = NULL, trim.cutoffs = NULL, real.trim.cutoffs = NULL, trimmed.values = NULL, kept.values = NULL) - }else{ - output <- list(trim.method = trim.method, trim.cutoffs = trim.cutoffs, real.trim.cutoffs = NULL, trimmed.values = NULL, kept.values = NULL) - fun.rug <- function(sec.tick.length.f = sec.tick.length, x.nb.inter.tick.f = x.nb.inter.tick, y.nb.inter.tick.f = y.nb.inter.tick){ - if(x.nb.inter.tick.f > 0){ - inter.tick.unit <- (par("xaxp")[2] - par("xaxp")[1]) / par("xaxp")[3] - par.ini <- par()[c("xpd", "tcl")] - par(xpd = FALSE) - par(tcl = -par()$mgp[2] * sec.tick.length.f) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) - suppressWarnings(rug(seq(par("xaxp")[1] - 10 * inter.tick.unit, par("xaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + x.nb.inter.tick.f)), ticksize = NA, side = 1)) # ticksize = NA to allow the use of par()$tcl value - par(par.ini) - rm(par.ini) - } - if(y.nb.inter.tick.f > 0){ - inter.tick.unit <- (par("yaxp")[2] - par("yaxp")[1]) / par("yaxp")[3] - par.ini <- par()[c("xpd", "tcl")] - par(xpd = FALSE) - par(tcl = -par()$mgp[2] * sec.tick.length.f) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) - suppressWarnings(rug(seq(par("yaxp")[1] - 10 * inter.tick.unit, par("yaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + y.nb.inter.tick.f)), ticksize = NA, side = 2)) # ticksize = NA to allow the use of par()$tcl value - par(par.ini) - rm(par.ini) - } - } - fun.add.cut <- function(data.f, trim.method.f = trim.method, trim.cutoffs.f = trim.cutoffs, color.cut.f = color.cut, return.f = FALSE){ - # DEBUGGING - # data.f = data ; trim.method.f = "mean.sd"; trim.cutoffs.f = trim.cutoffs ; color.cut.f = color.cut ; return.f = TRUE - real.trim.cutoffs.f <- NULL - if(trim.method.f != ""){ - data.f <- sort(data.f) - par.ini <- par()$xpd - par(xpd = FALSE) - if(trim.method.f == "mean.sd"){ - real.trim.cutoffs.f <- qnorm(trim.cutoffs.f, mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)) - abline(v = qnorm(trim.cutoffs.f, mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), col = color.cut.f) - segments(qnorm(trim.cutoffs.f[1], mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), par()$usr[4] * 0.75, qnorm(trim.cutoffs.f[2], mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), par()$usr[4] * 0.75, col = color.cut.f) - } - if(trim.method.f == "quantile"){ - real.trim.cutoffs.f <- quantile(data.f, probs = trim.cutoffs.f, type = 7) - abline(v = quantile(data.f, probs = trim.cutoffs.f, type = 7), col = color.cut.f) - segments(quantile(data.f, probs = trim.cutoffs.f[1], type = 7), par()$usr[4] * 0.75, quantile(data.f, probs = trim.cutoffs.f[2], type = 7), par()$usr[4] * 0.75, col = color.cut.f) - } - par(par.ini) - if(return.f == TRUE){ - trimmed.values.f <- data.f[data.f <= real.trim.cutoffs.f[1] | data.f >= real.trim.cutoffs.f[2]] - kept.values.f <- data.f[data.f > real.trim.cutoffs.f[1] & data.f < real.trim.cutoffs.f[2]] - } - }else{ - real.trim.cutoffs.f <- NULL - trimmed.values.f <- NULL - kept.values.f <- NULL - } - if(return.f == TRUE){ - output <- list(trim.method = trim.method.f, trim.cutoffs = trim.cutoffs.f, real.trim.cutoffs = real.trim.cutoffs.f, trimmed.values = trimmed.values.f, kept.values = kept.values.f) - return(output) - } - } - fun.interval.scale.display <- function(data.f, col.quantile.f = col.quantile, quantiles.selection.f = quantiles.selection, col.mean.f = col.mean){ # intervals on top of graphs - par.ini <- par()[c("mgp", "xpd")] - par(mgp = c(0.25, 0.25, 0), xpd = NA) - axis(side = 3, at = c(par()$usr[1], par()$usr[2]), labels = rep("", 2), col = col.quantile.f, lwd.ticks = 0) - par(xpd = FALSE) - axis(side = 3, at = quantile(as.vector(data.f), probs = quantiles.selection.f, type = 7), labels = quantiles.selection.f, col.axis = col.quantile.f, col = col.quantile.f) - par(mgp = c(1.75, 1.75, 1.5), xpd = NA) - axis(side = 3, at = c(par()$usr[1], par()$usr[2]), labels = rep("", 2), col = col.mean.f, lwd.ticks = 0) - par(xpd = FALSE) - axis(side = 3, at = m + s * qnorm(quantiles.selection.f), labels = formatC(round(qnorm(quantiles.selection.f), 2)), col.axis = col.mean.f, col = col.mean.f, lwd.ticks = 1) - par(par.ini) - } - zone<-matrix(1:4, ncol=2) - layout(zone) - par(omi = c(0, 0, 1.5, 0), mai = c(down.space, left.space, up.space, right.space), las = orient, mgp = c(dist.legend / 0.2, 0.5, 0), xpd = FALSE, bty= box.type, cex.lab = amplif.label, cex.axis = amplif.axis, xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) - par(tcl = -par()$mgp[2] * tick.length) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) - if(is.null(displayed.nb)){ - sampled.data <- as.vector(data) - if(corner.text == ""){ - corner.text <- paste0("ALL VALUES OF THE DATASET DISPLAYED") - }else{ - corner.text <- paste0(corner.text, "\nALL VALUES OF THE DATASET DISPLAYED") - } - }else{ - if(length(as.vector(data)) > displayed.nb){ - sampled.data <- sample(as.vector(data), displayed.nb, replace = FALSE) - if(corner.text == ""){ - corner.text <- paste0("BEWARE: ONLY ", displayed.nb, " VALUES ARE DISPLAYED AMONG THE ", length(as.vector(data)), " VALUES OF THE DATASET ANALYZED") - }else{ - corner.text <- paste0(corner.text, "\nBEWARE: ONLY ", displayed.nb, " VALUES ARE DISPLAYED AMONG THE ", length(as.vector(data)), " VALUES OF THE DATASET ANALYZED") - } - }else{ - sampled.data <- as.vector(data) - if(corner.text == ""){ - corner.text <- paste0("BEWARE: THE DISPLAYED NUMBER OF VALUES PARAMETER ", deparse(substitute(displayed.nb)), " HAS BEEN SET TO ", displayed.nb, " WHICH IS ABOVE THE NUMBER OF VALUES OF THE DATASET ANALYZED -> ALL VALUES DISPLAYED") - }else{ - corner.text <- paste0(corner.text, "\nBEWARE: THE DISPLAYED NUMBER OF VALUES PARAMETER ", deparse(substitute(displayed.nb)), " HAS BEEN SET TO ", displayed.nb, " WHICH IS ABOVE THE NUMBER OF VALUES OF THE DATASET ANALYZED -> ALL VALUES DISPLAYED") - } - } - } - stripchart(sampled.data, method="jitter", jitter=0.4, vertical=FALSE, ylim=c(0.5, 1.5), group.names = "", xlab = "Value", ylab="", pch=1, cex = cex.pt / 0.2) - fun.rug(y.nb.inter.tick.f = 0) - boxplot(as.vector(data), horizontal=TRUE, add=TRUE, boxwex = 0.4, staplecol = col.box, whiskcol = col.box, medcol = col.box, boxcol = col.box, range = 0, whisklty = 1) - m <- mean(as.vector(data), na.rm = TRUE) - s <- sd(as.vector(data), na.rm = TRUE) - segments(m, 0.8, m, 1, lwd=2, col="red") # mean - segments(m -1.96 * s, 0.9, m + 1.96 * s, 0.9, lwd=1, col="red") # mean - graph.xlim <- par()$usr[1:2] # for hist() and qqnorm() below - if(interval.scale.disp == TRUE){ - fun.interval.scale.display(data.f = data) - if(corner.text == ""){ - corner.text <- paste0("MULTIPLYING FACTOR DISPLAYED (MEAN +/- SD) ON SCALES: ", paste(formatC(round(qnorm(quantiles.selection), 2))[-(1:(length(quantiles.selection) - 1) / 2)], collapse = ", "), "\nQUANTILES DISPLAYED ON SCALES: ", paste(quantiles.selection, collapse = ", ")) - }else{ - corner.text <- paste0(corner.text, "\nMULTIPLYING FACTOR DISPLAYED (MEAN +/- SD) ON SCALES: ", paste(formatC(round(qnorm(quantiles.selection), 2))[-(1:(length(quantiles.selection) - 1) / 2)], collapse = ", "), "\nQUANTILES DISPLAYED ON SCALES: ", paste(quantiles.selection, collapse = ", ")) - } - } - output.tempo <- fun.add.cut(data.f = data, return.f = TRUE) # to recover real.trim.cutoffs - if(trim.return == TRUE){ - output <- output.tempo - } - par(xpd = NA) - if(trim.method != ""){ - if(corner.text == ""){ - corner.text <- paste0("SELECTED CUT-OFFS (PROPORTION): ", paste(trim.cutoffs, collapse = ", "), "\nSELECTED CUT-OFFS: ", paste(output.tempo$real.trim.cutoffs, collapse = ", ")) - }else{ - corner.text <- paste0(corner.text, "\nSELECTED CUT-OFFS (PROPORTION): ", paste(trim.cutoffs, collapse = ", "), "\nSELECTED CUT-OFFS: ", paste(output.tempo$real.trim.cutoffs, collapse = ", ")) - } - if(interval.scale.disp == TRUE){ - legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- 1.96sd", paste0("Trimming interval: ", paste0(trim.cutoffs, collapse = " , ")), "Mean +/- sd multiplying factor", "Quantile"), yjust = 0, lty=1, col=c(col.box, "red", color.cut, col.mean, col.quantile), bty="n", cex = amplif.legend) - }else{ - legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- 1.96sd", paste0("Trimming interval: ", paste0(trim.cutoffs, collapse = " , "))), yjust = 0, lty=1, col=c(col.box, "red", color.cut), bty="n", cex = amplif.legend, y.intersp=1.25) - } - }else{ - if(interval.scale.disp == TRUE){ - legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- sd", "Mean +/- sd multiplying factor", "Quantile"), yjust = 0, lty=1, col=c(col.box, "red", col.mean, col.quantile), bty="n", cex = amplif.legend) - }else{ - legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- sd"), yjust = 0, lty=1, col=c(col.box, "red"), bty="n", cex = amplif.legend, y.intersp=1.25) - } - } - par(xpd = FALSE, xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) - hist(as.vector(data), main = "", breaks = seq(min(as.vector(data), na.rm = TRUE), max(as.vector(data), na.rm = TRUE), length.out = length(as.vector(data)) / 10), xlim = graph.xlim, xlab = "Value", ylab="Density", col = grey(0.25)) - abline(h = par()$usr[3]) - fun.rug() - if(interval.scale.disp == TRUE){ - fun.interval.scale.display(data.f = data) - } - fun.add.cut(data.f = data) - par(xaxs = ifelse(std.x.range, "i", "r")) - stripchart(rank(sampled.data), method="stack", vertical=FALSE, ylim=c(0.99, 1.3), group.names = "", xlab = "Rank of values", ylab="", pch=1, cex = cex.pt / 0.2) - fun.rug(y.nb.inter.tick.f = 0) - x.text <- par("usr")[2] + (par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1]) * (1 - par("plt")[2]) / 2 - y.text <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par()$omd[4] / 2) * ((par("plt")[4] - par("plt")[3])))) * (1 - par("omd")[4])) # BEWARE. Here in "(par()$omd[4] / 2", division by two because there are 2 graphs staked on the y axis, and not one - par(xpd=NA) - text(x = x.text, y = y.text, paste0(corner.text), adj=c(1, 1.1), cex = magnific.corner.text) # text at the topright corner - par(xpd=FALSE) - par(xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) - qqnorm(as.vector(sampled.data), main = "", datax = TRUE, ylab = "Value", pch = 1, col = "red", cex = cex.pt / 0.2) - fun.rug() - if(diff(quantile(as.vector(data), probs = c(0.25, 0.75), na.rm = TRUE)) != 0){ # otherwise, error generated - qqline(as.vector(data), datax = TRUE) - } - if(interval.scale.disp == TRUE){ - fun.interval.scale.display(data.f = data) - } - fun.add.cut(data.f = data) - } - if(trim.return == TRUE){ - return(output) - } +######## fun_empty_graph() #### text to display for empty graphs + + +# Check OK: clear to go Apollo +fun_empty_graph <- function(text, title = NULL, text.size = 1){ +# AIM +# display an empty plot with a text in the middle of the window (for instance to specify that no plot can be drawn) +# ARGUMENTS +# text: character string of the message to display +# text.size: numeric value of the text size +# REQUIRED PACKAGES +# none +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# RETURN +# an empty plot +# EXAMPLES +# fun_empty_graph(text = "NO GRAPH", title = "GRAPH1") +# DEBUGGING +# text = "NO GRAPH" ; title = "GRAPH1" ; text.size = 1 +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = text, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = text.size, class = "vector", mode = "numeric", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +ini.par <- par(no.readonly = TRUE) # to recover the initial graphical parameters if required (reset). BEWARE: this command alone opens a pdf of GUI window if no window already opened. But here, protected with the code because always a tempo window opened +par(ann=FALSE, xaxt="n", yaxt="n", mar = rep(1, 4), bty = "n", xpd = NA) +plot(1, 1, type = "n") # no display with type = "n" +x.left.dev.region <- (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / ((par("omd")[2] - par("omd")[1]) * (par("plt")[2] - par("plt")[1]))) * par("omd")[1]) +y.top.dev.region <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par("omd")[4] - par("omd")[3]) * (par("plt")[4] - par("plt")[3]))) * (1 - par("omd")[4])) +text(x = 1, y = 1, labels = text, cex = text.size) +text(x = x.left.dev.region, y = y.top.dev.region, labels = title, adj=c(0, 1), cex = text.size) +par(ini.par) } -################ Exporting results (text & tables) +################ gg graphics -######## fun_export_data() #### Print string or data object into output file +######## fun_gg_palette() #### ggplot2 default color palette # Check OK: clear to go Apollo -fun_export_data <- function(data = NULL, output ="results.txt", path = "C:/Users/Gael/Desktop", no.overwrite = TRUE, rownames.kept = FALSE, vector.cat = FALSE, noquote = TRUE, sep = 2){ - # AIM: - # log file function: print a character string or a data object into a same output file - # REQUIRED FUNCTIONS - # fun_param_check() - # ARGUMENTS - # data: object to print in the output file. cannot be NULL - # output: name of the output file - # path: location of the output file - # no.overwrite: (logical) if output file already exists, defines if the printing is appended (default TRUE) or if the output file content is erased before printing (FALSE) - # rownames.kept: (logical) defines whether row names have to be removed or not in small tables (less than length.rows rows) - # vector.cat (logical). If TRUE print a vector of length > 1 using cat() instead of capture.output(). Otherwise (default FALSE) the opposite - # noquote: (logical). If TRUE no quote are present for the characters - # sep: number of separating lines after printed data (must be integer) - # RETURN - # nothing - # EXAMPLES - # fun_export_data() - # fun_export_data(data = 1:3, output = "results.txt", path = "C:/Users/Gael/Desktop", no.overwrite = TRUE, rownames.kept = FALSE, vector.cat = FALSE, noquote = FALSE, sep = 2) - # DEBUGGING - # data = 1:3 ; output = "results.txt" ; path = "C:/Users/Gael/Desktop" ; no.overwrite = TRUE ; rownames.kept = FALSE ; vector.cat = FALSE ; noquote = FALSE ; sep = 2 # for function debugging - # required function checking - if(length(find("fun_param_check", mode = "function")) == 0){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_export_data(): REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") - stop(tempo.cat) - } - # end required function checking - # argument checking - if(is.null(data)){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_export_data(): data ARGUMENT CANNOT BE NULL\n\n================\n\n") - stop(tempo.cat) - } - arg.check <- NULL # for function debbuging - checked.arg.names <- NULL # for function debbuging - ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) - tempo <- fun_param_check(data = output, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = path, class = "character", length = 1) ; eval(ee) - tempo <- fun_param_check(data = no.overwrite, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = rownames.kept, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = vector.cat, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = noquote, class = "logical", length = 1) ; eval(ee) - tempo <- fun_param_check(data = sep, typeof = "integer", length = 1, double.as.integer.allowed = TRUE) ; eval(ee) - if(any(arg.check) == TRUE){ - stop() # nothing else because print = TRUE by default in fun_param_check() - } - # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_check_dev)) # activate this line and use the function to check arguments status and if they have been checked using fun_param_check() - # the 4 next lines are inactivated but kept because at a time, I might have a problem with data (solved with data = NULL). These 4 lines are just to know how to detect a missing argument. Important here because if data is not provided, print the code of the data function - # arg.user.list <- as.list(match.call(expand.dots=FALSE))[-1] # recover all the arguments provided by the function user (excluding the argument with defaults values not provided by the user. Thus, it is really the list indicated by the user) - # default.arg.list <- formals(fun = sys.function(sys.parent())) # list of all the arguments of the function with their default values (not the values of the user !). It seems that ls() as first line of the function provide the names of the arguments (empty, called, etc., or not) - # arg.without.default.value <- sapply(default.arg.list, is.symbol) & sapply(sapply(default.arg.list, as.character), identical, "") # logical to detect argument without default values (these are typeof "symbol" and class "name" and empty character - # if( ! all(names(default.arg.list)[arg.without.default.value] %in% names(arg.user.list))){ # test that the arguments with no null values are provided by the user - # tempo.cat <- paste0("\n\n================\n\nERROR IN fun_export_data(): VALUE REQUIRED FOR THESE ARGUMENTS WITH NO DEFAULTS VALUES: ", paste(names(default.arg.list)[arg.without.default.value][ ! names(default.arg.list)[arg.without.default.value] %in% names(arg.user.list)], collapse = " "), "\n\n================\n\n") - #stop(tempo.cat) - # } - if(output == ""){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_export_data(): output ARGUMENT DOES NOT CORRESPOND TO A VALID CHARACTER STRING\n\n================\n\n") - stop(tempo.cat) - } - if(dir.exists(path) == FALSE){ - tempo.cat <- paste0("\n\n================\n\nERROR IN fun_export_data(): path ARGUMENT DOES NOT CORRESPOND TO EXISTING DIRECTORY\n\n================\n\n") - stop(tempo.cat) - } - # end argument checking - if(all(class(data) %in% c("matrix", "data.frame", "table"))){ - if(rownames.kept == FALSE & all(class(data) == "data.frame") & nrow(data) != 0 & nrow(data) <= 4){ # for data frames with nrows <= 4 - rownames.output.tables <- "" - length.rows <- nrow(data) - for(i in 1:length.rows){ # replace the rownames of the first 4 rows by increasing number of spaces (beacause identical row names not allowed in data frames). This method cannot be extended to more rows as the printed data frame is shifted on the right because of "big empty rownames" - rownames.output.tables <- c(rownames.output.tables, paste0(rownames.output.tables[i]," ", collapse="")) - } - row.names(data) <- rownames.output.tables[1:length.rows] - }else if(rownames.kept == FALSE & all(class(data) %in% c("matrix", "table"))){ - rownames(data) <- rep("", nrow(data)) # identical row names allowed in matrices and tables - } - if(noquote == TRUE){ - capture.output(noquote(data), file=paste0(path, "/", output), append = no.overwrite) - }else{ - capture.output(data, file=paste0(path, "/", output), append = no.overwrite) - } - }else if(is.vector(data) & all(class(data) != "list") & (length(data) == 1 | vector.cat == TRUE)){ - if(noquote == TRUE){ - cat(noquote(data), file= paste0(path, "/", output), append = no.overwrite) - }else{ - cat(data, file= paste0(path, "/", output), append = no.overwrite) - } - }else{ # other (array, list, factor or vector with vector.cat = FALSE) - if(noquote == TRUE){ - capture.output(noquote(data), file=paste0(path, "/", output), append = no.overwrite) - }else{ - capture.output(data, file=paste0(path, "/", output), append = no.overwrite) - } - } - sep.final <- paste0(rep("\n", sep), collapse = "") - write(sep.final, file= paste0(path, "/", output), append = TRUE) # add a sep +fun_gg_palette <- function(n){ +# AIM +# provide colors used by ggplot2 +# the interest is to use another single color that is not the red one used by default +# for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html +# ARGUMENTS +# n: number of groups on the graph +# REQUIRED PACKAGES +# none +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# RETURN +# the vector of hexadecimal colors +# EXAMPLES +# fun_gg_palette(n = 2) +# plot(1, pch = 16, cex = 5, col = fun_gg_palette(n = 2)[2]) # second color of the two color ggplot2 palette +# DEBUGGING +# n = 0 +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = n, class = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & n == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": n ARGUMENT MUST BE A NON ZERO INTEGER. HERE IT IS: ", paste(n, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +hues = seq(15, 375, length = n + 1) +hcl(h = hues, l = 65, c = 100)[1:n] +} + + +######## fun_gg_scatter() #### ggplot2 scatterplot + lines (up to 6 overlays totally) + + +# Check OK: clear to go Apollo +fun_gg_scatter <- function(data1, x, y, categ = NULL, legend.name = NULL, color = NULL, geom = "geom_point", xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 1, li.size = 0.5, alpha = 0.5, title = "", text.size = 12, return = FALSE, classic = FALSE, path.lib = NULL){ +# AIM +# ggplot2 scatterplot with the possibility to overlay dots from up to 3 different data frames and lines from up to 3 different data frames (up to 6 overlays totally) +# 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) +# ARGUMENTS +# data1: a dataframe compatible with ggplot, or a list of data frames +# x: character string or list of character string (one compartment for each list compartment of data1) of the data1 column name for x-axis +# y: character string or list of character string (one compartment for each list compartment of data1) of the data1 column name for y-axis. Write NULL for hline or vline geom +# categ: character string or list of character string (one compartment for each list compartment of data1) of the data1 column name for categories. If categ = NULL, no categories (no legend). Some of the list compartments can be NULL, and other not +# legend.name: character string list of character string (one compartment for each list compartment of data1) of the legend title. If legend.name = NULL and categ != NULL, then legend.name <- categ. Some of the list compartments can be NULL, and other not +# color: vector of character string or list of character vectors (one compartment for each list compartment of data1) for the colors of categ arguments. If color = NULL, default colors of ggplot2. If non null, it can be either: (1) a single color string (all the dots of the corresponding data1 will have this color, whatever categ NULL or not), (2) if categ non null, a vector of string colors, one for each class of categ (each color will be associated according to the alphabetical order of categ classes), (3) if categ non null, a vector or factor of string colors, like if it was one of the column of data1 data frame (beware: a single color per class of categ and a single class of categ per color must be respected). 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. If color is a list, some of the compartments can be NULL. In that case, a different grey color will be used for each NULL compartment +# geom: character string or list of character string (one compartment for each list compartment of data1) for the kind of plot. Either "geom_point" (scatterplot), "geom_line" (coordinates plotted then line connection from the lowest to highest coordinates), "geom_path" (line connection respecting the order in data1), "geom_hline" (horizontal line) or "geom_vline" (vertical line). BEWARE: for "geom_hline" or "geom_vline", (1) y argument must be NULL, (2) 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 +# xlim: 2 numeric values for x-axis range. If NULL, range of x of all the data frames in data1 +# ylim: 2 numeric values for y-axis range. If NULL, range of y of all the data frames in data1 +# extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to xlim and ylim. If different from 0, add the range of the axis * extra.margin (e.g., abs(xlim[2] - xlim[1]) * extra.margin) on each side of the axis +# xlab: a character string for x-axis legend. If NULL, x of the first data frame in data1. Warning message if the x are different between data frames in data1 +# ylab: a character string y-axis legend. If NULL, y of the first data frame in data1. Warning message if the y are different between data frames in data1 +# pt.size: numeric value of point size +# li.size: numeric value of line size +# alpha: numeric value (from 0 to 1) of the mask transparency +# title: character string of the graph title +# text.size: numeric value of the text size (in points) +# return: logical. Return the graph parameters? +# classic: logical. Use the classic theme (article like)? +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# ggplot2 +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# fun_pack_import() +# fun_gg_palette() +# RETURN +# a scatter plot +# a list of the graph info if return argument is TRUE: +# data: the graphic info coordinates +# warnings: the warning messages +# EXAMPLES +# obs1 <- data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = names(obs1)[1]), y = list(L1 = names(obs1)[2]), categ = list(L1 = names(obs1)[3]), legend.name = NULL, color = NULL, geom = list(L1 = "geom_point"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 1, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = FALSE, classic = FALSE) +# obs1 <- data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = names(obs1)[1]), y = list(L1 = names(obs1)[2]), categ = NULL, legend.name = NULL, geom = list(L1 = "geom_point"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = "test_x", ylab = "test_y", color = list(L1 = 5), pt.size = 2, li.size = 0.5, alpha = 1, title = "GRAPH1", text.size = 15, return = TRUE, classic = FALSE) +# obs1 <- data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = names(obs1)[1]), y = list(L1 = names(obs1)[2]), categ = NULL, legend.name = NULL, geom = list(L1 = "geom_path"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = "test_x", ylab = "test_y", color = list(L1 = 5), pt.size = 2, li.size = 0.5, alpha = 1, title = "GRAPH1", text.size = 15, return = TRUE, classic = FALSE) +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1"))) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2]), categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3]), legend.name = list(L1 = "GROUP1", L2 = "GROUP2"), color = list(L1 = fun_gg_palette(4)[1:2], L2 = fun_gg_palette(4)[3:4]), geom = list(L1 = "geom_point", L2 = "geom_point"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 2, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = FALSE, path.lib = NULL) +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A2", "A2", "A3", "A3", "B1", "B1"))) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = names(data1$L3)[2]), categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3], L3 = names(data1$L3)[3]), legend.name = NULL, color = list(L1 = fun_gg_palette(7)[1:2], L2 = fun_gg_palette(7)[3:4], L3 = fun_gg_palette(7)[5:7]), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_path"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 4, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = FALSE, path.lib = NULL) +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A2", "A2", "A3", "A3", "B1", "B1"))) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = names(data1$L3)[2]), categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3], NULL), legend.name = NULL, color = list(L1 = fun_gg_palette(7)[1:2], L2 = fun_gg_palette(7)[3:4], L3 = NULL), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_path"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 4, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = FALSE, path.lib = NULL) +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A4", "A5", "A6", "A7", "B4", "B5"))) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = NULL), categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3], L3 = names(data1$L3)[3]), legend.name = NULL, color = list(L1 = "red", L2 = "blue", L3 = "green"), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_vline"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 4, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = FALSE, path.lib = NULL) +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A4", "A5", "A6", "A7", "B4", "B5"))) ; data1$L1$a[3] <- NA ; data1$L1$group[5] <- NA ; data1$L3$group3[4] <- NA ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = NULL), categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3], L3 = names(data1$L3)[3]), legend.name = NULL, color = list(L1 = "red", L2 = "blue", L3 = "green"), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_vline"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 4, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = FALSE, path.lib = NULL) +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A2", "A2", "A3", "A3", "B1", "B1"))) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = names(data1$L3)[2]), categ = NULL, legend.name = list(L1 = "A", L2 = "B", L3 = "C"), color = list(L1 = "black", L2 = 2, L3 = "purple"), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_point"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 1, li.size = 0.5, alpha = 1, title = "GRAPH1", text.size = 20, return = TRUE, classic = TRUE, path.lib = NULL) +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A1", "A2", "A3", "B1", "B2", "B3"))) ; data1$L1$a[2:3] <- NA ; x = list(L1 = names(data1$L1)[1]) ; y = list(L1 = NULL) ; categ = list(L1 = names(data1$L1)[3]) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1]), y = list(L1 = NULL), categ = list(L1 = names(data1$L1)[3]), legend.name = list(L1 = "VALUE"), color = list(L1 = "red"), geom = list(L1 = "geom_hline"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 1, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = TRUE, path.lib = NULL) +# DEBUGGING +# data1 <- data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")) ; x = names(data1)[1] ; y = names(data1)[2] ; categ = names(data1)[3] ; legend.name = NULL ; color = NULL ; geom = "geom_point" ; xlim = NULL ; ylim = NULL ; extra.margin = 0.05 ; xlab = NULL ; ylab = NULL ; pt.size = 1 ; li.size = 0.5 ; alpha = 0.5 ; title = "GRAPH1" ; text.size = 12 ; return = FALSE ; classic = FALSE ; path.lib = NULL +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B"))) ; x = list(L1 = names(data1$L1)[1]) ; y = list(L1 = names(data1$L1)[2]) ; categ = list(L1 = names(data1$L1)[3]) ; legend.name = list(L1 = "VALUE") ; color = NULL ; geom = list(L1 = "geom_point") ; xlim = NULL ; ylim = NULL ; extra.margin = 0.05 ; xlab = NULL ; ylab = NULL ; pt.size = 1 ; li.size = 0.5 ; alpha = 0.5 ; title = "GRAPH1" ; text.size = 12 ; return = FALSE ; classic = FALSE ; path.lib = NULL +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1"))) ; x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1]) ; y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2]) ; categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3]) ; legend.name = list(L1 = "GROUP1", L2 = "GROUP2") ; color = NULL ; geom = list(L1 = "geom_point", L2 = "geom_path") ; xlim = NULL ; ylim = NULL ; extra.margin = 0.05 ; xlab = NULL ; ylab = NULL ; pt.size = 1 ; li.size = 0.5 ; alpha = 0.5 ; title = "GRAPH1" ; text.size = 12 ; return = FALSE ; classic = FALSE ; path.lib = NULL +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group1 = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group2 = c("A1", "A1", "A1", "B1", "B1", "B1"))) ; x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1]) ; y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2]) ; categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3]) ; legend.name = list(L1 = "GROUP1", L2 = "GROUP2") ; color = list(L1 = 1:2, L2 = 3:4) ; geom = list(L1 = "geom_point", L2 = "geom_line") ; xlim = NULL ; ylim = NULL ; extra.margin = 0.05 ; xlab = NULL ; ylab = NULL ; pt.size = 2 ; li.size = 0.5 ; alpha = 0.5 ; title = "GRAPH1" ; text.size = 12 ; return = TRUE ; classic = FALSE ; path.lib = NULL +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B"))) ; x = list(L1 = names(data1$L1)[1]) ; y = list(L1 = names(data1$L1)[2]) ; categ = NULL ; legend.name = NULL ; color = list(L1 = 5) ; geom = list(L1 = "geom_point") ; xlim = NULL ; ylim = NULL ; extra.margin = 0.05 ; xlab = "x test" ; ylab = "y test" ; pt.size = 2 ; li.size = 0.5 ; alpha = 1 ; title = "GRAPH1" ; text.size = 15 ; return = TRUE ; classic = FALSE ; path.lib = NULL +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A1", "A2", "A3", "B1", "B2", "B3"))) ; x = list(L1 = names(data1$L1)[1]) ; y = list(L1 = NULL) ; categ = list(L1 = names(data1$L1)[3]) ; legend.name = list(L1 = "VALUE") ; color = list(L1 = "red") ; geom = list(L1 = "geom_hline") ; xlim = NULL ; ylim = NULL ; extra.margin = 0.05 ; xlab = NULL ; ylab = NULL ; pt.size = 1 ; li.size = 0.5 ; alpha = 0.5 ; title = "GRAPH1" ; text.size = 12 ; return = TRUE ; classic = TRUE ; path.lib = NULL +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A1", "A2", "A3", "B1", "B2", "B3"))) ; data1$L1$a[2:3] <- NA ; x = list(L1 = names(data1$L1)[1]) ; y = list(L1 = NULL) ; categ = list(L1 = names(data1$L1)[3]) ; legend.name = list(L1 = "VALUE") ; color = list(L1 = "red") ; geom = list(L1 = "geom_hline") ; xlim = NULL ; ylim = NULL ; extra.margin = 0.05 ; xlab = NULL ; ylab = NULL ; pt.size = 1 ; li.size = 0.5 ; alpha = 0.5 ; title = "GRAPH1" ; text.size = 12 ; return = TRUE ; classic = TRUE ; path.lib = NULL +# data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A4", "A5", "A6", "A7", "B4", "B5"))) ; data1$L1$a[3] <- NA ; data1$L1$group[5] <- NA ; data1$L3$group3[4] <- NA ; x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]) ; y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = NULL) ; categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3], L3 = names(data1$L3)[3]) ; legend.name = NULL ; color = list(L1 = "red", L2 = "blue", L3 = "green") ; geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_vline") ; xlim = NULL ; ylim = NULL ; extra.margin = 0.05 ; xlab = NULL ; ylab = NULL ; pt.size = 4 ; li.size = 0.5 ; alpha = 0.5 ; title = "GRAPH1" ; text.size = 12 ; return = TRUE ; classic = FALSE ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack_import", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack_import() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_gg_palette", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_palette() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# check list lengths (and names of data1 compartments if non name present) +warning <- NULL +if(all(class(data1) == "list")){ +if(length(data1) > 6){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data1 ARGUMENT MUST BE A LIST OF 6 DATA FRAMES MAXIMUM (6 OVERLAYS MAX)\n\n================\n\n") +stop(tempo.cat) +} +if(is.null(names(data1))){ +names(data1) <- paste0("L", 1:length(data1)) +tempo.warning <- paste0("NULL NAME COMPARTMENT OF data1 LIST -> NAMES RESPECTIVELY ATTRIBUTED TO EACH COMPARTMENT:\n", paste(names(data1), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +if( ! (all(class(x) == "list") & length(data1) == length(x))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": x ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +if( ! (all(class(y) == "list") & length(data1) == length(y))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(categ)){ +if( ! (all(class(categ) == "list") & length(data1) == length(categ))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(legend.name)){ +if( ! (all(class(legend.name) == "list") & length(data1) == length(legend.name))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! is.null(color)){ +if( ! (all(class(color) == "list") & length(data1) == length(color))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +} +if( ! (all(class(geom) == "list") & length(data1) == length(geom))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST\n\n================\n\n") +stop(tempo.cat) +} +} +# end check list lengths (and names of data1 compartments if non name present) +# conversion into lists +if(all(is.data.frame(data1))){ +data1 <- list(L1 = data1) +if(all(class(x) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": x ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +x <- list(L1 = x) +} +if(all(class(y) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +y <- list(L1 = y) +} +if( ! is.null(categ)){ +if(all(class(categ) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +categ <- list(L1 = categ) +} +} +if( ! is.null(legend.name)){ +if(all(class(legend.name) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": legend.name ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +legend.name <- list(L1 = legend.name) +} +} +if( ! is.null(color)){ +if(all(class(color) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +color <- list(L1 = color) +} +} +if(all(class(geom) == "list")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME\n\n================\n\n") +stop(tempo.cat) +}else{ +geom <- list(L1 = geom) +} +} +# end conversion into lists +# 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 +} +# end legend name filling +# integer colors into gg_palette +tempo.check.color <- NULL +for(i1 in 1:length(data1)){ +if(any(is.na(color[[i1]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": color ARGUMENT CANNOT CONTAIN NA\n\n================\n\n") +stop(tempo.cat) +} +tempo.check.color <- c(tempo.check.color, fun_param_check(data = color[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name, print = FALSE)$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 +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +compart.null.color <- 0 # will be used to attribute a color when color is non NULL but a compatment of color is NULL +data1.ini <- data1 # to report NA removal +removed.row.nb <- vector("list", length = length(data1)) # to report NA removal +removed.rows <- vector("list", length = length(data1)) # to report NA removal +for(i1 in 1:length(data1)){ +tempo <- fun_param_check(data = data1[[i1]], data.name = ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = x[[i1]], data.name = ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +# check of geom now because required for y argument +tempo <- fun_param_check(data = geom[[i1]], data.name = ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), options = c("geom_point", "geom_line", "geom_path", "geom_hline", "geom_vline"), length = 1, fun.name = function.name) ; eval(ee) +# end check of geom now because required for y argument +if(is.null(y[[i1]])){ +if(all(geom[[i1]] != "geom_hline") & all(geom[[i1]] != "geom_vline")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": y ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom) == 1, "y", paste0("geom NUMBER ", i1)), " ARGUMENT IS\"geom_hline\" OR \"geom_vline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else{ +y[[i1]] <- "fake_y" +data1[[i1]] <- cbind(data1[[i1]], fake_y = NA) +data1[[i1]][, "fake_y"] <- as.numeric(data1[[i1]][, "fake_y"]) +tempo.warning <- paste0("NULL ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom) == 1, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", NAMED \"fake_y\" FOR FINAL DRAWING") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +}else{ +if(all(geom[[i1]] == "geom_hline") | all(geom[[i1]] == "geom_vline")){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ": y ARGUMENT CANNOT BE NON NULL IF ", ifelse(length(geom) == 1, "y", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\" OR \"geom_vline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +tempo <- fun_param_check(data = y[[i1]], data.name = ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +if( ! (x[[i1]] %in% names(data1[[i1]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\n\n================\n\n") +stop(tempo.cat) +} +if( ! (y[[i1]] %in% names(data1[[i1]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\n\n================\n\n") +stop(tempo.cat) +} +# na detection and removal (done now to be sure of the correct length of categ) +if(any(is.na(data1[[i1]][, c(x[[i1]], if(y[[i1]] == "fake_y"){NULL}else{y[[i1]]})]))){ +tempo.removed.row.nb <- unlist(lapply(lapply(c(data1[[i1]][c(x[[i1]], if(y[[i1]] == "fake_y"){NULL}else{y[[i1]]})]), FUN = is.na), FUN = which)) +removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], tempo.removed.row.nb) +# report of removed rows will be performed at the very end +data1[[i1]] <- data1[[i1]][-tempo.removed.row.nb, ] +tempo.warning <- paste0("NA DETECTED IN COLUMN ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), if(y[[i1]] == "fake_y"){""}else{paste0(" AND ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)))}, " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ". CORRESPONDING ROWS HAVE BEEN REMOVED (SEE $removed.row.nb AND $removed.rows)") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end na detection and removal (done now to be sure of the correct length of categ) +tempo <- fun_param_check(data = data1[[i1]][, x[[i1]]], data.name = ifelse(length(x) == 1, "x OF data1", paste0("x NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "vector", mode = "numeric", na.contain = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = data1[[i1]][, y[[i1]]], data.name = ifelse(length(y) == 1, "y OF data1", paste0("y NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "vector", mode = "numeric", na.contain = ifelse(y[[i1]] == "fake_y", TRUE, FALSE), fun.name = function.name) ; eval(ee) +if(( ! is.null(categ)) & ( ! is.null(categ[[i1]]))){ # if categ[[i1]] = NULL, fake_categ will be created later on +tempo <- fun_param_check(data = categ[[i1]], data.name = ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)),, class = "vector", mode = "character", length = 1, fun.name = function.name) +if( ! (categ[[i1]] %in% names(data1[[i1]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\n\n================\n\n") +stop(tempo.cat) +} +# na detection and removal (done now to be sure of the correct length of categ) +if(any(is.na(data1[[i1]][, categ[[i1]]]))){ +tempo.removed.row.nb <- unlist(lapply(lapply(c(data1[[i1]][categ[[i1]]]), FUN = is.na), FUN = which)) +removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], tempo.removed.row.nb) +# report of removed rows will be performed at the very end +data1[[i1]] <- data1[[i1]][-tempo.removed.row.nb, ] +tempo.warning <- paste0("IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE CATEGORY COLUMN:\n", paste(categ[[i1]], collapse = " "), "\nCONTAINS NA") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end na detection and removal (done now to be sure of the correct length of categ) +tempo1 <- fun_param_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "vector", mode = "character", na.contain = FALSE, fun.name = function.name, print = FALSE) +tempo2 <- fun_param_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), class = "factor", na.contain = FALSE, fun.name = function.name, print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), " MUST BE A FACTOR OR CHARACTER VECTOR\n\n================\n\n") +stop(tempo.cat) +}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 +tempo.warning <- paste0("IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) + +} +if(geom[[i1]] == "geom_vline" | geom[[i1]] == "geom_hline"){ +if(length(unique(data1[[i1]][, categ[[i1]]])) != nrow(data1[[i1]])){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(geom) == 1, "geom OF data1", paste0("geom NUMBER ", i1, " OF data1 NUMBER ", i1)), " ARGUMENT IS ", geom[[i1]], ", MEANING THAT ", ifelse(length(categ) == 1, "categ OF data1", paste0("categ NUMBER ", i1, " OF data1 NUMBER ", i1)), " MUST HAVE A DIFFERENT CLASS PER LINE OF data1 (ONE x VALUE PER CLASS)\n\n================\n\n") +stop(tempo.cat) +} +} +}else if(( ! is.null(categ)) & is.null(categ[[i1]])){ # if categ[[i1]] = NULL, fake_categ will be created +categ[[i1]] <- "fake_categ" +data1[[i1]] <- cbind(data1[[i1]], fake_categ = "") +data1[[i1]][, "fake_categ"] <- as.numeric(data1[[i1]][, "fake_categ"]) +tempo.warning <- paste0("NULL ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " ARGUMENT -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", NAMED \"fake_categ\" FOR FINAL DRAWING") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +if( ! is.null(legend.name[[i1]])){ +tempo <- fun_param_check(data = legend.name[[i1]], data.name = ifelse(length(legend.name) == 1, "legend.name", paste0("legend.name NUMBER ", i1)),, class = "vector", mode = "character", length = 1, fun.name = function.name) +} +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 +tempo.warning <- paste0("NULL COLOR IN ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", SINGLE COLOR ", paste(color[[i1]], collapse = " "), " HAS BEEN ATTRIBUTED") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +tempo1 <- fun_param_check(data = color[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) +tempo2 <- fun_param_check(data = color[[i1]], data.name = ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR\n\n================\n\n") # integer possible because dealt above +stop(tempo.cat) +}else if( ! (all(color[[i1]] %in% colors() | grepl(pattern = "^#", color[[i1]])))){ # check that all strings of low.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(color[[i1]]), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +if(any(is.na(color[[i1]]))){ +tempo.warning <- paste0("IN ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE COLORS:\n", paste(unique(color[[i1]]), collapse = " "), "\nCONTAINS NA") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end check the nature of color +# check the length of color +if(is.null(categ) & length(color[[i1]]) != 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE A SINGLE COLOR IF categ IS NULL\n\n================\n\n") +stop(tempo.cat) +}else if( ! is.null(categ)){ +# No problem of NA management by ggplot2 because already removed +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 +tempo.warning <- paste0("IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", THE FOLLOWING COLORS:\n", paste(color[[i1]], collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}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]]) +tempo.check <- unique(data1[[i1]][ , c(categ[[i1]], "color")]) +if( ! (nrow(tempo.check) == length(color[[i1]]) & nrow(tempo.check) == length(unique(data1[[i1]][ , categ[[i1]]])))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT HAS THE LENGTH OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " COLUMN VALUES\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"), "\n\n================\n\n") +stop(tempo.cat) +}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]]]))) +tempo.warning <- paste0(ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT HAS THE LENGTH OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " 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 = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +}else if(length(color[[i1]]) == 1){ +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]]]))) +tempo.warning <- paste0("IN ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), ", COLOR HAS LENGTH 1 MEANING THAT ALL THE DIFFERENT CLASSES OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), "\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(color[[i1]], collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), " COLUMN VALUES, OR (3) THE LENGTH OF THE CLASSES IN THIS COLUMN. HERE 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]]])), "\n\n================\n\n") +stop(tempo.cat) +} +} +} +} +if(length(data1) > 1){ +if(length(unique(unlist(x))) > 1){ +tempo.warning <- paste0("THE x ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(x), collapse = " "), "\nX-AXIS OVERLAYING DIFFERENT VARIABLES?") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +if(length(data1) > 1){ +if(length(unique(unlist(y))) > 1){ +tempo.warning <- paste0("THE y ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(y), collapse = " "), "\nY-AXIS OVERLAYING DIFFERENT VARIABLES?") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +if(sum(geom %in% "geom_point") > 3){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN FOUR \"geom_point\" ELEMENTS\n\n================\n\n") +stop(tempo.cat) +}else if(length(geom) - sum(geom %in% "geom_point") > 3){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE LINE ELEMENTS\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(xlim)){ +tempo <- fun_param_check(data = xlim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) +} +if( ! is.null(ylim)){ +tempo <- fun_param_check(data = ylim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(xlab)){ +tempo <- fun_param_check(data = xlab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +if( ! is.null(ylab)){ +tempo <- fun_param_check(data = ylab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = pt.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = li.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = classic, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_param_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# package checking +fun_pack_import(req.package = c("ggplot2"), path.lib = path.lib) +# end package checking +# main code +# used for conversion of geom_hline and geom_vline +for(i1 in 1:length(data1)){ # for geom_hline, x put into y, and x <- NA before xlim and ylim +if(geom[[i1]] == "geom_hline"){ +data1[[i1]][, y[[i1]]] <- data1[[i1]][, x[[i1]]] +# data1[[i1]][, x[[i1]]] <- NA +} +} +# end used for conversion of geom_hline and geom_vline +tempo.x.range <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)), na.rm = TRUE)) +tempo.y.range <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)), na.rm = TRUE)) +if(suppressWarnings(all(tempo.x.range %in% c(Inf, -Inf))) | suppressWarnings(all(tempo.y.range %in% c(Inf, -Inf)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " geom_hline AND geom_vline CONVERSION: ", ifelse(length(x) == 1, "x", paste0("x NUMBER ", i1)), " AND ", ifelse(length(y) == 1, "y", paste0("y NUMBER ", i1)), " ARGUMENTS ARE NA ONLY\n\n================\n\n") +stop(tempo.cat) +} +if(is.null(xlim)){ +# if(suppressWarnings(all(tempo.x.range %in% c(Inf, -Inf)))){ +# xlim <- tempo.y.range # because of the switch for geom_hline +# }else{ +xlim <- tempo.x.range +# } +} +if(is.null(ylim)){ +# if(suppressWarnings(all(tempo.y.range %in% c(Inf, -Inf)))){ +# ylim <- tempo.x.range # because of the switch for geom_hline +# }else{ +ylim <- tempo.y.range +# } +} +if( ! is.null(extra.margin)){ +xlim <- sort(xlim) +xlim[1] <- xlim[1] - abs(xlim[2] - xlim[1]) * extra.margin +xlim[2] <- xlim[2] + abs(xlim[2] - xlim[1]) * extra.margin +ylim <- sort(ylim) +ylim[1] <- ylim[1] - abs(ylim[2] - ylim[1]) * extra.margin +ylim[2] <- ylim[2] + abs(ylim[2] - ylim[1]) * extra.margin +} +# 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 = "") +} +tempo.warning <- paste0("NULL categ ARGUMENT -> FAKE COLUMN ADDED TO EACH DATA FRAME IN data1, NAMED \"fake_categ\" AND FILLED WITH \"\"") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end create a fake categ if NULL to deal with legend display +# vector of color with length as in 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)])}) +total.categ.length <- sum(unlist(length.categ.list), na.rm = TRUE) +tempo.color <- fun_gg_palette(total.categ.length) +tempo.count <- 0 +for(i3 in 1:length(data1)){ +color[[i3]] <- tempo.color[(1:length.categ.list[[i3]]) + tempo.count] +tempo.count <- tempo.count + length.categ.list[[i3]] +tempo.warning <- paste0("NULL color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i3)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i3)), ":\n", paste(unlist(color), collapse = " "), "\n", paste(names(data1), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +# end vector of color with length as in data1 +# last check +for(i1 in 1:length(data1)){ +if(length(color[[i1]]) != length(unique(data1[[i1]][, categ[[i1]]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\n\n================\n\n") +stop(tempo.cat) +} +} +# 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, ]) +if(geom[[i1]] == "geom_hline"){ +tempo.data.frame[, x[[i1]]] <- xlim +}else if(geom[[i1]] == "geom_vline"){ +tempo.data.frame[, y[[i1]]] <- ylim +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE INCONSISTENCY\n\n============\n\n")) +stop(tempo.cat) +} +tempo.data.frame[, categ[[i1]]] <- paste0("Line_", i3) +final.data.frame <- rbind(final.data.frame, tempo.data.frame) +} +data1[[i1]] <- final.data.frame +geom[[i1]] <- "geom_line" +if(length(color[[i1]]) == 1){ +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("\n\n================\n\nERROR IN ", function.name, " geom_hline AND geom_vline CONVERSION: ", ifelse(length(color) == 1, "color", paste0("color NUMBER ", i1)), " ARGUMENT MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ) == 1, "categ", paste0("categ NUMBER ", i1)), " IN ", ifelse(length(data1) == 1, "data1", paste0("data1 NUMBER ", i1)), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\n\n================\n\n") +stop(tempo.cat) +} +} +} +# end conversion of geom_hline and geom_vline + +tempo.gg.name <- "gg.indiv.plot." +tempo.gg.count <- 0 +# no need loop part +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(xlab)){x[[1]]}else{xlab})) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(ylab)){y[[1]]}else{ylab})) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_x_continuous(expand = c(0, 0), limits = NA)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous(expand = c(0, 0), limits = NA)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(xlim = xlim, ylim = ylim)) +if(classic == TRUE){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) +}else{ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme(text = ggplot2::element_text(size = text.size))) +} +# end no need loop part +point.count <- 0 +line.count <- 0 +for(i1 in 1:length(data1)){ +if(geom[[i1]] == "geom_point"){ +point.count <- point.count + 1 +if(point.count == 1){ +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), ggplot2::geom_point(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], fill = categ[[i1]]), size = pt.size, color = color[[i1]][i5], alpha = alpha, show.legend = TRUE)) # beware: a single color allowed for color argumant outside aesthetic, hence the loop +} +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 = color[[i1]], guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], linetype = 0)))) # values are the values of fill +} +if(point.count == 2){ +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), ggplot2::geom_point(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], shape = categ[[i1]]), size = pt.size, color = color[[i1]][i5], alpha = alpha, show.legend = TRUE)) # beware: a single color allowed for color argumant outside aesthetic, hence the loop +} +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(19, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], linetype = 0)))) # values are the values of shape +} +if(point.count == 3){ +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), ggplot2::geom_point(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], stroke = categ[[i1]]), size = pt.size, color = color[[i1]][i5], alpha = alpha, show.legend = TRUE)) # beware: a single color allowed for color argumant outside aesthetic, hence the loop +} +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(0.5, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], linetype = 0)))) # values are the values of stroke +} +}else{ +line.count <- line.count + 1 +if(line.count == 1){ +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), get(geom[[i1]])(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], linetype = categ[[i1]]), color = color[[i1]][i5], size = li.size, lineend = "round", show.legend = TRUE)) # beware: a single color allowed for color argumant outside aesthetic, hence the loop +} +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(1, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], shape = NA)))) # values are the values of linetype. 1 means solid +} +if(line.count == 2){ +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), get(geom[[i1]])(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], alpha = categ[[i1]]), color = color[[i1]][i5], size = li.size, lineend = "round", show.legend = TRUE)) # beware: a single color allowed for color argumant outside aesthetic, hence the loop +} +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(1, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], shape = NA)))) # values are the values of linetype. 1 means solid +} +if(line.count == 3){ +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), get(geom[[i1]])(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], size = categ[[i1]]), color = color[[i1]][i5], size = li.size, lineend = "round", show.legend = TRUE)) # beware: a single color allowed for color argumant outside aesthetic, hence the loop +} +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(1, length(color[[i1]])), guide = ggplot2::guide_legend(override.aes = list(colour = color[[i1]], shape = NA)))) # values are the values of linetype. 1 means solid +} +} +} +# no need loop part +# end no need loop part +suppressWarnings(print(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))) +if(return == TRUE){ +output <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ")))) +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]], ] +} +} +} +output <- list(data = output$data, removed.row.nb = removed.row.nb, removed.rows = removed.rows, warnings = paste0("\n", warning, "\n\n")) +return(output) +} +} + + +######## fun_gg_bar_mean() #### ggplot2 mean barplot + overlaid dots if required + + + + +# verif all coord objects, and output of aggregate anf merge to forbide some column names (like x.y) or pass them to upper case + warning + +# Check OK: clear to go Apollo +fun_gg_bar_mean <- function(data1, y, categ, categ.class.order = NULL, categ.legend.name = NULL, categ.color = NULL, bar.width = 0.5, error.disp = NULL, error.whisker.width = 0.5, dot.color = "same", dot.tidy = FALSE, dot.bin.nb = 30, dot.jitter = 0.25, dot.size = 3, dot.border.size = 0.5, dot.alpha = 0.5, ylim = NULL, ylog = FALSE, y.break.nb = NULL, y.include.zero = FALSE, y.top.extra.margin = 0.05, y.bottom.extra.margin = 0, stat.disp = NULL, stat.size = 4, stat.dist = 2, xlab = NULL, ylab = NULL, vertical = TRUE, title = "", text.size = 12, classic = FALSE, grid = FALSE, return = FALSE, path.lib = NULL){ +# AIM +# ggplot2 vertical barplot representing mean values with the possibility to add error bars and to overlay dots +# 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) +# if ever bars disappear, see the end of https://github.com/tidyverse/ggplot2/issues/2887 +# to have a single bar, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped bars, create a factor column with a single class and specify this column in categ argument as first element (categ1). See categ below +# with several single bars (categ argument with only one element), bar.width argument (i.e., width argument of ggplot2::geom_bar()) defines each bar width. The bar.width argument also defines the space between bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each bar) +# with several sets of grouped bars (categ argument with two elements), bar.width argument defines each set of grouped bar width. The bar.width argument also defines the space between set of grouped bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each set of grouped bar) +# to manually change the 0 base bar, see https://stackoverflow.com/questions/35324892/ggplot2-setting-geom-bar-baseline-to-1-instead-of-zero +# ARGUMENTS +# data1: a dataframe containing one column of values (see y argument below) and one or two columns of categories (see categ argument below) +# y: character string of the data1 column name for y-axis (containing numeric values). Numeric values will be averaged by categ to generate the bars 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 factor). Must either be one or two column names. If a single column name (further refered to as categ1), then one bar per class of categ1. If two column names (further refered to as categ1 and categ2), then one bar per class of categ2, which form a group of bars in each class of categ1. Beware, categ1 (and categ2 if it exists) must have a single value of y per class of categ1 (and categ2). To have a single bar, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped bars, create a factor column with a single class and specify this column in categ argument as first element (categ1) +# categ.class.order: list indicating the order of the classes of categ1 and categ2 represented on the barplot (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 compartment can be NULL and other not +# categ.legend.name: character string of the legend title for categ2. If categ.legend.name = NULL, then categ.legend.name <- categ1 if only categ1 is present and categ.legend.name <- categ2 if categ1 and categ2 are present. Write "" if no legend required +# categ.color: vector of character color string for bar filling. 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 bars will have this color, whatever the 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 (beware: a single color per class of categ1 and a single class of categ1 per color must be respected). 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 categ.color. If categ.color is non null and categ1 and categ2 specified, all the rules described above will apply to categ2 instead of categ1 (colors will be determined for bars inside a group of bars) +# bar.width: numeric value (from 0 to 1) of the bar or set of grouped bar width (see warnings above) +# error.disp: either "SD", "SD.TOP", "SEM" or "SEM.TOP". If NULL, no error bars added +# error.whisker.width: numeric value (from 0 to 1) of the whisker (error bar extremities) width, with 0 meaning no whiskers and 1 meaning a width equal to the corresponding bar width +# dot.color: vector of character string. Idem as categ.color but for dots, except that in the possibility (3), the rule "a single color per class of categ1 and a single class of categ1", cannot be respected (each dot can have a different color). If NULL, no dots plotted +# dot.tidy: logical. Nice dot spreading? If TRUE, use the geom_dotplot() function for a nice representation. If FALSE, dots are randomly spread, using the dot.jitter argument (see below) +# dot.bin.nb: positive integer indicating the number of bins (i.e., nb of separations) of the ylim range. Each dot will then be put in one of the bin, with the size the width of the bin. Not considered if dot.tidy is FALSE +# dot.jitter: numeric value (from 0 to 1) of random dot horizontal dispersion, with 0 meaning no dispersion and 1 meaning a dispersion in the corresponding bar width interval. Not considered if dot.tidy is TRUE +# dot.size: numeric value of dot size. Not considered if dot.tidy is TRUE +# dot.border.size: numeric value of border dot size. Write zero for no stroke +# dot.alpha: numeric value (from 0 to 1) of dot transparency (full transparent to full opaque, respectively) +# ylim: 2 numeric values for y-axis range. If NULL, range of y in data1 +# ylog: logical. Log10 scale for the y-axis? Beware: if TRUE, ylim must not contain null or negative values. In addition, will be automatically set to FALSE if vertical argument is set to FALSE, to prevent a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) +# y.break.nb: number of desired values on the y-axis +# y.include.zero: logical. Does ylim range include 0? Beware: if ylog = TRUE, will be automately set to FALSE with a warning message +# y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to ylim. If different from 0, add the range of the axis * y.top.extra.margin (e.g., abs(ylim[2] - ylim[1]) * y.top.extra.margin) to the top of y-axis. Beware with ylog = TRUE, the range result must not overlap zero or negative values +# y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis +# stat.disp: add the mean number above the corresponding bar. Either NULL (no number shown), "top" (at the top of the figure region) or "above" (above each bar) +# stat.size: numeric value of the stat size (in points). Increase the value to increase text size +# stat.dist: numeric value of the stat distance. Increase the value to increase the distance +# xlab: a character string for x-axis legend. If NULL, character string of categ1 +# ylab: a character string y-axis legend. If NULL, character string of the y argument +# vertical: logical. Vertical bars? BEWARE: cannot have horizontal bars with a log axis, i.e., ylog = TRUE & vertical = FALSE (see ylog above) +# title: character string of the graph title +# text.size: numeric value of the text size (in points) +# classic: logical. Use the classic theme (article like)? +# grid: logical. draw horizontal lines in the background to better read the bar values? Not considered if classic = FALSE +# return: logical. Return the graph parameters? +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# ggplot2 +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# fun_pack_import() +# fun_gg_palette() +# fun_round() +# fun_2D_comp() +# RETURN +# a barplot +# a list of the graph info if return argument is TRUE: +# stat: the graphic statistics +# removed.row.nb: which rows have been removed due to NA detection in y and categ columns (NULL if no row removed) +# removed.rows: removed rows containing NA (NULL if no row removed) +# data: the graphic info coordinates +# warnings: the warning messages. Use cat() for proper display. NULL if no warning +# EXAMPLES +# nice representation (1) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.class.order = list(NULL, c("B", "A")), categ.legend.name = "LEGEND", categ.color = NULL, dot.color = "same", error.disp = "SD", bar.width = 0.3, error.whisker.width = 0.8, dot.jitter = 0.5, ylim = c(10, 25), y.include.zero = TRUE, xlab = "GROUP", ylab = "MEAN", dot.size = 3.5, dot.border.size = 0.2, dot.alpha = 0.5, stat.disp = "above", stat.size = 4, title = "GRAPH1", text.size = 20, return = TRUE, y.break.nb = NULL, classic = TRUE, grid = TRUE) +# nice representation (2) +# set.seed(1) ; obs1 <- data.frame(a = c(rnorm(24, 0), rnorm(24, -10), rnorm(24, 10), rnorm(24, 20)), group1 = rep(c("G", "H"), times = 48), group2 = rep(c("A", "B", "C", "D"), each = 24)) ; set.seed(NULL) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.class.order = list(NULL, c("B", "A", "D", "C")), categ.legend.name = "LEGEND", categ.color = NULL, dot.color = "same", bar.width = 0.8, dot.tidy = TRUE, dot.bin.nb = 60, ylim= c(-20, 25), vertical = FALSE, xlab = "GROUP", ylab = "MEAN", dot.size = 3.5, dot.border.size = 0.2, dot.alpha = 1, stat.disp = "above", stat.size = 4, stat.dist = 1, title = "GRAPH1", text.size = 20, return = TRUE, y.break.nb = NULL, classic = FALSE) +# separate bars, modification of bar color (1) (a single value) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", categ.color = "white") +# separate bars, modification of bar color (2) (one value par class of categ2) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", categ.color = c("red", "blue")) +# separate bars, modification of bar color (3) (one value per line of obs1, with respect of the correspondence between categ2 and bar.color columns) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), bar.color = rep(c("brown", "orange"), time = 10)) ; obs1 ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", categ.color = obs1$bar.color) +# separate bars, modification of dot color (1) (same dot color as the corresponding bar) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = "same") +# separate bars, modification of dot color (2) (single color for all the dots) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = "green") +# separate bars, modification of dot color (3) (one value par class of categ2) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = c("green", "brown")) +# separate bars, modification of dot color 4 (any color for each dot) +# obs1 <- data.frame(a = 1:10, group1 = rep(c("G", "H"), times = 5)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = hsv(h = (1:nrow(obs1)) / nrow(obs1))) +# grouped bars, default arguments +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2")) +# more grouped bars +# obs1 <- data.frame(a = 1:24, group1 = rep(c("G", "H"), times = 12), group2 = rep(c("A", "B", "C", "D"), each = 6)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), return = TRUE) +# grouped bars, log scale. Beware, y column must be log, otherwise incoherent scale +# obs1 <- data.frame(a = log10((1:20) * 100), group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), ylog = TRUE) +# grouped bars, no dots (y.include.zero = TRUE to see the lowest bar) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, y.include.zero = TRUE) +# grouped bars, modification of bar color (1) (a single value) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.color = "white") +# grouped bars, modification of bar color (2) (one value par class of categ2) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.color = c("red", "blue")) +# grouped bars, modification of bar color (3) (one value per line of obs1, with respect of the correspondence between categ2 and bar.color columns) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; obs1 ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.color = obs1$bar.color) +# grouped bars, modification of dot color (1) (same dot color as the corresponding bar) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "same") +# grouped bars, modification of dot color (2) (single color for all the dots) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "green") +# grouped bars, modification of dot color (3) (one value par class of categ2) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = c("green", "brown")) +# grouped bars, modification of dot color (4) (any color for each dot) +# obs1 <- data.frame(a = 1:10, group1 = rep(c("G", "H"), times = 5), group2 = rep(c("A", "B"), each = 5)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = hsv(h = (1:nrow(obs1)) / nrow(obs1))) +# width example. With bar.width = 0.25, three times more space between single bars than the bar width +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), each = 500)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = NULL, bar.width = 0.25, y.include.zero = TRUE) +# width example. With bar.width = 1, no space between single bars +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), each = 500)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = NULL, bar.width = 1, y.include.zero = TRUE) +# width example. With bar.width = 0.25, three times more space between sets of grouped bars than the set width +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, bar.width = 0.25, y.include.zero = TRUE) +# width example. With bar.width = 0, no space between sets of grouped bars +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, bar.width = 1, y.include.zero = TRUE) +# width example. With error.whisker.width = 1, whiskers have the width of the corresponding bar +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, error.disp = "SD", error.whisker.width = 1) +# width example. No whiskers +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, error.disp = "SD", error.whisker.width = 0) +# width example. With dot.jitter = 1, dispersion around the corresponding bar width +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "grey", dot.size = 3, dot.alpha = 1, dot.jitter = 1) +# width example. No dispersion +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "grey", dot.size = 3, dot.alpha = 1, dot.jitter = 0) +# tidy dot example +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "same", dot.tidy = TRUE, dot.bin.nb = 100) +# tidy dot example. Comparison with random spreading +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "same", dot.tidy = FALSE, dot.jitter = 1, dot.size = 2) +# orientation example. Beware: log scale automatically set to FALSE for horizontal display, because of a bug in ggplot2 (https://github.com/tidyverse/ggplot2/issues/881) +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "grey", dot.size = 3, dot.alpha = 1, dot.jitter = 1, vertical = FALSE) +# many arguments +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.class.order = list(NULL, c("B", "A")), categ.legend.name = "", categ.color = c("red", "blue"), bar.width = 0.25, error.disp = "SD", error.whisker.width = 0.8, dot.color = "grey", dot.jitter = 1, dot.size = 4, dot.border.size = 0, dot.alpha = 1, ylim = NULL, ylog = FALSE, y.break.nb = NULL, y.include.zero = FALSE, y.top.extra.margin = 0.05, y.bottom.extra.margin = 0, stat.disp = "above", stat.size = 4, xlab = "GROUP", ylab = "MEAN", vertical = TRUE, title = "GRAPH1", text.size = 14, classic = TRUE, grid = TRUE, return = TRUE, path.lib = NULL) +# DEBUGGING +# data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; data1[2:3, 1] <- NA ; data1[7:8, 2] <- NA ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; categ.class.order = list(L1 = NULL, L2 = c("B", "A")) ; categ.legend.name = NULL ; categ.color = na.omit(data1)$bar.color ; bar.width = 0.5 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = FALSE ; dot.bin.nb = 30 ; dot.jitter = 0.25 ; dot.size = 3 ; dot.border.size = 0.5 ; dot.alpha = 1 ; ylim = NULL ; ylog = FALSE ; y.break.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = NULL ; stat.size = 4 ; stat.dist = 2 ; xlab = NULL ; ylab = NULL ; vertical = TRUE ; title = "" ; text.size = 12 ; classic = FALSE ; grid = FALSE ; return = FALSE ; path.lib = NULL +# data1 <-data.frame(a = rep(1:20, 5), group1 = rep(c("G", "H"), times = 50), group2 = rep(LETTERS[1:5], each = 20)) ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; categ.class.order = list(L1 = NULL, L2 = c("B", "A", "E", "D", "C")) ; categ.legend.name = NULL ; categ.color = NULL ; bar.width = 0.5 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = TRUE ; dot.bin.nb = 30 ; dot.jitter = 0.25 ; dot.size = 3 ; dot.border.size = 0.5 ; dot.alpha = 1 ; ylim = NULL ; ylog = FALSE ; y.break.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = NULL ; stat.size = 4 ; stat.dist = 2 ; xlab = NULL ; ylab = NULL ; vertical = TRUE ; title = "" ; text.size = 12 ; classic = FALSE ; grid = FALSE ; return = FALSE ; path.lib = NULL +# data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; data1[2:3, 1] <- NA ; data1[7:8, 2] <- NA ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; categ.class.order = list(L1 = NULL, L2 = c("B", "A")) ; categ.legend.name = NULL ; categ.color = na.omit(data1)$bar.color ; bar.width = 0.5 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = TRUE ; dot.bin.nb = 30 ; dot.jitter = 0.25 ; dot.size = 3 ; dot.border.size = 0.5 ; dot.alpha = 1 ; ylim = NULL ; ylog = FALSE ; y.break.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = "above" ; stat.size = 4 ; stat.dist = 2 ; xlab = NULL ; ylab = NULL ; vertical = TRUE ; title = "" ; text.size = 12 ; classic = FALSE ; grid = FALSE ; return = FALSE ; path.lib = NULL +# set.seed(1) ; data1 <- data.frame(a = c(rnorm(25, 0), rnorm(25, -10), rnorm(25, 10), rnorm(25, 20)), group1 = rep(c("G", "H"), times = 50), group2 = rep(c("A", "B", "C", "D"), each = 25)) ; set.seed(NULL) ; y = "a" ; categ = c("group1", "group2") ; categ.class.order = list(NULL, c("B", "A", "D", "C")) ; categ.legend.name = "LEGEND" ; categ.color = NULL ; bar.width = 0.8 ; error.disp = "SD" ; error.whisker.width = 0.5 ; dot.color = "same" ; dot.tidy = TRUE ; dot.bin.nb = 60 ; dot.jitter = 0.25 ; dot.size = 3.5 ; dot.border.size = 0.2 ; dot.alpha = 1 ; ylim= c(-15, 25) ; ylog = FALSE ; y.break.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = "above" ; stat.size = 4 ; stat.dist = 2 ; xlab = "GROUP" ; ylab = "MEAN" ; vertical = FALSE ; title = "GRAPH1" ; text.size = 20 ; return = TRUE ; classic = FALSE ; grid = FALSE ; return = FALSE ; path.lib = NULL +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, error.disp = "SD", error.whisker.width = 1) + +# set.seed(1) ; data1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; set.seed(NULL) ; y = "a" ; categ <- c("group1", "group2") ; categ.class.order = list(NULL, c("B", "A", "D", "C", "E")) ; categ.legend.name = "LEGEND" ; categ.color = NULL ; bar.width = 0.8 ; error.disp = "SD" ; error.whisker.width = 1 ; dot.color = NULL ; dot.tidy = FALSE ; dot.bin.nb = 60 ; dot.jitter = 0.25 ; dot.size = 3.5 ; dot.border.size = 0.2 ; dot.alpha = 1 ; ylim= c(-15, 25) ; ylog = FALSE ; y.break.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0 ; stat.disp = "above" ; stat.size = 4 ; stat.dist = 1 ; xlab = "GROUP" ; ylab = "MEAN" ; vertical = TRUE ; title = "GRAPH1" ; text.size = 20 ; return = TRUE ; classic = FALSE ; grid = FALSE ; return = FALSE ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack_import", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack_import() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_gg_palette", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_palette() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_round", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_round() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_2D_comp", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_2D_comp() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking (and modification for proper color management) +warning <- NULL +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = y, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (y %in% names(data1))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": y ARGUMENT MUST BE A COLUMN NAME OF data1\n\n================\n\n") +stop(tempo.cat) +}else if(tempo$problem == FALSE){ +if(any(y %in% c("x", "y", "ymax", "x.y", "group"))){ +tempo.warning <- paste0("RISK OF BUG BECAUSE NAMES IN y ARGUMENT ARE ALSO USED BY FUNCTIONS LIKE merge() OR aggregate()\nIT IS RECOMMENDED TO AVOID THESE COLUMN NAMES IN data1: \"x\", \"y\", \"ymax\", \"x.y\", \"group\"") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +tempo <- fun_param_check(data = data1[, y], data.name = "y COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = categ, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & length(categ) > 2){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT CANNOT HAVE MORE THAN 2 COLUMN NAMES OF data1\n\n================\n\n") +stop(tempo.cat) +}else if(tempo$problem == FALSE & ! all(categ %in% names(data1))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(categ, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else if(any(categ %in% c("x", "y", "ymax", "x.y", "group"))){ +tempo.warning <- paste0("RISK OF BUG BECAUSE NAMES IN categ ARGUMENT ARE ALSO USED BY FUNCTIONS LIKE merge() OR aggregate()\nIT IS RECOMMENDED TO AVOID THESE COLUMN NAMES IN data1: \"x\", \"y\", \"ymax\", \"x.y\", \"group\"") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# na detection and removal (done now to be sure of the correct length of categ) +if(any(is.na(data1[, c(y, categ)]))){ +removed.row.nb <- unlist(lapply(lapply(c(data1[c(y, categ)]), FUN = is.na), FUN = which)) +removed.rows <- data1[removed.row.nb, ] +data1 <- data1[-removed.row.nb, ] +tempo.warning <- paste0("NA DETECTED IN COLUMN ", paste(c(y, categ), collapse = " "), " OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +removed.row.nb <- NULL +removed.rows <- NULL +} +# end na detection and removal (done now to be sure of the correct length of categ) +for(i1 in 1:length(categ)){ +if(any(is.na(data1[, categ[i1]]))){ +tempo.warning <- paste0("IN categ NUMBER ", i1, " IN data1, THE CATEGORY COLUMN ", categ[i1], " CONTAINS NA") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +tempo1 <- fun_param_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) +tempo2 <- fun_param_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": ", paste0("categ NUMBER ", i1, " OF data1"), " MUST BE A FACTOR OR CHARACTER VECTOR\n\n================\n\n") +stop(tempo.cat) +}else if(tempo1$problem == FALSE){ +tempo.warning <- paste0("IN categ NUMBER ", i1, " IN data1, THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +data1[, categ[i1]] <- factor(data1[, categ[i1]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +} +if( ! is.null(categ.class.order)){ +tempo <- fun_param_check(data = categ.class.order, class = "list", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & length(categ.class.order) > 2){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A LIST OF MAX LENGTH 2\n\n================\n\n") +stop(tempo.cat) +}else if(tempo$problem == FALSE){ +for(i3 in 1:length(categ.class.order)){ +if(is.null(categ.class.order[[i3]])){ +tempo.warning <- paste0("THE categ.class.order COMPARTMENT ", i3, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +data1[, categ[i3]] <- factor(as.character(data1[, categ[i3]])) # if already a factor, change nothing, if characters, levels according to alphabetical order +}else if(any(duplicated(categ.class.order[[i3]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": COMPARTMENT ", i3, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i3]], collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else if( ! (all(categ.class.order[[i3]] %in% unique(data1[, categ[i3]])) & all(unique(data1[, categ[i3]]) %in% categ.class.order[[i3]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": COMPARTMENT ", i3, " OF categ.class.order ARGUMENT MUST BE CLASSES OF ELEMENT ", i3, " OF categ\nHERE IT IS:\nCOMPARTMENT ", i3, " OF categ.class.order:", paste(categ.class.order[[i3]], collapse = " "), "\nCOLUMN ", categ[i3], " OF data1: ", paste( unique(data1[, categ[i3]]), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else{ +data1[, categ[i3]] <- factor(data1[, categ[i3]], levels = categ.class.order[[i3]]) # reorder the factor + +} +} +} +} +if( ! is.null(categ.legend.name)){ +tempo <- fun_param_check(data = categ.legend.name, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +}else{ +categ.legend.name <- categ[length(categ)] # if only categ1, then legend name of categ1, if length(categ) == 2, then legend name of categ2 +} +if( ! is.null(categ.color)){ +# check the nature of color +tempo1 <- fun_param_check(data = categ.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) +tempo2 <- fun_param_check(data = categ.color, class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +# integer colors into gg_palette +tempo.check.color <- fun_param_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name, print = FALSE)$problem +if(tempo.check.color == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR\n\n================\n\n") # integer possible because dealt above +stop(tempo.cat) +}else{ # convert integers into colors +categ.color <- fun_gg_palette(max(categ.color, na.rm = TRUE)) +} +# 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 # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(categ.color), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +if(any(is.na(categ.color))){ +tempo.warning <- paste0("categ.color ARGUMENT CONTAINS NA") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end check the nature of color +# check the length of color +# No problem of NA management by ggplot2 because already removed +i0 <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2, then colors for classes of categ2 +if(length(categ.color) == length(unique(data1[, categ[i0]]))){ # here length(categ.color) is equal to the different number of categ +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +data1 <- data.frame(data1, categ.color = data1[, categ[i0]]) +levels(data1$categ.color) <- categ.color +tempo.warning <- paste0("IN ", categ[i0], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(categ.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if(length(categ.color) == length(data1[, categ[i0]])){# 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[i0]]))) +data1 <- data.frame(data1, categ.color = categ.color) +tempo.check <- unique(data1[ , c(categ[i0], "categ.color")]) +if( ! (nrow(tempo.check) == length(unique(categ.color)) & nrow(tempo.check) == length(unique(data1[ , categ[i0]])))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF categ ", categ[i0], ":\n", paste(unique(mapply(FUN = "paste", data1[ ,categ[i0]], data1[ ,"categ.color"])), collapse = "\n"), "\n\n================\n\n") +stop(tempo.cat) +}else{ +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +categ.color <- unique(categ.color[order(data1[, categ[i0]])]) # Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[i0]]))) +tempo.warning <- paste0("categ.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ ", categ[i0], " AS:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\n", paste(categ.color, collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +}else if(length(categ.color) == 1){ +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +data1 <- data.frame(data1, categ.color = categ.color) +categ.color <- rep(categ.color, length(levels(data1[, categ[i0]]))) +tempo.warning <- paste0("categ.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[i0], "\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(categ.color, collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": categ.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[i0], " COLUMN. HERE IT IS COLOR LENGTH ", length(categ.color), " VERSUS CATEG LENGTH ", length(data1[, categ[i0]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[i0]])), "\nPRESENCE OF NA COULD BE THE PROBLEM\n\n================\n\n") +stop(tempo.cat) +} +}else{ +i0 <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2, then colors for classes of categ2 +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +categ.color <- fun_gg_palette(length(levels(data1[, categ[i0]]))) +data1 <- data.frame(data1, categ.color = data1[, categ[i0]]) +levels(data1$categ.color) <- categ.color +tempo.warning <- paste0("NULL categ.color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", categ[i0], " IN data1:\n", paste(categ.color, collapse = " "), "\n", paste(levels(data1[, categ[i0]]), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +tempo <- fun_param_check(data = bar.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(error.disp)){ +tempo <- fun_param_check(data = error.disp, options = c("SD", "SD.TOP", "SEM", "SEM.TOP"), length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = error.whisker.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(dot.color)){ +# check the nature of color +tempo1 <- fun_param_check(data = dot.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name, print = FALSE) +tempo2 <- fun_param_check(data = dot.color, class = "factor", na.contain = TRUE, fun.name = function.name, print = FALSE) +if(tempo1$problem == TRUE & tempo2$problem == TRUE){ +# integer colors into gg_palette +tempo.check.color <- fun_param_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name, print = FALSE)$problem +if(tempo.check.color == TRUE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": dot.color MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR\n\n================\n\n") # integer possible because dealt above +stop(tempo.cat) +}else{ # convert integers into colors +dot.color <- fun_gg_palette(max(dot.color, na.rm = TRUE)) +} +# end integer colors into gg_palette +} +if(all(dot.color == "same") & length(dot.color) == 1){ +dot.color <- categ.color # same color of the dots as the corresponding bar color +tempo.warning <- paste0("dot.color ARGUMENT HAS BEEN SET TO \"SAME\"\nTHUS, DOT COLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ ", categ[i0], " AS:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\n", paste(levels(factor(dot.color)), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if( ! (all(dot.color %in% colors() | grepl(pattern = "^#", dot.color)))){ # check that all strings of low.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": dot.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 = " "), "\n\n================\n\n") +stop(tempo.cat) +} +if(any(is.na(dot.color))){ +tempo.warning <- paste0("dot.color ARGUMENT CONTAINS NA") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +# end check the nature of color +# check the length of color +# No problem of NA management by ggplot2 because already removed +i0 <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2, then colors for classes of categ2 +if(length(dot.color) == length(unique(data1[, categ[i0]]))){ # here length(dot.color) is equal to the different number of categ +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +data1 <- data.frame(data1, dot.color = data1[, categ[i0]]) +levels(data1$dot.color) <- dot.color +tempo.warning <- paste0("IN ", categ[i0], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[i0]])), collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else if(length(dot.color) == length(data1[, categ[i0]])){# 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[i0]]))) +data1 <- data.frame(data1, dot.color = dot.color) +}else if(length(dot.color) == 1 & ! all(dot.color == "same")){ +data1[, categ[i0]] <- factor(data1[, categ[i0]]) # if already a factor, change nothing, if characters, levels according to alphabetical order +data1 <- data.frame(data1, dot.color = dot.color) +dot.color <- rep(dot.color, length(levels(data1[, categ[i0]]))) +tempo.warning <- paste0("dot.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[i0], "\n", paste(levels(factor(data1[, categ[i0]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(dot.color, collapse = " ")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": dot.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[i0], " COLUMN. HERE IT IS COLOR LENGTH ", length(dot.color), " VERSUS CATEG LENGTH ", length(data1[, categ[i0]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[i0]])), "\nPRESENCE OF NA COULD BE THE PROBLEM\n\n================\n\n") +stop(tempo.cat) +} +} +tempo <- fun_param_check(data = dot.tidy, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = dot.bin.nb, class = "vector", typeof = "integer", length = 1, double.as.integer = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = dot.jitter, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = dot.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(ylim)){ +tempo <- fun_param_check(data = ylim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = ylog, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(y.break.nb)){ +tempo <- fun_param_check(data = y.break.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ylog == TRUE & y.include.zero == TRUE){ +tempo.warning <- paste0("BOTH ylog AND y.include.zero ARGUMENTS SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +tempo <- fun_param_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(stat.disp)){ +tempo <- fun_param_check(data = stat.disp, options = c("top", "above"), length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = stat.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = stat.dist, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(xlab)){ +tempo <- fun_param_check(data = xlab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +if( ! is.null(ylab)){ +tempo <- fun_param_check(data = ylab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = vertical, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ylog == TRUE & vertical == FALSE){ +ylog <- FALSE +tempo.warning <- paste0("BECAUSE OF A BUG IN ggplot2, CANNOT FLIP BARS HORIZONTALLY WITH A YLOG SCALE -> ylog ARGUMENT RESET TO FALSE") +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +tempo <- fun_param_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = classic, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_param_check(data = path.lib, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking (and modification for proper color management) +# package checking +fun_pack_import(req.package = c("ggplot2"), path.lib = path.lib) +# end package checking +# main code +if(length(categ) == 1){ +# new data frames for bar and error bars +mean.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]]) ; names(x.env) <-categ[1] ; x.env}, FUN = mean, na.rm = TRUE) +sd.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]]) ; names(x.env) <-categ[1] ; x.env}, FUN = sd, na.rm = TRUE) +nb.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]]) ; names(x.env) <- categ[1] ; x.env}, FUN = function(x.env2){length(x.env2[ ! is.na(x.env2)])}) +if( ! all(identical(mean.dataframe[, categ[1]], sd.dataframe[, categ[1]]) & identical(mean.dataframe[, categ[1]], nb.dataframe[, categ[1]]))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": aggregate OUTPUT IS DIFFERENT IN TERM OF CLASS ORDER FOR mean.dataframe, sd.dataframe AND nb.dataframe. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +}else{ +sem.dataframe <- sd.dataframe +sem.dataframe[, y] <- sd.dataframe[, y] / (nb.dataframe[, y])^0.5 +} +# end new data frames for bar and error bars +# data1 check categ order for dots coordinates recovery +data1 <- data.frame(data1, categ.check = data1[, categ[1]]) +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 bar 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), ggplot2::ggplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[1]))) # fill because this is what is used with geom_bar +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(stroke = dot.border.size, size = dot.size, alpha = dot.alpha, pch = 21)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot()) # to easily have the equivalent of the grouped bars +dot.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data[[1]] +if( ! is.null(dot.color)){ +dot.coord <- data.frame(dot.coord[order(dot.coord$group, dot.coord$y), ], 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 = data1[order(data1$categ.check, data1[, y]), "dot.color"], tempo.categ1 = data1[order(data1$categ.check, data1[, y]), categ[1]]) # 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( ! identical(dot.coord$y, dot.coord$y.check)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": (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\n\n================\n\n") +stop(tempo.cat) +} +} +# end per bar dots coordinates recovery +}else if(length(categ) == 2){ +# new data frames for bar and error bars +mean.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]], data1[, categ[2]]) ; names(x.env) <- c(categ[1], categ[2]) ; x.env}, FUN = mean, na.rm = TRUE) +sd.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]], data1[, categ[2]]) ; names(x.env) <- c(categ[1], categ[2]) ; x.env}, FUN = sd, na.rm = TRUE) +nb.dataframe <- aggregate(x = data1[y], by = {x.env <- list(data1[, categ[1]], data1[, categ[2]]) ; names(x.env) <- c(categ[1], categ[2]) ; x.env}, FUN = function(x.env2){length(x.env2[ ! is.na(x.env2)])}) +tempo.check.mean <- mapply(FUN = "paste", mean.dataframe[, categ[1]], mean.dataframe[, categ[2]], sep = "_") +tempo.check.sd <- mapply(FUN = "paste", sd.dataframe[, categ[1]], sd.dataframe[, categ[2]], sep = "_") +tempo.check.nb <- mapply(FUN = "paste", nb.dataframe[, categ[1]], nb.dataframe[, categ[2]], sep = "_") +if( ! all(identical(tempo.check.mean, tempo.check.sd) & identical(tempo.check.mean, tempo.check.nb))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": aggregate OUTPUT IS DIFFERENT IN TERM OF CLASS ORDER FOR mean.dataframe, sd.dataframe AND nb.dataframe. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +}else{ +sem.dataframe <- sd.dataframe +sem.dataframe[, y] <- sd.dataframe[, y] / (nb.dataframe[, y])^0.5 +} +# end new data frames for bar and error bars +# 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))) +data1$categ.check <- as.integer(data1$categ.check) +# end data1 check categ order for dots coordinates recovery +# per bar 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), ggplot2::ggplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[2]))) # fill because this is what is used with geom_bar +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(stroke = dot.border.size, size = dot.size, alpha = dot.alpha, pch = 21)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot()) # to easily have the equivalent of the grouped bars +dot.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data[[1]] +if( ! is.null(dot.color)){ +dot.coord <- data.frame(dot.coord[order(dot.coord$group, dot.coord$y), ], 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 = data1[order(data1$categ.check, data1[, y]), "dot.color"], tempo.categ1 = data1[order(data1$categ.check, data1[, y]), categ[1]], tempo.categ2 = data1[order(data1$categ.check, data1[, y]), categ[2]]) # 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] +names(dot.coord)[names(dot.coord) == "tempo.categ2"] <- categ[2] +if( ! (identical(dot.coord$y, dot.coord$y.check) & identical(dot.coord$group, dot.coord$categ.check))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": (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\n\n================\n\n") +stop(tempo.cat) +} +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE INCONSISTENCY\n\n============\n\n")) +stop(tempo.cat) +} +data2 <- mean.dataframe +if( ! is.null(error.disp)){ +if(error.disp == "SD"){ +data2 <- data.frame(data2, SD = sd.dataframe[, y], ERROR.INF = mean.dataframe[, y] - sd.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sd.dataframe[, y]) +}else if(error.disp == "SD.TOP"){ +data2 <- data.frame(data2, SD = sd.dataframe[, y], ERROR.INF = mean.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sd.dataframe[, y]) +}else if(error.disp == "SEM"){ +data2 <- data.frame(data2, SEM = sem.dataframe[, y], ERROR.INF = mean.dataframe[, y] - sem.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sem.dataframe[, y]) +}else if(error.disp == "SEM.TOP"){ +data2 <- data.frame(data2, SEM = sem.dataframe[, y], ERROR.INF = mean.dataframe[, y], ERROR.SUP = mean.dataframe[, y] + sem.dataframe[, y]) +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE INCONSISTENCY\n\n============\n\n")) +stop(tempo.cat) +} +} +# stat output +stat <- data2 +names(stat)[names(stat) == y] <- "MEAN" +# end stat output +# range depending on means and error bars +if(is.null(ylim)){ +if(is.null(dot.color)){ # no dots plotted +if( ! is.null(error.disp)){ +ylim <- range(c(data2[, "ERROR.INF"], data2[, "ERROR.SUP"]), na.rm = TRUE) +}else{ +ylim <- range(data2[, y], na.rm = TRUE) +} +}else{ +ylim <- range(data1[, y], na.rm = TRUE) +} +} +# end range depending on means and error bars +ylim <- sort(ylim) +ylim[1] <- ylim[1] - abs(ylim[2] - ylim[1]) * y.bottom.extra.margin +ylim[2] <- ylim[2] + abs(ylim[2] - ylim[1]) * y.top.extra.margin +if(y.include.zero == TRUE){ # no need to check ylog == TRUE because done before +ylim <- range(c(ylim, 0), na.rm = TRUE) +} +if(ylog == TRUE & any(ylim < 0)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": FINAL ylim RANGE SPAN NULL OR NEGATIVE VALUES:", paste(ylim, collapse = " "), "\nWHICH IS IMCOMPATIBLE WITH ylog PARAMETER SET TO TRUE\n\n================\n\n") +stop(tempo.cat) +} +# width commputations +if(length(categ) == 2){ +bar.width2 <- bar.width / length(unique(data1[, categ[length(categ)]])) # real width of each bar in x-axis unit, among the set of grouped bar. Not relevant if no grouped bars length(categ) == 1 +}else if(length(categ) == 1){ +bar.width2 <- bar.width +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE INCONSISTENCY\n\n============\n\n")) +stop(tempo.cat) +} +error.whisker.width <- bar.width * error.whisker.width # real error bar width +dot.jitter <- bar.width2 * dot.jitter # real dot.jitter +# end width commputations +# barplot +# constant part +tempo.gg.name <- "gg.indiv.plot." +tempo.gg.count <- 0 +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(xlab)){categ[1]}else{xlab})) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(ylab)){y}else{ylab})) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) +if(classic == TRUE){ +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( +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.y = ggplot2::element_line(colour = "grey75") +)) +}else{ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( +line = ggplot2::element_line(size = 0.5), +axis.line.y.left = ggplot2::element_line(colour = "black"), +axis.line.x.bottom = ggplot2::element_line(colour = "black"), +)) +} +}else{ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( +text = ggplot2::element_text(size = text.size), +line = ggplot2::element_line(size = 0.5), +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 = "grey75"), +panel.grid.major.y = ggplot2::element_line(colour = "grey75"), +panel.grid.minor.x = ggplot2::element_blank(), +panel.grid.minor.y = ggplot2::element_blank(), +strip.background = ggplot2::element_rect(fill = "white", colour = "black") +)) +} +# end constant part +# barplot and error bars +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_bar(data = data2, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[length(categ)]), stat = "identity", position = ggplot2::position_dodge(width = NULL), color = "black", width = bar.width)) # stat = "identity" because already counted, position = position_dodge(width = NULL) for grouped bars (width = NULL means no overlap between grouped bars). Please, see explanation in https://stackoverflow.com/questions/34889766/what-is-the-width-argument-in-position-dodge/35102486#35102486 +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = categ.legend.name, values = as.character(categ.color), guide = ggplot2::guide_legend(override.aes = list(fill = categ.color)))) # values are the values of color (which is the border color in geom_bar. Beware: values = categ.color takes the numbers to make the colors if categ.color is a factor +if( ! is.null(error.disp)){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_errorbar(data = data2, mapping = ggplot2::aes_string(x = categ[1], group = categ[length(categ)], ymin = "ERROR.INF", ymax = "ERROR.SUP"), position = ggplot2::position_dodge(width = bar.width), color = "black", width = error.whisker.width)) # cannot use fill = categ[length(categ)] because not an aesthetic of geom_errorbar, but if only x = categ[1], wrong x coordinates with grouped bars +} +# end barplot and error bars +# coordinates management (for random plotting and for stat display) +# bars +bar.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data[[1]] # to have the summary statistics of the plot. Here because can be required for stat.disp when just bar are plotted +# end bars +if( ! is.null(dot.color)){ +# random dots +if(dot.tidy == FALSE){ +dot.coord.rd1 <- merge(dot.coord, bar.coord[c("fill", "group", "x")], by = intersect("group", "group"), sort = FALSE) # rd for random. Send the coord of the bars into the coord data.frame of the dots (in the column x.y). Beware: by = intersect("group", "group") because group is enough as only one value of x per group number in bar.coord. Thus, no need to consider fill +if(nrow(dot.coord.rd1) != nrow(dot.coord)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd1 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +set.seed(1) +sampled.dot.jitter <- if(nrow(dot.coord.rd1) == 1){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) # set the dot.jitter thanks to runif and dot.jitter range. Then, send the coord of the bars into the coord data.frame of the dots (in the column x.y) +set.seed(NULL) +if(length(categ) == 1){ +tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(factor(as.numeric(data1[, categ[1]]))))) # 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") +verif <- paste0(categ[1], ".check") +}else if(length(categ) == 2){ +tempo.data1 <- unique(data.frame(data1[c(categ[1], categ[2])], group = as.integer(factor(paste0(as.numeric(data1[, categ[2]]), ".", as.numeric(data1[, categ[1]])))))) # 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("\n\n============\n\nERROR: CODE INCONSISTENCY\n\n============\n\n")) +stop(tempo.cat) +} +dot.coord.rd3 <- merge(dot.coord.rd2, tempo.data1, by = "group", sort = FALSE) # send the factors of data1 into coord +if(nrow(dot.coord.rd3) != nrow(dot.coord) | ( ! fun_2D_comp(dot.coord.rd3[categ], dot.coord.rd3[verif])$identical.content)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd3 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +# end random dots +} +# tidy dots +# coordinates are recover during plotting (see dot.coord.tidy1 below) +# end tidy dots +} +# end coordinates management (for random plotting and for stat display) +# dot display +if( ! is.null(dot.color)){ +if(dot.tidy == FALSE){ +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, color = dot.coord.rd3$dot.color, alpha = dot.alpha, pch = 16)) # 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)]), stroke = dot.border.size, size = dot.size, fill = dot.coord.rd3$dot.color, alpha = dot.alpha, pch = 21)) # 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.tidy == TRUE){ +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", color = categ[length(categ)]), position = ggplot2::position_dodge(width = bar.width), binaxis = "y", stackdir = "center", stroke = dot.border.size, alpha = dot.alpha, fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"], show.legend = FALSE, binwidth = (ylim[2] - ylim[1]) / dot.bin.nb)) # very weird behavior of geom_dotplot, 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 +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = categ.legend.name, values = rep("black", 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. Beware: values = categ.color takes the numbers to make the colors if categ.color is a factor. BEWARE: , guide = ggplot2::guide_legend(override.aes = list(fill = levels(dot.color))) here +# 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(tempo.coord, FUN = nrow) == nrow(data1))) > 1){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MORE THAN 2 COMPARTMENT WITH NROW EQUAL TO nrow(data1) IN THE tempo.coord LIST (FOR TIDY DOT COORDINATES). CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +}else{ +dot.coord.tidy1 <- tempo.coord[[which(sapply(tempo.coord, FUN = nrow) == nrow(data1))]] +} +tempo.bar.coord <- merge(bar.coord, unique(dot.coord[, c("group", categ)]), by = intersect("group", "group"), sort = FALSE) # add the categ in bar.coord. Beware: by = intersect("group", "group") because group is enough as only one value of x per group number in bar.coord. Thus, no need to consider fill +if(nrow(tempo.bar.coord) != nrow(bar.coord)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT tempo.bar.coord DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +dot.coord.tidy2 <- merge(dot.coord.tidy1, tempo.bar.coord[c("fill", "group", "x", categ)], by = intersect("group", "group"), sort = FALSE) # send the coord of the bars into the coord data.frame of the dots (in the column x.y). Beware: by = intersect("group", "group") because group is enough as only one value of x per group number in bar.coord. Thus, no need to consider fill +if(nrow(dot.coord.tidy2) != nrow(dot.coord)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy2 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +if(length(categ) == 1){ +tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(factor(as.numeric(data1[, categ[1]]))))) # 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") +verif <- paste0(categ[1], ".check") +}else if(length(categ) == 2){ +tempo.data1 <- unique(data.frame(data1[c(categ[1], categ[2])], group = as.integer(factor(paste0(as.numeric(data1[, categ[2]]), ".", as.numeric(data1[, categ[1]])))))) # 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("\n\n============\n\nERROR: CODE INCONSISTENCY\n\n============\n\n")) +stop(tempo.cat) +} +dot.coord.tidy3 <- merge(dot.coord.tidy2, tempo.data1, by = "group", sort = FALSE) # send the factors of data1 into coord +if(nrow(dot.coord.tidy3) != nrow(dot.coord) | ( ! fun_2D_comp(dot.coord.tidy3[categ], dot.coord.tidy3[verif])$identical.content)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy3 DATA FRAME. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +# end coordinates of tidy dots +} +} +# end dot display +# stat display +# layer after dots but ok, behind dots on the plot +if( ! is.null(stat.disp)){ +if(stat.disp == "top"){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = bar.coord$x, y = ylim[2], label = fun_round(bar.coord$y, 2), size = stat.size, color = "black", hjust = ifelse(vertical == TRUE, 0.5, 1.1), vjust = ifelse(vertical == TRUE, 1.1, 0.5))) # beware: no need of order() for labels because bar.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 +}else if(stat.disp == "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 +} +stat.coord1 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ) == 1){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ) == 1){c("group", "x.y", categ[1])}else if(length(categ) == 2){c("group", "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) == 1){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2){list(tempo.stat.ini$group, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ) == 1){c("group", "x.y", categ[1])}else if(length(categ) == 2){c("group", "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(bar.coord[order(bar.coord$x), ], stat.coord1[order(stat.coord1$x.y), ], stat.coord2[order(stat.coord2$x.y), ]) # should be ok to use bar.coord$x and stat.coord$x.y to assemble the two data frames because x coordinates of the bars. Thus, we cannot have identical values +if( ! all(identical(round(stat.coord3$x, 9), round(stat.coord3$x.y, 9)))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": FUSION OF bar.coord, stat.coord1 AND stat.coord2 ACCORDING TO bar.coord$x, stat.coord1$x.y AND stat.coord2$x.y IS NOT CORRECT. CODE HAS TO BE MODIFIED\n\n================\n\n") +stop(tempo.cat) +} +dot.text.coord <- stat.coord3[, c("x", "group", "dot.min", "dot.max")] +names(dot.text.coord)[names(dot.text.coord) == "dot.min"] <- "text.min.pos" +names(dot.text.coord)[names(dot.text.coord) == "dot.max"] <- "text.max.pos" +} +if( ! is.null(error.disp)){ # for text just above error bars +if(length(categ) == 1){ +tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(factor(as.numeric(data1[, categ[1]]))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis +if( ! identical(stat[order(stat[, categ[1]]), categ[1]], tempo.data1[order(tempo.data1[, categ[1]]), categ[1]])){ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE PROBLEM IN TRYING TO ASSEMBLE stat AND tempo.data1\n\n============\n\n")) +stop(tempo.cat) +}else{ +names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") +names(tempo.data1)[names(tempo.data1) == "group"] <- "group.check" +stat.coord4 <- cbind(stat[order(stat[, categ[1]]), ], tempo.data1[order(tempo.data1[, paste0(categ[1], ".check")]), ]) +} +}else if(length(categ) == 2){ +tempo.data1 <- unique(data.frame(data1[c(categ[1], categ[2])], group = as.integer(factor(paste0(as.numeric(data1[, categ[2]]), ".", as.numeric(data1[, categ[1]])))))) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis +if( ! fun_2D_comp(stat[order(stat[, categ[1]], stat[, categ[2]]), c(categ[1], categ[2])], tempo.data1[order(tempo.data1[, categ[1]], tempo.data1[, categ[2]]), c(categ[1], categ[2])])$identical.content){ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE PROBLEM IN TRYING TO ASSEMBLE stat AND tempo.data1\n\n============\n\n")) +stop(tempo.cat) +}else{ +names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") +names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") +names(tempo.data1)[names(tempo.data1) == "group"] <- "group.check" +stat.coord4 <- cbind(stat[order(stat[, categ[1]], stat[, categ[2]]), ], tempo.data1[order(tempo.data1[, paste0(categ[1], ".check")], tempo.data1[,paste0(categ[2], ".check")]), ]) +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE INCONSISTENCY\n\n============\n\n")) +stop(tempo.cat) +} +if( ! identical(bar.coord$group[order(bar.coord$group)], stat.coord4$group.check[order(stat.coord4$group.check)])){ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE PROBLEM IN TRYING TO ASSEMBLE bar.coord AND stat.coord4\n\n============\n\n")) +stop(tempo.cat) +}else{ +stat.coord5 <- cbind(bar.coord[order(bar.coord$group), ], stat.coord4[order(stat.coord4$group.check), ]) +error.text.coord <- stat.coord5[, c("x", "group", "ERROR.INF", "ERROR.SUP")] # +names(error.text.coord)[names(error.text.coord) == "ERROR.INF"] <- "text.min.pos" +names(error.text.coord)[names(error.text.coord) == "ERROR.SUP"] <- "text.max.pos" +} +} +if(( ! is.null(dot.color)) & ! is.null(error.disp)){ # for text above max dot or error bar +stat.coord3 <- stat.coord3[order(stat.coord3$x), ] +stat.coord5 <- stat.coord5[order(stat.coord5$x), ] +if( ! identical(stat.coord3$group, stat.coord5$group)){ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE PROBLEM IN TRYING TO ASSEMBLE stat.coord3 AND stat.coord5\n\n============\n\n")) +stop(tempo.cat) +}else{ +stat.coord6 <- data.frame(stat.coord3, min.dot.error = mapply(FUN = min, stat.coord3$dot.min, stat.coord5$ERROR.INF, na.rm = TRUE)) +stat.coord7 <- data.frame(stat.coord6, max.dot.error = mapply(FUN = max, stat.coord3$dot.max, stat.coord5$ERROR.SUP, na.rm = TRUE)) +both.text.coord <- stat.coord7[, c("x", "group", "min.dot.error", "max.dot.error")] # +names(both.text.coord)[names(both.text.coord) == "min.dot.error"] <- "text.min.pos" +names(both.text.coord)[names(both.text.coord) == "max.dot.error"] <- "text.max.pos" +} +} +if(( ! is.null(dot.color)) & is.null(error.disp)){ +text.coord <- dot.text.coord +}else if(is.null(dot.color) & ! is.null(error.disp)){ +text.coord <- error.text.coord +}else if(( ! is.null(dot.color)) & ! is.null(error.disp)){ +text.coord <- both.text.coord +} +if( ! (is.null(dot.color) & is.null(error.disp))){ +bar.coord <- bar.coord[order(bar.coord$x), ] +text.coord <- text.coord[order(text.coord$x), ] # to be sure to have the two objects in the same order for x. BEWARE: cannot add identical(as.integer(text.coord$group), as.integer(bar.coord$group)) because with error, the correspondence between x and group is not the same +if( ! identical(text.coord$x, bar.coord$x)){ +tempo.cat <- (paste0("\n\n============\n\nERROR: text.coord AND bar.coord DO NOT HAVE THE SAME x COLUMN CONTENT\n\n============\n\n")) +stop(tempo.cat) +} +} +# end stat coordinates +# stat display +if(is.null(dot.color) & is.null(error.disp)){ # text just above bars +# performed twice: first for y values >=0, then y values < 0, because only a single value allowed for hjust anf vjust +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = bar.coord$x[bar.coord$y >= 0], y = bar.coord$y[bar.coord$y >= 0], label = fun_round(bar.coord$y, 2)[bar.coord$y >= 0], 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))) # beware: no need of order() for labels because bar.coord$x set the order +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = bar.coord$x[bar.coord$y < 0], y = bar.coord$y[bar.coord$y < 0], label = fun_round(bar.coord$y, 2)[bar.coord$y < 0], 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))) # beware: no need of order() for labels because bar.coord$x set the order +}else{ # text just above error bars or dots +# I checked that text.coord and bar.coord have the same x and group column content. Thus, ok to use them together +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = text.coord$x[bar.coord$y >= 0], y = text.coord$text.max.pos[bar.coord$y >= 0], label = fun_round(bar.coord$y, 2)[bar.coord$y >= 0], 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))) # beware: no need of order() for labels because bar.coord$x set the order +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "text", x = text.coord$x[bar.coord$y < 0], y = text.coord$text.min.pos[bar.coord$y < 0], label = fun_round(bar.coord$y, 2)[bar.coord$y < 0], 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))) # beware: no need of order() for labels because bar.coord$x set the order +} +# end stat display +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE INCONSISTENCY\n\n============\n\n")) +stop(tempo.cat) +} +} +# end stat display +# y scale management (cannot be before dot plot management) +if(ylog == TRUE){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotation_logticks(sides = "l")) # string containing any of "trbl", for top, right, bottom, and left +if( ! is.null(y.break.nb)){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous(breaks = fun_round(seq(ylim[1], ylim[2], length.out = y.break.nb), dec.nb = 2, after.lead.zero = TRUE))) +} +}else{ +if( ! is.null(y.break.nb)){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( +breaks = fun_round(seq(ylim[1], ylim[2], length.out = y.break.nb), dec.nb = 2, after.lead.zero = TRUE), +expand = c(0, 0), +limits = NA +)) +}else{ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( +expand = c(0, 0), +limits = NA +)) +} +} +if(vertical == TRUE){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(ylim = ylim)) +}else{ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_flip(ylim = ylim)) +} +# end y scale management (cannot be before dot plot management) +suppressWarnings(print(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))) +# end barplot +if(return == TRUE){ +output <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ")))) +output <- list(stat = stat, removed.row.nb = removed.row.nb, removed.rows = removed.rows, data = output$data, warnings = paste0("\n", warning, "\n\n")) +return(output) +} +} + + +######## fun_gg_boxplot() #### ggplot2 boxplot + background dots if required + +# http://www.sthda.com/english/wiki/ggplot2-box-plot-quick-start-guide-r-software-and-data-visualization + +fun_gg_boxplot <- function(data1, y, categ, class.order = NULL, legend.name = NULL, categ.color = NULL, dot.color = "same", box.width = 0.5, whisker.width = 0.5, jitter = 0.25, ylim = NULL, ylog = FALSE, y.include.zero = FALSE, top.extra.margin = 0.05, bottom.extra.margin = 0, xlab = NULL, ylab = NULL, pt.size = 3, pt.border.size = 0.5, alpha = 0.5, show.stat = NULL, stat.size = 4, title = "", text.size = 12, break.nb = NULL, classic = FALSE, grid = FALSE, return = FALSE, path.lib = NULL){ +# AIM +# ggplot2 vertical barplot representing mean values with the possibility to add error bars and to overlay dots +# 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) +# to have a single boxplot, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped boxplots, create a factor column with a single class and specify this column in categ argument as first element (categ1). See categ below +# with several single boxplots (categ argument with only one element), bar.width argument (i.e., width argument of ggplot2::geom_bar()) defines each bar width. The bar.width argument also defines the space between bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each bar) +# with several sets of grouped bars (categ argument with two elements), bar.width argument defines each set of grouped bar width. The bar.width argument also defines the space between set of grouped bars by using (1 - bar.width). In addition, xmin and xmax of the fun_gg_bar_mean() output report the bar boundaries (around x-axis unit 1, 2, 3, etc., for each set of grouped bar) +# ARGUMENTS +# data1: a dataframe containing one column of values (see y argument below) and one or two columns of categories (see categ argument below) +# y: character string of the data1 column name for y-axis (containing numeric values). Numeric values will be used to generate the boxplots 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 factor). Must either be one or two column names. If a single column name (further refered to as categ1), then one boxplot per class of categ1. If two column names (further refered to as categ1 and categ2), then one boxplot per class of categ2, which form a group of boxplots in each class of categ1. Beware, categ1 (and categ2 if it exists) must have a single value of y per class of categ1 (and categ2). To have a single boxplot, create a factor column with a single class and specify the name of this column in categ argument as unique element (no categ2 in categ argument). For a single set of grouped boxplots, create a factor column with a single class and specify this column in categ argument as first element (categ1) +# 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 class.order = NULL, classes are represented according to the alphabetical order. Some compartment can be NULL and other not +# legend.name: character string of the legend title for categ2. If legend.name = NULL, then legend.name <- categ1 if only categ1 is present and legend.name <- categ2 if categ1 and categ2 are present. Write "" if no legend required +# categ.color: vector of character color string for boxplot color. 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 boxplots will have this color, whatever the classes of categ1), (2) a vector of string colors, one for each class of categ1 (each color will be associated according to class.order of categ1), (3) a vector or factor of string colors, like if it was one of the column of data1 data frame (beware: a single color per class of categ1 and a single class of categ1 per color must be respected). 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 categ.color. If categ.color is non null and categ1 and categ2 specified, all the rules described above will apply to categ2 instead of categ1 (colors will be determined for boxplots inside a group of boxplots) +# dot.color: vector of character string. Idem as categ.color but for dots, except that in the possibility (3), the rule "a single color per class of categ1 and a single class of categ1", cannot be respected (each dot can have a different color). If NULL, no dots plotted +# box.width: numeric value (from 0 to 1) of the bar or set of grouped bar width (see warnings above) +# whisker.width: numeric value (from 0 to 1) of the whisker (error bar extremities) width, with 0 meaning no whiskers and 1 meaning a width equal to the corresponding bar width +# jitter: numeric value (from 0 to 1) of random dot horizontal dispersion, with 0 meaning no dispersion and 1 meaning a dispersion in the corresponding bar width interval +# ylim: 2 numeric values for y-axis range. If NULL, range of y in data1 +# ylog: logical. Log10 scale for the y-axis? Beware: if TRUE, ylim must not contain null or negative values +# y.include.zero: logical. Does ylim range include 0? Beware: if ylog = TRUE, will be automately set to FALSE with a warning message +# top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to ylim. If different from 0, add the range of the axis * top.extra.margin (e.g., abs(ylim[2] - ylim[1]) * top.extra.margin) to the top of y-axis. Beware with ylog = TRUE, the range result must not overlap zero or negative values +# bottom.extra.margin: idem as top.extra.margin but to the bottom of y-axis +# xlab: a character string for x-axis legend. If NULL, character string of categ1 +# ylab: a character string y-axis legend. If NULL, character string of the y argument +# pt.size: numeric value of dot size +# pt.border.size: numeric value of border dot size. Write zero for no stroke +# alpha: numeric value (from 0 to 1) of dot transparency (full transparent to full opaque, respectively) +# show.stat: add the mean number above the corresponding bar. Either NULL (no number shown), "top" (at the top of the figure region) or "above" (above each bar) +# stat.size: numeric value of the number size (in points) +# title: character string of the graph title +# text.size: numeric value of the text size (in points) +# break.nb: number of desired values on the y-axis +# classic: logical. Use the classic theme (article like)? +# grid: logical. draw horizontal lines in the background to better read the boxplot values? Not considered if classic = FALSE +# return: logical. Return the graph parameters? +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# ggplot2 +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# fun_pack_import() +# fun_gg_palette() +# fun_round() +# fun_2D_comp() +# RETURN +# a boxplot +# a list of the graph info if return argument is TRUE: +# stat: the graphic statistics +# removed.row.nb: which rows have been removed due to NA detection in y and categ columns (NULL if no row removed) +# removed.rows: removed rows containing NA (NULL if no row removed) +# data: the graphic info coordinates +# warnings: the warning messages. Use cat() for proper display. NULL if no warning +# EXAMPLES +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", categ.color = "white") # separate bars, modification of bar color 1 (a single value) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", categ.color = c("red", "blue")) # separate bars, modification of bar color 2 (one value par class of categ2) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), bar.color = rep(c("brown", "orange"), time = 10)) ; obs1 ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", categ.color = obs1$bar.color) # separate bars, modification of bar color 3 (one value per line of obs1, with respect of the correspondence between categ2 and bar.color columns) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = "same") # separate bars, modification of dot color 1 (same dot color as the corresponding bar) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = "green") # separate bars, modification of dot color 2 (single color for all the dots) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = c("green", "brown")) # separate bars, modification of dot color 3 (one value par class of categ2) +# obs1 <- data.frame(a = 1:10, group1 = rep(c("G", "H"), times = 5)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = hsv(h = (1:nrow(obs1)) / nrow(obs1))) # separate bars, modification of dot color 4 (any color for each dot) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2")) # grouped bars, default arguments +# obs1 <- data.frame(a = 1:24, group1 = rep(c("G", "H"), times = 12), group2 = rep(c("A", "B", "C", "D"), each = 6)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), return = TRUE) # more grouped bars +# obs1 <- data.frame(a = log10((1:20) * 100), group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), ylog = TRUE) # grouped bars, log scale. Beware, y column must be log, otherwise incoherent scale +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL) # grouped bars, no dots +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.color = "white") # grouped bars, modification of bar color 1 (a single value) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.color = c("red", "blue")) # grouped bars, modification of bar color 2 (one value par class of categ2) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; obs1 ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.color = obs1$bar.color) # grouped bars, modification of bar color 3 (one value per line of obs1, with respect of the correspondence between categ2 and bar.color columns) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "same") # grouped bars, modification of dot color 1 (same dot color as the corresponding bar) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "green") # grouped bars, modification of dot color 2 (single color for all the dots) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = c("green", "brown")) # grouped bars, modification of dot color 3 (one value par class of categ2) +# obs1 <- data.frame(a = 1:10, group1 = rep(c("G", "H"), times = 5), group2 = rep(c("A", "B"), each = 5)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = hsv(h = (1:nrow(obs1)) / nrow(obs1))) # grouped bars, modification of dot color 4 (any color for each dot) +# obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), class.order = list(NULL, c("B", "A")), legend.name = "", categ.color = c("red", "blue"), dot.color = "grey", error.bar = "SD", bar.width = 0.25, error.bar.width = 0.8, jitter = 1, ylim = c(10, 30), y.include.zero = FALSE, top.extra.margin = 0.5, bottom.extra.margin = 1, xlab = "GROUP", ylab = "MEAN", pt.size = 4, pt.border.size = 0, alpha = 1, show.stat = "above", stat.size = 4, title = "GRAPH1", text.size = 20, return = TRUE, break.nb = 10, classic = TRUE, grid = TRUE) # grouped bars, all the arguments +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = NULL, bar.width = 0.25) # width example. With bar.width = 0.25, three times more space between single bars than the bar width +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = NULL, bar.width = 1) # width example. With bar.width = 1, no space between single bars +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, bar.width = 0.25) # width example. With bar.width = 0.25, three times more space between sets of grouped bars than the set width +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, bar.width = 1) # width example. With bar.width = 0, no space between sets of grouped bars +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, error.bar = "SD", error.bar.width = 1) # width example. With error.bar.width = 1, whiskers have the width of the corresponding bar +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, error.bar = "SD", error.bar.width = 0) # width example. No whiskers +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "grey", pt.size = 3, alpha = 1, jitter = 1) # width example. With jitter = 1, dispersion around the corresponding bar width +# obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "grey", pt.size = 3, alpha = 1, jitter = 0) # width example. No dispersion +# DEBUGGING +# data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; y = names(data1)[1] ; categ = names(data1)[2] ; class.order = list(L1 = NULL) ; legend.name = NULL ; categ.color = c("red", "blue") ; dot.color = "same" ; error.bar = "SEM.TOP" ; bar.width = 0.5 ; error.bar.width = 0.5 ; jitter = 0.25 ; ylim = NULL ; ylog = FALSE ; y.include.zero = FALSE ; top.extra.margin = 0.05 ; bottom.extra.margin = 0 ; xlab = NULL ; ylab = NULL ; pt.size = 3 ; pt.border.size = 0.1 ; alpha = 1 ; show.stat = NULL ; stat.size = 8 ; title = "GRAPH1" ; text.size = 12 ; return = FALSE ; break.nb = NULL ; classic = FALSE ; grid = FALSE ; path.lib = NULL +# data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; class.order = list(L1 = NULL, L2 = c("B", "A")) ; legend.name = NULL ; categ.color = c("red", "blue") ; dot.color = "same" ; error.bar = "SEM.TOP" ; bar.width = 0.5 ; error.bar.width = 0.5 ; jitter = 0.25 ; ylim = NULL ; ylog = FALSE ; y.include.zero = FALSE ; top.extra.margin = 0.05 ; bottom.extra.margin = 0 ; xlab = NULL ; ylab = NULL ; pt.size = 3 ; pt.border.size = 0.1 ; alpha = 1 ; show.stat = NULL ; stat.size = 8 ; title = "GRAPH1" ; text.size = 12 ; return = FALSE ; break.nb = NULL ; classic = FALSE ; grid = FALSE ; path.lib = NULL +# data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; class.order = list(L1 = NULL, L2 = c("B", "A")) ; legend.name = NULL ; categ.color = NULL ; dot.color = "same" ; error.bar = NULL ; bar.width = 0.5 ; error.bar.width = 0.5 ; jitter = 0.25 ; ylim = NULL ; ylog = TRUE ; y.include.zero = FALSE ; top.extra.margin = 0.05 ; bottom.extra.margin = 0 ; xlab = NULL ; ylab = NULL ; pt.size = 3 ; pt.border.size = 0.1 ; alpha = 0.5 ; show.stat = NULL ; stat.size = 8 ; title = "" ; text.size = 12 ; return = FALSE ; break.nb = NULL ; classic = FALSE ; grid = FALSE ; path.lib = NULL +# data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; class.order = list(L1 = NULL, L2 = c("B", "A")) ; legend.name = NULL ; categ.color = data1$bar.color ; dot.color = "same" ; error.bar = "SD" ; bar.width = 0.5 ; error.bar.width = 0.5 ; jitter = 0.25 ; ylim = NULL ; ylog = TRUE ; y.include.zero = FALSE ; top.extra.margin = 0.05 ; bottom.extra.margin = 0 ; xlab = NULL ; ylab = NULL ; pt.size = 3 ; pt.border.size = 0.1 ; alpha = 0.5 ; show.stat = NULL ; stat.size = 8 ; title = "" ; text.size = 12 ; return = FALSE ; break.nb = NULL ; classic = FALSE ; grid = FALSE ; path.lib = NULL +# data1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; data1[2:3, 1] <- NA ; data1[7:8, 2] <- NA ; y = names(data1)[1] ; categ = c(names(data1)[2], names(data1)[3]) ; class.order = list(L1 = NULL, L2 = c("B", "A")) ; legend.name = NULL ; categ.color = na.omit(data1)$bar.color ; dot.color = "same" ; error.bar = "SD" ; bar.width = 0.5 ; error.bar.width = 0.5 ; jitter = 0.25 ; ylim = NULL ; ylog = TRUE ; y.include.zero = FALSE ; top.extra.margin = 0.05 ; bottom.extra.margin = 0 ; xlab = NULL ; ylab = NULL ; pt.size = 3 ; pt.border.size = 0.1 ; alpha = 0.5 ; show.stat = "above" ; stat.size = 4 ; title = "" ; text.size = 12 ; return = FALSE ; break.nb = NULL ; classic = FALSE ; grid = FALSE ; path.lib = NULL +# function name +} + + + + +######## fun_gg_bar_prop() #### ggplot2 proportion barplot + + +######## fun_gg_strip() #### ggplot2 stripchart + mean/median + + +######## fun_gg_violin() #### ggplot2 violins + + +######## fun_gg_line() #### ggplot2 lines + background dots and error bars + + + + + + +######## fun_gg_heatmap() #### ggplot2 heatmap + overlaid mask if required + + +#test plot.margin = margin(up.space.mds, right.space.mds, down.space.mds, left.space.mds, "inches") to set the dim of the region plot ? + + +# Check OK: clear to go Apollo +fun_gg_heatmap <- function(data1, legend.name = "", low.color = "blue", high.color = "red", mid.color = "white", limit = NULL, midpoint = NULL, title = "", text.size = 12, show.scale = TRUE, data2 = NULL, color2 = "black", alpha2 = 0.5, invert2 = FALSE, return = FALSE, path.lib = NULL){ +# AIM +# ggplot2 heatmap with the possibility to overlay a mask +# see also: +# draw : http://www.sthda.com/english/wiki/ggplot2-quick-correlation-matrix-heatmap-r-software-and-data-visualization +# same range scale : https://stackoverflow.com/questions/44655723/r-ggplot2-heatmap-fixed-scale-color-between-graphs +# for ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html +# ARGUMENTS +# data1: numeric matrix or data frame resulting from the conversion of the numeric matrix by reshape2::melt() +# legend.name: character string of the heatmap scale legend +# low.color: character string of the color (i.e., "blue" or "#0000FF") of the lowest scale value +# high.color: same as low.color but for the highest scale value +# mid.color: same as low.color but for the middle scale value +# limit: 2 numeric values defining the lowest and higest color scale values. If NULL, take the range of data1 values +# midpoint: single numeric value defining the middle color scale values. If NULL, take the mean of data1 values +# title: character string of the graph title +# text.size: numeric value of the text size (in points) +# show.scale: logical. Show color scale? +# data2: binary mask matrix (made of 0 and 1) of same dimension as data1 or a data frame resulting from the conversion of the binary mask matrix by reshape2::melt(). Value 1 of data2 will correspond to color2 argument (value 0 will be NA color), and the opposite if invert2 argument is TRUE (inverted mask) +# color2: color of the 1 values of the binary mask matrix. The 0 values will be color NA +# alpha2: numeric value (from 0 to 1) of the mask transparency +# invert2: logical. Invert the mask (1 -> 0 and 0 -> 1)? +# return: logical. Return the graph parameters? +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# ggplot2 +# reshape2 +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# fun_pack_import() +# RETURN +# a heatmap +# the graph info if return argument is TRUE +# EXAMPLES +# fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), title = "GRAPH 1") +# fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), return = TRUE) +# fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), legend.name = "VALUE", title = "GRAPH 1", text.size = 5, data2 = matrix(rep(c(1,0,0,0), 4), ncol = 4), invert2 = FALSE, return = TRUE) +# fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), data2 = matrix(rep(c(1,0,0,0), 5), ncol = 5)) +# fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), data2 = reshape2::melt(matrix(rep(c(1,0,0,0), 4), ncol = 4))) +# fun_gg_heatmap(data1 = reshape2::melt(matrix(1:16, ncol = 4)), data2 = reshape2::melt(matrix(rep(c(1,0,0,0), 4), ncol = 4))) +# DEBUGGING +# data1 = matrix(1:16, ncol = 4) ; legend.name = "" ; low.color = "blue" ; high.color = "red" ; mid.color = "white" ; limit = range(data1, na.rm = TRUE) ; midpoint = mean(data1, na.rm = TRUE) ; title = "GRAPH 1" ; text.size = 12 ; show.scale = TRUE ; data2 = NULL ; color2 = "black" ; alpha2 = 0.5 ; invert2 = FALSE ; return = FALSE ; path.lib = NULL +# data1 = matrix(1:16, ncol = 4) ; legend.name = "" ; low.color = "blue" ; high.color = "red" ; mid.color = "white" ; limit = range(data1, na.rm = TRUE) ; midpoint = mean(data1, na.rm = TRUE) ; title = "GRAPH 1" ; text.size = 12 ; show.scale = TRUE ; data2 = matrix(rep(c(1,0,0,0), 4), ncol = 4) ; color2 = "black" ; alpha2 = 0.5 ; invert2 = FALSE ; return = TRUE ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack_import", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack_import() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +if(all(is.matrix(data1))){ +tempo <- fun_param_check(data = data1, class = "matrix", mode = "numeric", fun.name = function.name) ; eval(ee) +}else if(all(is.data.frame(data1))){ +tempo <- fun_param_check(data = data1, class = "data.frame", length = 3, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE){ +# structure of reshape2::melt() data frame +tempo <- fun_param_check(data = data1[, 1], typeof = "integer", fun.name = function.name) +tempo <- fun_param_check(data = data1[, 2], typeof = "integer", fun.name = function.name) +tempo <- fun_param_check(data = data1[, 3], mode = "numeric", fun.name = function.name) +} +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data1 ARGUMENT MUST BE A NUMERIC MATRIX OR A DATA FRAME OUTPUT OF THE reshape::melt() FUNCTION\n\n================\n\n") +stop(tempo.cat) +} +tempo <- fun_param_check(data = legend.name, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = low.color, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (all(low.color %in% colors() | grepl(pattern = "^#", low.color)))){ # check that all strings of low.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": low.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") +stop(tempo.cat) +} +tempo <- fun_param_check(data = high.color, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (all(high.color %in% colors() | grepl(pattern = "^#", high.color)))){ # check that all strings of high.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": high.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") +stop(tempo.cat) +} +tempo <- fun_param_check(data = mid.color, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (all(mid.color %in% colors() | grepl(pattern = "^#", mid.color)))){ # check that all strings of mid.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": mid.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") +stop(tempo.cat) +} +if( ! is.null(limit)){ +tempo <- fun_param_check(data = limit, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) +} +if( ! is.null(midpoint)){ +tempo <- fun_param_check(data = midpoint, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = title, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = text.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = show.scale, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(data2)){ +if(all(is.matrix(data2))){ +tempo <- fun_param_check(data = data2, class = "matrix", mode = "numeric", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(unique(data2) %in% c(0,1))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MATRIX IN data2 MUST BE MADE OF 0 AND 1 ONLY (MASK MATRIX)\n\n================\n\n") +stop(tempo.cat) +}else if(tempo$problem == FALSE & all(is.matrix(data1)) & ! identical(dim(data1), dim(data2))){ # matrix and matrix +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": MATRIX DIMENSION IN data2 MUST BE IDENTICAL AS MATRIX DIMENSION IN data1. HERE IT IS RESPECTIVELY:\n", paste(dim(data2), collapse = " "), "\n", paste(dim(data1), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else if(tempo$problem == FALSE & all(is.data.frame(data1)) & nrow(data1) != prod(dim(data2))){ # reshape2 and matrix +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DATA FRAME IN data2 MUST HAVE ROW NUMBER EQUAL TO PRODUCT OF DIMENSIONS OF data1 MATRIX. HERE IT IS RESPECTIVELY:\n", paste(nrow(data1), collapse = " "), "\n", paste(prod(dim(data2)), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +}else if(all(is.data.frame(data2))){ +tempo <- fun_param_check(data = data2, class = "data.frame", length = 3, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE){ +# structure of reshape2::melt() data frame +tempo <- fun_param_check(data = data2[, 1], typeof = "integer", fun.name = function.name) +tempo <- fun_param_check(data = data2[, 2], typeof = "integer", fun.name = function.name) +tempo <- fun_param_check(data = data2[, 3], mode = "numeric", fun.name = function.name) +} +if(tempo$problem == FALSE & ! all(unique(data2[, 3]) %in% c(0,1))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THIRD COLUMN OF DATA FRAME IN data2 MUST BE MADE OF 0 AND 1 ONLY (MASK DATA FRAME)\n\n================\n\n") +stop(tempo.cat) +}else if(tempo$problem == FALSE & all(is.data.frame(data1)) & ! identical(dim(data1), dim(data2))){ # data frame and data frame +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DATA FRAME DIMENSION IN data2 MUST BE IDENTICAL AS DATA FRAME DIMENSION IN data1. HERE IT IS RESPECTIVELY:\n", paste(dim(data2), collapse = " "), "\n", paste(dim(data1), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +}else if(tempo$problem == FALSE & all(is.matrix(data1)) & nrow(data2) != prod(dim(data1))){ # reshape2 and matrix +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": DATA FRAME IN data2 MUST HAVE ROW NUMBER EQUAL TO PRODUCT OF DIMENSION OF data1 MATRIX. HERE IT IS RESPECTIVELY:\n", paste(nrow(data2), collapse = " "), "\n", paste(prod(dim(data1)), collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +}else{ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE data2 ARGUMENT MUST BE A NUMERIC MATRIX OR A DATA FRAME OUTPUT OF THE reshape::melt() FUNCTION\n\n================\n\n") +stop(tempo.cat) +} +} +tempo <- fun_param_check(data = color2, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (all(color2 %in% colors() | grepl(pattern = "^#", color2)))){ # check that all strings of mid.color start by # +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": color2 ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors()\n\n================\n\n") +stop(tempo.cat) +} +tempo <- fun_param_check(data = alpha2, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = invert2, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_param_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# package checking +fun_pack_import(req.package = c("reshape2", "ggplot2"), path.lib = path.lib) +# end package checking +# main code +if(all(is.matrix(data1))){ +data1 <- reshape2::melt(data1) # transform a matrix into a dataframe with 2 coordinates columns and the third intensity column +} +if(is.null(limit)){ +limit <- range(data1[, 3], na.rm = TRUE) +} +if(is.null(midpoint)){ +midpoint <- mean(data1[, 3], na.rm = TRUE) +} +if( ! is.null(data2)){ +if(all(is.matrix(data2))){ +data2 <- reshape2::melt(data2) # transform a matrix into a dataframe with 2 coordinates columns and the third intensity column +} +if(invert2 == FALSE){ +data2[data2[, 3] == 1, 3] <- color2 +data2[data2[, 3] == 0, 3] <- NA +}else{ +data2[data2[, 3] == 0, 3] <- color2 +data2[data2[, 3] == 1, 3] <- NA +} +} +tempo.gg.name <- "gg.indiv.plot." +tempo.gg.count <- 0 # to facilitate debugging +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot(data = data1, mapping = ggplot2::aes_string(x = names(data1)[2], y = names(data1)[1], fill = names(data1)[3]))) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_raster(show.legend = show.scale)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_fill_gradient2(low = low.color, high = high.color, mid = mid.color, midpoint = midpoint, limit = limit, breaks = c(limit, midpoint), name = legend.name)) +if( ! is.null(data2)){ +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_raster(data = data2, mapping = ggplot2::aes_string(x = names(data2)[2], y = names(data2)[1], group = names(data2)[3]), fill = data2[, 3], alpha = alpha2, show.legend = FALSE)) +} +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_fixed()) # x = y +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_reverse()) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme( +line = ggplot2::element_blank(), +axis.title = ggplot2::element_blank(), +axis.text = ggplot2::element_blank(), +axis.ticks = ggplot2::element_blank(), +panel.background = ggplot2::element_blank(), +)) +suppressWarnings(print(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))) +if(return == TRUE){ +output <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ")))) +output <- output$data +names(output)[1] <- "heatmap" +if( ! is.null(data2)){ +names(output)[2] <- "mask" +} +return(output) +} +} + + +######## fun_gg_empty_graph() #### text to display for empty graphs + + +# Check OK: clear to go Apollo +fun_gg_empty_graph <- function(text, text.size = 12, title = NULL, path.lib = NULL){ +# AIM +# display an empty ggplot2 plot with a text in the middle of the window (for instance to specify that no plot can be drawn) +# ARGUMENTS +# text: character string of the message to display +# text.size: numeric value of the text size (in points) +# title: character string of the graph title +# path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# ggplot2 +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# fun_pack_import() +# RETURN +# an empty plot +# EXAMPLES +# fun_gg_empty_graph(text = "NO GRAPH", title = "GRAPH1") +# DEBUGGING +# text = "NO GRAPH" ; text.size = 12 ; title = "GRAPH1" ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack_import", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack_import() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = text, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = text.size, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(title)){ +tempo <- fun_param_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# package checking +fun_pack_import(req.package = c("ggplot2"), path.lib = path.lib) +# end package checking +# main code +tempo.gg.name <- "gg.indiv.plot." +tempo.gg.count <- 0 +# no need loop part +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggplot()) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text(data = data.frame(x = 1, y = 1), aes(x = x, y = y, label = text))) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_void()) +suppressWarnings(print(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))) +} + + +################ Graphic extraction + + +######## fun_var_trim_display() #### Display values from a quantitative variable and trim according to defined cut-offs + + +# Check OK: clear to go Apollo +fun_var_trim_display <- function(data, displayed.nb = NULL, single.value.display = FALSE, trim.method = "", trim.cutoffs = c(0.05, 0.975), interval.scale.disp = TRUE, down.space = 0.75, left.space = 0.75, up.space = 0.3, right.space = 0.25, orient = 1, dist.legend = 0.37, box.type = "l", amplif.label = 1.25, amplif.axis = 1.25, std.x.range = TRUE, std.y.range = TRUE, cex.pt = 0.2, col.box = hsv(0.55, 0.8, 0.8), x.nb.inter.tick = 4, y.nb.inter.tick = 0, tick.length = 1, sec.tick.length = 0.75, corner.text = "", amplif.legend = 1, magnific.corner.text = 0.75, trim.return = FALSE){ +# AIM +# trim and display values from a numeric vector or matrix +# plot 4 graphs: stripchart of values, stripchart of rank of values, hitogramme and normal QQPlot +# different kinds of intervals are displayed on the top of graphes to facilitate the analysis of the variable and a trimming setting +# the trimming interval chosen is displayed on top of graphs +# both trimmed and not trimmed values are returned in a list +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS +# data: values to plot (either a numeric vector or a numeric matrix) +# displayed.nb: number of values displayed. If NULL, all the values are displayed. Otherwise, if the number of values is over displayed.nb, then displayed.nb values are displayed after random selection +# single.value.display: provide the 4 graphs if data is made of a single (potentially repeated value)? If FALSE, an empty graph is displayed if data is made of a single (potentially repeated value). And the return list is made of NULL compartments +# trim.method: Write "" if not required. write "mean.sd" if mean +/- sd has to be displayed as a trimming interval (only recommanded for normal distribution). Write "quantile" to display a trimming interval based on quantile cut-offs. No other possibility allowed. See trim.cutoffs below +# trim.cutoffs: 2 values cutoff for the trimming interval displayed, each value between 0 and 1. Not used if trim.method == "".The couple of values c(lower, upper) represents the lower and upper boundaries of the trimming interval (in proportion), which represent the interval of distribution kept (between 0 and 1). Example: trim.cutoffs = c(0.05, 0.975). What is strictly kept for the display is ]lower , upper[, boundaries excluded. Using the "mean.sd" method, 0.025 and 0.975 represent 95% CI which is mean +/- 1.96 * sd +# interval.scale.disp: display sd and quantiles intervals on top of graphs ? +# down.space: lower vertical margin (in inches, mai argument of par()) +# left.space: left horizontal margin (in inches, mai argument of par()) +# up.space: upper vertical margin between plot region and grapical window (in inches, mai argument of par()) +# right.space: right horizontal margin (in inches, mai argument of par()) +# orient: scale number orientation (las argument of par()). 0, always parallel to the axis; 1, always horizontal; 2, always perpendicular to the axis; 3, always vertical +# dist.legend: numeric value that moves axis legends away in inches (first number of mgp argument of par() but in inches thus / 0.2) +# box.type: bty argument of par(). Either "o", "l", "7", "c", "u", "]", the resulting box resembles the corresponding upper case letter. A value of "n" suppresses the box +# amplif.label: increase or decrease the size of the text in legends +# amplif.axis: increase or decrease the size of the scale numbers in axis +# std.x.range: standard range on the x-axis? TRUE (no range extend) or FALSE (4% range extend). Controls xaxs argument of par() (TRUE is xaxs = "i", FALSE is xaxs = "r") +# std.y.range: standard range on the y-axis? TRUE (no range extend) or FALSE (4% range extend). Controls yaxs argument of par() (TRUE is yaxs = "i", FALSE is yaxs = "r") +# cex.pt: size of points in stripcharts (in inches, thus cex.pt will be thereafter / 0.2) +# col.box: color of boxplot +# x.nb.inter.tick: number of secondary ticks between main ticks on x-axis (only if not log scale). Zero means non secondary ticks +# y.nb.inter.tick: number of secondary ticks between main ticks on y-axis (only if not log scale). Zero means non secondary ticks +# tick.length: length of the ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc. 0 means no tick +# sec.tick.length: length of the secondary ticks (1 means complete the distance between the plot region and the axis numbers, 0.5 means half the length, etc., 0 for no ticks) +# corner.text: text to add at the top right corner of the window +# amplif.legend: increase or decrease the size of the text of legend +# magnific.corner.text: increase or decrease the size of the text +# trim.return: return the trimmed and non trimmed values? NULL returned for trimmed and non trimmed values if trim.method == "" +# RETURN +# a list containing: +# $trim.method: correspond to trim.method above +# $trim.cutoffs: correspond to trim.cutoffs above +# $real.trim.cutoffs: the two boundary values (in the unit of the numeric vector or numeric matrix analyzed). NULL +# $trimmed.values: the values outside of the trimming interval as defined in trim.cutoffs above +# $kept.values: the values inside the trimming interval as defined in trim.cutoffs above +# EXAMPLES +# fun_var_trim_display(data = c(1:100, 1:10), displayed.nb = NULL, single.value.display = FALSE, trim.method = "mean.sd", trim.cutoffs = c(0.05, 0.975), interval.scale.disp = TRUE, down.space = 0.75, left.space = 0.75, up.space = 0.3, right.space = 0.25, orient = 1, dist.legend = 0.37, box.type = "l", amplif.label = 1.25, amplif.axis = 1.25, std.x.range = TRUE, std.y.range = TRUE, cex.pt = 0.2, col.box = hsv(0.55, 0.8, 0.8), x.nb.inter.tick = 4, y.nb.inter.tick = 0, tick.length = 0.5, sec.tick.length = 0.3, corner.text = "", amplif.legend = 1, magnific.corner.text = 0.75, trim.return = TRUE) +# DEBUGGING +# data = c(1:100, 1:10) ; displayed.nb = NULL ; single.value.display = FALSE ; trim.method = "quantile" ; trim.cutoffs = c(0.05, 0.975) ; interval.scale.disp = TRUE ; down.space = 1 ; left.space = 1 ; up.space = 0.5 ; right.space = 0.25 ; orient = 1 ; dist.legend = 0.5 ; box.type = "l" ; amplif.label = 1 ; amplif.axis = 1 ; std.x.range = TRUE ; std.y.range = TRUE ; cex.pt = 0.1 ; col.box = hsv(0.55, 0.8, 0.8) ; x.nb.inter.tick = 4 ; y.nb.inter.tick = 0 ; tick.length = 0.5 ; sec.tick.length = 0.3 ; corner.text = "" ; amplif.legend = 1 ; magnific.corner.text = 0.75 ; trim.return = TRUE # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_param_check() +if( ! (all(class(data) == "numeric") | all(class(data) == "integer") | (all(class(data) == "matrix") & mode(data) == "numeric"))){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT MUST BE A NUMERIC VECTOR OR NUMERIC MATRIX\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_param_check() +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +if( ! is.null(displayed.nb)){ +tempo <- fun_param_check(data = displayed.nb, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(displayed.nb < 2){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": displayed.nb ARGUMENT MUST BE A SINGLE INTEGER VALUE GREATER THAN 1 AND NOT: ", paste(displayed.nb, collapse = " "), "\n\n================\n\n") +stop(tempo.cat) +} +} +tempo <- fun_param_check(data = single.value.display, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = trim.method, options = c("", "mean.sd", "quantile"), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = trim.cutoffs, class = "vector", mode = "numeric", length = 2, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = interval.scale.disp, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = down.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = left.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = up.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = right.space, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = orient, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = dist.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = box.type, options = c("o", "l", "7", "c", "u", "]", "n"), length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = amplif.label, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = amplif.axis, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = std.x.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = std.y.range, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = cex.pt, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = col.box, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = x.nb.inter.tick, class = "integer", length = 1, neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = y.nb.inter.tick, class = "integer", length = 1, neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = sec.tick.length, class = "vector", mode = "numeric", length = 1, prop = TRUE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = corner.text, class = "character", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = amplif.legend, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = magnific.corner.text, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = trim.return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +if(class(data) == "matrix"){ +data <- as.vector(data) +} +color.cut <- hsv(0.75, 1, 1) # color of interval selected +col.mean <- hsv(0.25, 1, 0.8) # color of interval using mean+/-sd +col.quantile <- "orange" # color of interval using quantiles +quantiles.selection <- c(0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.975, 0.99) # quantiles used in axis to help for choosing trimming cutoffs +if(single.value.display == FALSE & length(unique(data)) == 1){ +par(bty = "n", xaxt = "n", yaxt = "n", xpd = TRUE) +plot(1, pch = 16, col = "white", xlab = "", ylab = "") +text(x = 1, y = 1, paste0("No graphic displayed\nBecause data made of a single different value (", formatC(as.double(table(data))), ")"), cex = 2) +output <- list(trim.method = NULL, trim.cutoffs = NULL, real.trim.cutoffs = NULL, trimmed.values = NULL, kept.values = NULL) +}else{ +output <- list(trim.method = trim.method, trim.cutoffs = trim.cutoffs, real.trim.cutoffs = NULL, trimmed.values = NULL, kept.values = NULL) +fun.rug <- function(sec.tick.length.f = sec.tick.length, x.nb.inter.tick.f = x.nb.inter.tick, y.nb.inter.tick.f = y.nb.inter.tick){ +if(x.nb.inter.tick.f > 0){ +inter.tick.unit <- (par("xaxp")[2] - par("xaxp")[1]) / par("xaxp")[3] +par.ini <- par()[c("xpd", "tcl")] +par(xpd = FALSE) +par(tcl = -par()$mgp[2] * sec.tick.length.f) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) +suppressWarnings(rug(seq(par("xaxp")[1] - 10 * inter.tick.unit, par("xaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + x.nb.inter.tick.f)), ticksize = NA, side = 1)) # ticksize = NA to allow the use of par()$tcl value +par(par.ini) +rm(par.ini) +} +if(y.nb.inter.tick.f > 0){ +inter.tick.unit <- (par("yaxp")[2] - par("yaxp")[1]) / par("yaxp")[3] +par.ini <- par()[c("xpd", "tcl")] +par(xpd = FALSE) +par(tcl = -par()$mgp[2] * sec.tick.length.f) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) +suppressWarnings(rug(seq(par("yaxp")[1] - 10 * inter.tick.unit, par("yaxp")[2] + 10 * inter.tick.unit, by = inter.tick.unit / (1 + y.nb.inter.tick.f)), ticksize = NA, side = 2)) # ticksize = NA to allow the use of par()$tcl value +par(par.ini) +rm(par.ini) +} +} +fun.add.cut <- function(data.f, trim.method.f = trim.method, trim.cutoffs.f = trim.cutoffs, color.cut.f = color.cut, return.f = FALSE){ +# DEBUGGING +# data.f = data ; trim.method.f = "mean.sd"; trim.cutoffs.f = trim.cutoffs ; color.cut.f = color.cut ; return.f = TRUE +real.trim.cutoffs.f <- NULL +if(trim.method.f != ""){ +data.f <- sort(data.f) +par.ini <- par()$xpd +par(xpd = FALSE) +if(trim.method.f == "mean.sd"){ +real.trim.cutoffs.f <- qnorm(trim.cutoffs.f, mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)) +abline(v = qnorm(trim.cutoffs.f, mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), col = color.cut.f) +segments(qnorm(trim.cutoffs.f[1], mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), par()$usr[4] * 0.75, qnorm(trim.cutoffs.f[2], mean(data.f, na.rm = TRUE), sd(data.f, na.rm = TRUE)), par()$usr[4] * 0.75, col = color.cut.f) +} +if(trim.method.f == "quantile"){ +real.trim.cutoffs.f <- quantile(data.f, probs = trim.cutoffs.f, type = 7) +abline(v = quantile(data.f, probs = trim.cutoffs.f, type = 7), col = color.cut.f) +segments(quantile(data.f, probs = trim.cutoffs.f[1], type = 7), par()$usr[4] * 0.75, quantile(data.f, probs = trim.cutoffs.f[2], type = 7), par()$usr[4] * 0.75, col = color.cut.f) +} +par(par.ini) +if(return.f == TRUE){ +trimmed.values.f <- data.f[data.f <= real.trim.cutoffs.f[1] | data.f >= real.trim.cutoffs.f[2]] +kept.values.f <- data.f[data.f > real.trim.cutoffs.f[1] & data.f < real.trim.cutoffs.f[2]] +} +}else{ +real.trim.cutoffs.f <- NULL +trimmed.values.f <- NULL +kept.values.f <- NULL +} +if(return.f == TRUE){ +output <- list(trim.method = trim.method.f, trim.cutoffs = trim.cutoffs.f, real.trim.cutoffs = real.trim.cutoffs.f, trimmed.values = trimmed.values.f, kept.values = kept.values.f) +return(output) +} +} +fun.interval.scale.display <- function(data.f, col.quantile.f = col.quantile, quantiles.selection.f = quantiles.selection, col.mean.f = col.mean){ # intervals on top of graphs +par.ini <- par()[c("mgp", "xpd")] +par(mgp = c(0.25, 0.25, 0), xpd = NA) +axis(side = 3, at = c(par()$usr[1], par()$usr[2]), labels = rep("", 2), col = col.quantile.f, lwd.ticks = 0) +par(xpd = FALSE) +axis(side = 3, at = quantile(as.vector(data.f), probs = quantiles.selection.f, type = 7), labels = quantiles.selection.f, col.axis = col.quantile.f, col = col.quantile.f) +par(mgp = c(1.75, 1.75, 1.5), xpd = NA) +axis(side = 3, at = c(par()$usr[1], par()$usr[2]), labels = rep("", 2), col = col.mean.f, lwd.ticks = 0) +par(xpd = FALSE) +axis(side = 3, at = m + s * qnorm(quantiles.selection.f), labels = formatC(round(qnorm(quantiles.selection.f), 2)), col.axis = col.mean.f, col = col.mean.f, lwd.ticks = 1) +par(par.ini) +} +zone<-matrix(1:4, ncol=2) +layout(zone) +par(omi = c(0, 0, 1.5, 0), mai = c(down.space, left.space, up.space, right.space), las = orient, mgp = c(dist.legend / 0.2, 0.5, 0), xpd = FALSE, bty= box.type, cex.lab = amplif.label, cex.axis = amplif.axis, xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) +par(tcl = -par()$mgp[2] * tick.length) # tcl gives the length of the ticks as proportion of line text, knowing that mgp is in text lines. So the main ticks are a 0.5 of the distance of the axis numbers by default. The sign provides the side of the tick (negative for outside of the plot region) +if(is.null(displayed.nb)){ +sampled.data <- as.vector(data) +if(corner.text == ""){ +corner.text <- paste0("ALL VALUES OF THE DATASET DISPLAYED") +}else{ +corner.text <- paste0(corner.text, "\nALL VALUES OF THE DATASET DISPLAYED") +} +}else{ +if(length(as.vector(data)) > displayed.nb){ +sampled.data <- sample(as.vector(data), displayed.nb, replace = FALSE) +if(corner.text == ""){ +corner.text <- paste0("BEWARE: ONLY ", displayed.nb, " VALUES ARE DISPLAYED AMONG THE ", length(as.vector(data)), " VALUES OF THE DATASET ANALYZED") +}else{ +corner.text <- paste0(corner.text, "\nBEWARE: ONLY ", displayed.nb, " VALUES ARE DISPLAYED AMONG THE ", length(as.vector(data)), " VALUES OF THE DATASET ANALYZED") +} +}else{ +sampled.data <- as.vector(data) +if(corner.text == ""){ +corner.text <- paste0("BEWARE: THE DISPLAYED NUMBER OF VALUES PARAMETER ", deparse(substitute(displayed.nb)), " HAS BEEN SET TO ", displayed.nb, " WHICH IS ABOVE THE NUMBER OF VALUES OF THE DATASET ANALYZED -> ALL VALUES DISPLAYED") +}else{ +corner.text <- paste0(corner.text, "\nBEWARE: THE DISPLAYED NUMBER OF VALUES PARAMETER ", deparse(substitute(displayed.nb)), " HAS BEEN SET TO ", displayed.nb, " WHICH IS ABOVE THE NUMBER OF VALUES OF THE DATASET ANALYZED -> ALL VALUES DISPLAYED") +} +} +} +stripchart(sampled.data, method="jitter", jitter=0.4, vertical=FALSE, ylim=c(0.5, 1.5), group.names = "", xlab = "Value", ylab="", pch=1, cex = cex.pt / 0.2) +fun.rug(y.nb.inter.tick.f = 0) +boxplot(as.vector(data), horizontal=TRUE, add=TRUE, boxwex = 0.4, staplecol = col.box, whiskcol = col.box, medcol = col.box, boxcol = col.box, range = 0, whisklty = 1) +m <- mean(as.vector(data), na.rm = TRUE) +s <- sd(as.vector(data), na.rm = TRUE) +segments(m, 0.8, m, 1, lwd=2, col="red") # mean +segments(m -1.96 * s, 0.9, m + 1.96 * s, 0.9, lwd=1, col="red") # mean +graph.xlim <- par()$usr[1:2] # for hist() and qqnorm() below +if(interval.scale.disp == TRUE){ +fun.interval.scale.display(data.f = data) +if(corner.text == ""){ +corner.text <- paste0("MULTIPLYING FACTOR DISPLAYED (MEAN +/- SD) ON SCALES: ", paste(formatC(round(qnorm(quantiles.selection), 2))[-(1:(length(quantiles.selection) - 1) / 2)], collapse = ", "), "\nQUANTILES DISPLAYED ON SCALES: ", paste(quantiles.selection, collapse = ", ")) +}else{ +corner.text <- paste0(corner.text, "\nMULTIPLYING FACTOR DISPLAYED (MEAN +/- SD) ON SCALES: ", paste(formatC(round(qnorm(quantiles.selection), 2))[-(1:(length(quantiles.selection) - 1) / 2)], collapse = ", "), "\nQUANTILES DISPLAYED ON SCALES: ", paste(quantiles.selection, collapse = ", ")) +} +} +output.tempo <- fun.add.cut(data.f = data, return.f = TRUE) # to recover real.trim.cutoffs +if(trim.return == TRUE){ +output <- output.tempo +} +par(xpd = NA) +if(trim.method != ""){ +if(corner.text == ""){ +corner.text <- paste0("SELECTED CUT-OFFS (PROPORTION): ", paste(trim.cutoffs, collapse = ", "), "\nSELECTED CUT-OFFS: ", paste(output.tempo$real.trim.cutoffs, collapse = ", ")) +}else{ +corner.text <- paste0(corner.text, "\nSELECTED CUT-OFFS (PROPORTION): ", paste(trim.cutoffs, collapse = ", "), "\nSELECTED CUT-OFFS: ", paste(output.tempo$real.trim.cutoffs, collapse = ", ")) +} +if(interval.scale.disp == TRUE){ +legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- 1.96sd", paste0("Trimming interval: ", paste0(trim.cutoffs, collapse = " , ")), "Mean +/- sd multiplying factor", "Quantile"), yjust = 0, lty=1, col=c(col.box, "red", color.cut, col.mean, col.quantile), bty="n", cex = amplif.legend) +}else{ +legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- 1.96sd", paste0("Trimming interval: ", paste0(trim.cutoffs, collapse = " , "))), yjust = 0, lty=1, col=c(col.box, "red", color.cut), bty="n", cex = amplif.legend, y.intersp=1.25) +} +}else{ +if(interval.scale.disp == TRUE){ +legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- sd", "Mean +/- sd multiplying factor", "Quantile"), yjust = 0, lty=1, col=c(col.box, "red", col.mean, col.quantile), bty="n", cex = amplif.legend) +}else{ +legend(x = (par("usr")[1] - ((par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1])) * par("plt")[1] - ((par("usr")[2] - par("usr")[1]) / (par("omd")[2] - par("omd")[1])) * par("omd")[1]), y = (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / (par("omd")[4] - par("omd")[3])) * (1 - par("omd")[4]) / 2), legend = c(c("min, Q1, Median, Q3, max"), "mean +/- sd"), yjust = 0, lty=1, col=c(col.box, "red"), bty="n", cex = amplif.legend, y.intersp=1.25) +} +} +par(xpd = FALSE, xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) +hist(as.vector(data), main = "", breaks = seq(min(as.vector(data), na.rm = TRUE), max(as.vector(data), na.rm = TRUE), length.out = length(as.vector(data)) / 10), xlim = graph.xlim, xlab = "Value", ylab="Density", col = grey(0.25)) +abline(h = par()$usr[3]) +fun.rug() +if(interval.scale.disp == TRUE){ +fun.interval.scale.display(data.f = data) +} +fun.add.cut(data.f = data) +par(xaxs = ifelse(std.x.range, "i", "r")) +stripchart(rank(sampled.data), method="stack", vertical=FALSE, ylim=c(0.99, 1.3), group.names = "", xlab = "Rank of values", ylab="", pch=1, cex = cex.pt / 0.2) +fun.rug(y.nb.inter.tick.f = 0) +x.text <- par("usr")[2] + (par("usr")[2] - par("usr")[1]) / (par("plt")[2] - par("plt")[1]) * (1 - par("plt")[2]) / 2 +y.text <- (par("usr")[4] + ((par("usr")[4] - par("usr")[3]) / (par("plt")[4] - par("plt")[3])) * (1 - par("plt")[4]) + ((par("usr")[4] - par("usr")[3]) / ((par()$omd[4] / 2) * ((par("plt")[4] - par("plt")[3])))) * (1 - par("omd")[4])) # BEWARE. Here in "(par()$omd[4] / 2", division by two because there are 2 graphs staked on the y axis, and not one +par(xpd=NA) +text(x = x.text, y = y.text, paste0(corner.text), adj=c(1, 1.1), cex = magnific.corner.text) # text at the topright corner +par(xpd=FALSE) +par(xaxs = ifelse(std.x.range, "i", "r"), yaxs = ifelse(std.y.range, "i", "r")) +qqnorm(as.vector(sampled.data), main = "", datax = TRUE, ylab = "Value", pch = 1, col = "red", cex = cex.pt / 0.2) +fun.rug() +if(diff(quantile(as.vector(data), probs = c(0.25, 0.75), na.rm = TRUE)) != 0){ # otherwise, error generated +qqline(as.vector(data), datax = TRUE) +} +if(interval.scale.disp == TRUE){ +fun.interval.scale.display(data.f = data) +} +fun.add.cut(data.f = data) +} +if(trim.return == TRUE){ +return(output) +} +} + + +######## fun_segmentation() #### Segment a dot cloud on a scatterplot and define the dots from another cloud outside the segmentation + + +# Check OK: clear to go Apollo +fun_segmentation <- function(data1, x1, y1, x.range.split = NULL, x.step.factor = 10, y.range.split = NULL, y.step.factor = 10, error = 0, data2 = NULL, x2, y2, xy.cross.kind = "&", graph.check = FALSE, graph.path = "C:/Users/Gael/Desktop/", path.lib = NULL){ +# AIM +# If data1 is a data frame corresponding to the data set of a scatterplot (with a x column for x-axis values and a y column for the y-axis column), then fun_segmentation() delimits a frame around the dots cloud using a sliding window set by x.range.split and x.step.factor to frame the top and bottom part of the cloud, and set by y.range.split and y.step.factor to frame the left and right part of the cloud +# If a second data frame is provided, corresponding to the data set of a scatterplot (with a x column for x-axis values and a y column for the y-axis column), then fun_segmentation() defines the dots of this data frame outside of the frame of the first data frame +# ARGUMENTS +# data1: a dataframe containing a column of x-axis values and a column of y-axis values +# x1: character string of the data1 column name for x-axis (first column of data1 by default) +# y1: character string of the data1 column name for y-axis (second column of data1 by default) +# x.range.split: positive non null numeric value giving the number of interval on the x value range. if x.range is the range of the dots on the x-axis, then abs(diff(x.range) / x.range.split) gives the window size. Window size decreases when range.split increases. In unit of x-axis. At least one of the x.range.split and y.range.split must be non NULL +# x.step.factor: positive non null numeric value giving the shift step of the window. If x.step.factor = 1, no overlap during the sliding (when the window slides from position n to position n+1, no overlap between the two positions). If x.step.factor = 2, 50% of overlap (when the window slides from position n to position n+1, the window on position n+1 overlap 50% of the window when it was on position n) +# y.range.split: same as x.range.split for the y-axis. At least one of the x.range.split and y.range.split must be non NULL +# y.step.factor: same as x.step.factor for the y-axis +# error: proportion (from 0 to 1) of false positives (i.e., proportion of dots from data1 outside of the frame). 0.05 means 5% of the dots from data1 outside of the frame +# data2: a dataframe containing a column of x-axis values and a column of y-axis values, for which outside dots of the data1 cloud has to be determined. Write NULL if not required +# x2: character string of the data1 column name for x-axis (first column of data1 by default) +# y2: character string of the data1 column name for y-axis (second column of data1 by default) +# xy.cross.kind: if data2 is non null and if both x.range.split and y.range.split are non null, which dots are finally significants? Write "&" for intersection of outside dots on x and on y. Write "|" for union of outside dots on x and on y +# graph.check: logical. Print a pdf graph that check the frame? +# graph.path: absolute path of the directory to print the pdf graph.check. Ignored if graph.check is FALSE +# path.lib: absolute path of the required packages, if not in the default folders. Ignored if graph.check is FALSE +# REQUIRED PACKAGES +# ggplot2 if graph.check is TRUE +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# if graph.check is TRUE: +# fun_pack_import() +# fun_open_window() +# fun_gg_palette() +# fun_gg_scatter() +# fun_gg_empty_graph() +# fun_close_specif_window() +# RETURN +# a pdf plot if graph.check is TRUE +# a list containing: +# hframe: x and y coordinates of the bottom and top frames for frame plotting (frame1 for the left step and frame2 for the right step) +# vframe: x and y coordinates of the left and right frames for frame plotting (frame1 for the down step and frame2 for the top step) +# data1.signif.dot: the significant dots of data1 (i.e., dots outside the frame) +# data2.signif.dot: the significant dots of data2 if non NULL (i.e., dots outside the frame) +# warnings: warning messages +# EXAMPLES +# set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = 20, x.step.factor = 10, y.range.split = 23, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], xy.cross.kind = "|", graph.check = TRUE, graph.path = "C:/Users/Gael/Desktop/", path.lib = NULL) +# set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = NULL, x.step.factor = 10, y.range.split = 23, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], xy.cross.kind = "|", graph.check = TRUE, graph.path = "C:/Users/Gael/Desktop/", path.lib = NULL) +# set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = 20, x.step.factor = 10, y.range.split = NULL, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], xy.cross.kind = "&", graph.check = TRUE, graph.path = "C:/Users/Gael/Desktop/", path.lib = NULL) +# DEBUGGING +# set.seed(1) ; data1 = data.frame(x = rnorm(50), y = rnorm(50)) ; x1 = names(data1)[1] ; y1 = names(data1)[2] ; x.range.split = 5 ; x.step.factor = 10 ; y.range.split = 5 ; y.step.factor = 10 ; error = 0 ; data2 = data.frame(x = rnorm(50, 0, 2), y = rnorm(50, 0, 2)) ; set.seed(NULL) ; x2 = names(data2)[1] ; y2 = names(data2)[2] ; xy.cross.kind = "|" ; graph.check = TRUE ; graph.path = "C:/Users/Gael/Desktop/" ; path.lib = NULL +# set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; x1 = names(data1)[1] ; y1 = names(data1)[2] ; x.range.split = NULL ; x.step.factor = 10 ; y.range.split = 23 ; y.step.factor = 10 ; error = 0 ; x2 = names(data2)[1] ; y2 = names(data2)[2] ; xy.cross.kind = "|" ; graph.check = TRUE ; graph.path = "C:/Users/Gael/Desktop/" ; path.lib = NULL +# set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; x1 = names(data1)[1] ; y1 = names(data1)[2] ; x.range.split = 20 ; x.step.factor = 10 ; y.range.split = NULL ; y.step.factor = 10 ; error = 0 ; x2 = names(data2)[1] ; y2 = names(data2)[2] ; xy.cross.kind = "&" ; graph.check = TRUE ; graph.path = "C:/Users/Gael/Desktop/" ; path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = data1, class = "data.frame", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & length(data1) < 2){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OF AT LEAST 2 COLUMNS\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_param_check(data = x1, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (x1 %in% names(data1))){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x1 ARGUMENT MUST BE A COLUMN NAME OF data1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_param_check(data = y1, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (y1 %in% names(data1))){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y1 ARGUMENT MUST BE A COLUMN NAME OF data1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +if(is.null(x.range.split) & is.null(y.range.split)){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": AT LEAST ONE OF THE x.range.split AND y.range.split ARGUMENTS MUST BE NON NULL\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +if( ! is.null(x.range.split)){ +tempo <- fun_param_check(data = x.range.split, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & x.range.split < 1){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x.range.split ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(y.range.split)){ +tempo <- fun_param_check(data = y.range.split, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & y.range.split < 1){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y.range.split ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +tempo <- fun_param_check(data = x.step.factor, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & x.step.factor < 1){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x.step.factor ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_param_check(data = y.step.factor, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & y.step.factor < 1){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y.step.factor ARGUMENT CANNOT BE LOWER THAN 1\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_param_check(data = error, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) +if( ! is.null(data2)){ +if(is.null(x2) | is.null(y2)){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x2 AND y2 ARGUMENTS CANNOT BE NULL IF data2 ARGUMENT IS NON NULL\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_param_check(data = data2, class = "data.frame", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & length(data2) < 2){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": data2 ARGUMENT MUST BE A DATA FRAME OF AT LEAST 2 COLUMNS\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +if( ! is.null(x2)){ +tempo <- fun_param_check(data = x2, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (x2 %in% names(data2))){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": x2 ARGUMENT MUST BE A COLUMN NAME OF data2\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(y2)){ +tempo <- fun_param_check(data = y2, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! (y2 %in% names(data2))){ +cat(paste0("\n\n================\n\nERROR IN ", function.name, ": y2 ARGUMENT MUST BE A COLUMN NAME OF data2\n\n================\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +} +if( ! (is.null(x.range.split)) & ! (is.null(y.range.split))){ +tempo <- fun_param_check(data = xy.cross.kind, options = c("&", "|"), length = 1, fun.name = function.name) ; eval(ee) +} +tempo <- fun_param_check(data = graph.check, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & graph.check == TRUE){ +tempo <- fun_param_check(data = graph.path, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(graph.path))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE graph.path PARAMETER DOES NOT EXISTS: ", graph.path, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +if( ! is.null(path.lib)){ +tempo <- fun_param_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# other required function checking +if(graph.check == TRUE){ +if(length(find("fun_pack_import", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack_import() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_open_window", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_open_window() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_gg_palette", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_palette() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_gg_empty_graph", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_empty_graph() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_gg_scatter", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_gg_scatter() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_close_specif_window", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_close_specif_window() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +} +# end other required function checking +# package checking +if(graph.check == TRUE){ +fun_pack_import(req.package = c("ggplot2"), path.lib = path.lib) +} +# end package checking +# main code +warning <- NULL +data1 <- data1[ ! duplicated(data1[, c(x1, y1)]), ] # remove the dots that have same x and y values +data1 <- cbind(data1, DOT_NB = 1:nrow(data1)) +if( ! is.null(data2)){ +data2 <- data2[ ! duplicated(data2[, c(x2, y2)]), ] # remove the dots that have same x and y values +data2 <- cbind(data2, DOT_NB = 1:nrow(data2)) +} +# may be create vector of each column to increase speed +# Method using x unit interval +x.data1.l <- NULL # x coord of the y upper and lower limits defined on the data1 cloud for left step line +x.data1.r <- NULL # x coord of the y upper and lower limits defined on the data1 cloud for right step line +y.data1.down.limit.l <- NULL # lower limit of the data1 cloud for left step line +y.data1.top.limit.l <- NULL # upper limit of the data1 cloud for left step line +y.data1.down.limit.r <- NULL # lower limit of the data1 cloud for right step line +y.data1.top.limit.r <- NULL # upper limit of the data1 cloud for left step line +x.range <- range(data1[, x1], na.rm = TRUE) +y.range <- range(data1[, y1], na.rm = TRUE) +x.range.plot <- range(data1[, x1], na.rm = TRUE) +y.range.plot <- range(data1[, y1], na.rm = TRUE) +if( ! is.null(data2)){ +x.range.plot <- range(data1[, x1], data2[, x2], na.rm = TRUE) +y.range.plot <- range(data1[, y1], data2[, y2], na.rm = TRUE) +} +if( ! is.null(x.range.split)){ +# data.frame ordering to slide the window from small to big values + sliding window definition +data1 <- data1[order(data1[, x1], na.last = TRUE), ] +if( ! is.null(data2)){ +data2 <- data2[order(data2[, x2], na.last = TRUE), ] +} +x.win.size <- abs(diff(x.range) / x.range.split) # in unit of x-axis +step <- x.win.size / x.step.factor +# end data.frame ordering to slide the window from small to big values + sliding window definition +# x-axis sliding and y-axis limits of the data1 cloud -> y significant data2 +loop.nb <- ceiling((diff(x.range) - x.win.size) / step) # x.win.size + n * step covers the x range if x.win.size + n * step >= diff(x.range), thus if n >= (diff(x.range) - x.win.size) / step +y.outside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are upper or lower than the frame +y.inside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are not upper or lower than the frame +y.data1.median <- median(data1[, y1], na.rm = TRUE) # will be used for sliding windows without data1 in it +if( ! is.null(data2)){ +y.outside.data2.dot.nb <- integer() # vector that will contain the selected 1D coordinates (i.e., dots) of data2 that are upper or lower than the data1 frame +y.inside.data2.dot.nb <- integer() # vector that will contain the 1D coordinates (i.e., dots) of data2 that are not upper or lower than the data1 frame +# recover data2 dots outside the range of data1 +if(any(data2[, x2] < x.range[1])){ +y.outside.data2.dot.nb <- c(y.outside.data2.dot.nb, data2$DOT_NB[data2[, x2] < x.range[1]]) +} +if(any(data2[, x2] > x.range[2])){ +y.outside.data2.dot.nb <- c(y.outside.data2.dot.nb, data2$DOT_NB[data2[, x2] > x.range[2]]) +} +# end recover data2 dots outside the range of data1 +} +# loop.ini.time <- as.numeric(Sys.time()) +for(i1 in 0:(loop.nb + 1)){ +min.pos <- x.range[1] + step * i1 # lower position of the sliding window in data1 +max.pos <- min.pos + x.win.size # upper position of the sliding window in data1 +x.data1.l <- c(x.data1.l, min.pos, min.pos + step) # min.pos + step to make the steps +x.data1.r <- c(x.data1.r, max.pos, max.pos + step) # max.pos + step to make the steps +x.data1.dot.here <- data1[, x1] >= min.pos & data1[, x1] < max.pos # is there data1 dot present in the sliding window, considering the x axis? +if( ! is.null(data2)){ +x.data2.dot.here <- data2[, x2] >= min.pos & data2[, x2] < max.pos # is there data2 dot present in the sliding window, considering the x axis? +} +# recover the data1 dots outside the frame +if(any(x.data1.dot.here == TRUE)){ +tempo.y.data1.top.limit <- quantile(data1[x.data1.dot.here, y1], probs = 1 - error, na.rm = TRUE) +tempo.y.data1.down.limit <- quantile(data1[x.data1.dot.here, y1], probs = 0 + error, na.rm = TRUE) +y.data1.top.limit.l <- c(y.data1.top.limit.l, tempo.y.data1.top.limit, tempo.y.data1.top.limit) +y.data1.down.limit.l <- c(y.data1.down.limit.l, tempo.y.data1.down.limit, tempo.y.data1.down.limit) +y.data1.top.limit.r <- c(y.data1.top.limit.r, tempo.y.data1.top.limit, tempo.y.data1.top.limit) +y.data1.down.limit.r <- c(y.data1.down.limit.r, tempo.y.data1.down.limit, tempo.y.data1.down.limit) +y.data1.dot.signif <- ! (data1[, y1] <= tempo.y.data1.top.limit & data1[, y1] >= tempo.y.data1.down.limit) & x.data1.dot.here # is there data1 dot present in the sliding window, above or below the data1 limits, considering the y axis? +y.data1.dot.not.signif <- x.data1.dot.here & ! y.data1.dot.signif +y.outside.data1.dot.nb <- c(y.outside.data1.dot.nb, data1$DOT_NB[y.data1.dot.signif]) # recover the row number of data1 +y.outside.data1.dot.nb <- unique(y.outside.data1.dot.nb) +y.inside.data1.dot.nb <- c(y.inside.data1.dot.nb, data1$DOT_NB[y.data1.dot.not.signif]) +y.inside.data1.dot.nb <- unique(y.inside.data1.dot.nb) +}else{ +y.data1.top.limit.l <- c(y.data1.top.limit.l, y.data1.median, y.data1.median) +y.data1.down.limit.l <- c(y.data1.down.limit.l, y.data1.median, y.data1.median) +y.data1.top.limit.r <- c(y.data1.top.limit.r, y.data1.median, y.data1.median) +y.data1.down.limit.r <- c(y.data1.down.limit.r, y.data1.median, y.data1.median) +} +# end recover the data1 dots outside the frame +# recover the data2 dots outside the frame +if( ! is.null(data2)){ +if(any(x.data1.dot.here == TRUE) & any(x.data2.dot.here == TRUE)){ +y.data2.dot.signif <- ! (data2[, y2] <= tempo.y.data1.top.limit & data2[, y2] >= tempo.y.data1.down.limit) & x.data2.dot.here # is there data2 dot present in the sliding window, above or below the data1 limits, considering the y axis? +y.data2.dot.not.signif <- x.data2.dot.here & ! y.data2.dot.signif +y.outside.data2.dot.nb <- c(y.outside.data2.dot.nb, data2$DOT_NB[y.data2.dot.signif]) +y.outside.data2.dot.nb <- unique(y.outside.data2.dot.nb) +y.inside.data2.dot.nb <- c(y.inside.data2.dot.nb, data2$DOT_NB[y.data2.dot.not.signif]) +y.inside.data2.dot.nb <- unique(y.inside.data2.dot.nb) +}else if(any(x.data1.dot.here == FALSE) & any(x.data2.dot.here == TRUE)){ # problem: data2 dots in the the windows but no data1 dots to generates the quantiles +tempo.warning <- paste0("THE [", round(min.pos, 3), " ; ", round(max.pos, 3), "] INTERVAL DOES NOT CONTAIN data1 X VALUES BUT CONTAINS data2 X VALUES WHICH CANNOT BE EVALUATED.\nTHE CONCERNED data2 NROWS ARE:\n", paste(which(x.data1.dot.here == FALSE & x.data2.dot.here == TRUE), collapse = "\n")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +# end recover the data2 dots outside the frame +# if(any(i1 == seq(1, loop.nb, 500))){ +# loop.fin.time <- as.numeric(Sys.time()) # time of process end +# cat(paste0("COMPUTATION TIME OF LOOP ", i1, " / ", loop.nb, ": ", as.character(lubridate::seconds_to_period(round(loop.fin.time - loop.ini.time))), "\n")) +# } +} +if(max.pos < x.range[2]){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE SLIDING WINDOW HAS NOT REACHED THE MAX VALUE OF data1 ON THE X-AXIS: ", max.pos, " VERSUS ", x.range[2], "\n\n================\n\n") +stop(tempo.cat) +} +y.outside.data1.dot.nb.final <- y.outside.data1.dot.nb[ ! (y.outside.data1.dot.nb %in% y.inside.data1.dot.nb)] # if a row number of y.inside.data2.dot.nb is present in y.outside.data2.dot.nb, it means that during the sliding, a dot has been sometime inside, sometime outside -> removed +y.outside.data2.dot.nb.final <- y.outside.data2.dot.nb[ ! (y.outside.data2.dot.nb %in% y.inside.data2.dot.nb)] # if a row number of y.inside.data2.dot.nb is present in y.outside.data2.dot.nb, it means that during the sliding, a dot has been sometime inside, sometime outside -> removed +# end x-axis sliding and y-axis limits of the data1 cloud -> y significant data2 +} +# end Method using x unit interval +# Method using y unit interval +y.data1.d <- NULL # y coord of the x upper and lower limits defined on the data1 cloud for down step line +y.data1.t <- NULL # y coord of the x upper and lower limits defined on the data1 cloud for top step line +x.data1.left.limit.d <- NULL # left limit of the data1 cloud for down step line +x.data1.right.limit.d <- NULL # right limit of the data1 cloud for down step line +x.data1.left.limit.t <- NULL # left limit of the data1 cloud for top step line +x.data1.right.limit.t <- NULL # right limit of the data1 cloud for top step line +if( ! is.null(y.range.split)){ +# data.frame ordering to slide the window from small to big values + sliding window definition +data1 <- data1[order(data1[, y1], na.last = TRUE), ] +if( ! is.null(data2)){ +data2 <- data2[order(data2[, y2], na.last = TRUE), ] +} +y.win.size <- abs(diff(y.range) / y.range.split) # in unit of y-axis +step <- y.win.size / y.step.factor +# end data.frame ordering to slide the window from small to big values + sliding window definition +# y-axis sliding and x-axis limits of the data1 cloud -> x significant data2 +loop.nb <- ceiling((diff(y.range) - y.win.size) / step) # y.win.size + n * step covers the y range if y.win.size + n * step >= diff(y.range), thus if n >= (diff(y.range) - y.win.size) / step +x.outside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are upper or lower than the frame +x.inside.data1.dot.nb <- integer() # vector that will contain the selected rows numbers of data1 that are not upper or lower than the frame +x.data1.median <- median(data1[, x1], na.rm = TRUE) # will be used for sliding windows without data1 in it +if( ! is.null(data2)){ +x.outside.data2.dot.nb <- integer() # vector that will contain the selected 1D coordinates (i.e., dots) of data2 that are upper or lower than the data1 frame +x.inside.data2.dot.nb <- integer() # vector that will contain the 1D coordinates (i.e., dots) of data2 that are not upper or lower than the data1 frame +# recover data2 dots outside the range of data1 +if(any(data2[, y2] < y.range[1])){ +x.outside.data2.dot.nb <- c(x.outside.data2.dot.nb, data2$DOT_NB[data2[, y2] < y.range[1]]) +} +if(any(data2[, y2] > y.range[2])){ +x.outside.data2.dot.nb <- c(x.outside.data2.dot.nb, data2$DOT_NB[data2[, y2] > y.range[2]]) +} +# end recover data2 dots outside the range of data1 +} +# loop.ini.time <- as.numeric(Sys.time()) +for(i1 in 0:(loop.nb + 1)){ +min.pos <- y.range[1] + step * i1 # lower position of the sliding window in data1 +max.pos <- min.pos + y.win.size # upper position of the sliding window in data1 +y.data1.d <- c(y.data1.d, min.pos, min.pos + step) # min.pos + step to make the steps +y.data1.t <- c(y.data1.t, max.pos, max.pos + step) # max.pos + step to make the steps +y.data1.dot.here <- data1[, y1] >= min.pos & data1[, y1] < max.pos # is there data1 dot present in the sliding window, considering the y axis? +if( ! is.null(data2)){ +y.data2.dot.here <- data2[, y2] >= min.pos & data2[, y2] < max.pos # is there data2 dot present in the sliding window, considering the y axis? +} +# recover the data1 dots outside the frame +if(any(y.data1.dot.here == TRUE)){ +tempo.x.data1.right.limit <- quantile(data1[y.data1.dot.here, x1], probs = 1 - error, na.rm = TRUE) +tempo.x.data1.left.limit <- quantile(data1[y.data1.dot.here, x1], probs = 0 + error, na.rm = TRUE) +x.data1.right.limit.d <- c(x.data1.right.limit.d, tempo.x.data1.right.limit, tempo.x.data1.right.limit) +x.data1.left.limit.d <- c(x.data1.left.limit.d, tempo.x.data1.left.limit, tempo.x.data1.left.limit) +x.data1.right.limit.t <- c(x.data1.right.limit.t, tempo.x.data1.right.limit, tempo.x.data1.right.limit) +x.data1.left.limit.t <- c(x.data1.left.limit.t, tempo.x.data1.left.limit, tempo.x.data1.left.limit) +x.data1.dot.signif <- ! (data1[, x1] <= tempo.x.data1.right.limit & data1[, x1] >= tempo.x.data1.left.limit) & y.data1.dot.here # is there data2 dot present in the sliding window, above or below the data1 limits, considering the x axis? +x.data1.dot.not.signif <- y.data1.dot.here & ! x.data1.dot.signif +x.outside.data1.dot.nb <- c(x.outside.data1.dot.nb, data1$DOT_NB[x.data1.dot.signif]) # recover the row number of data1 +x.outside.data1.dot.nb <- unique(x.outside.data1.dot.nb) +x.inside.data1.dot.nb <- c(x.inside.data1.dot.nb, data1$DOT_NB[x.data1.dot.not.signif]) +x.inside.data1.dot.nb <- unique(x.inside.data1.dot.nb) +}else{ +x.data1.right.limit.d <- c(x.data1.right.limit.d, x.data1.median, x.data1.median) +x.data1.left.limit.d <- c(x.data1.left.limit.d, x.data1.median, x.data1.median) +x.data1.right.limit.t <- c(x.data1.right.limit.t, x.data1.median, x.data1.median) +x.data1.left.limit.t <- c(x.data1.left.limit.t, x.data1.median, x.data1.median) +} +# end recover the data1 dots outside the frame +# recover the data2 dots outside the frame +if( ! is.null(data2)){ +if(any(y.data1.dot.here == TRUE) & any(y.data2.dot.here == TRUE)){ +x.data2.dot.signif <- ! (data2[, x2] <= tempo.x.data1.right.limit & data2[, x2] >= tempo.x.data1.left.limit) & y.data2.dot.here # is there data2 dot present in the sliding window, above or below the data1 limits, considering the x axis? +x.data2.dot.not.signif <- y.data2.dot.here & ! x.data2.dot.signif +x.outside.data2.dot.nb <- c(x.outside.data2.dot.nb, data2$DOT_NB[x.data2.dot.signif]) +x.outside.data2.dot.nb <- unique(x.outside.data2.dot.nb) +x.inside.data2.dot.nb <- c(x.inside.data2.dot.nb, data2$DOT_NB[x.data2.dot.not.signif]) +x.inside.data2.dot.nb <- unique(x.inside.data2.dot.nb) +}else if(any(y.data1.dot.here == FALSE) & any(y.data2.dot.here == TRUE)){ # recover the data2 dots outside the range of the data1 cloud +tempo.warning <- paste0("THE [", round(min.pos, 3), " ; ", round(max.pos, 3), "] INTERVAL DOES NOT CONTAIN data1 Y VALUES BUT CONTAINS data2 Y VALUES WHICH CANNOT BE EVALUATED.\nTHE CONCERNED data2 NROWS ARE:\n", paste(which(y.data1.dot.here == FALSE & y.data2.dot.here == TRUE), collapse = "\n")) +warning <- paste0(ifelse(is.null(warning), tempo.warning, paste0(warning, "\n\n", tempo.warning))) +} +} +# end recover the data2 dots outside the frame +# if(any(i1 == seq(1, loop.nb, 500))){ +# loop.fin.time <- as.numeric(Sys.time()) # time of process end +# cat(paste0("COMPUTATION TIME OF LOOP ", i1, " / ", loop.nb, ": ", as.character(lubridate::seconds_to_period(round(loop.fin.time - loop.ini.time))), "\n")) +# } +} +if(max.pos < y.range[2]){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": THE SLIDING WINDOW HAS NOT REACHED THE MAX VALUE OF data1 ON THE Y-AXIS: ", max.pos, " VERSUS ", y.range[2], "\n\n================\n\n") +stop(tempo.cat) +} +x.outside.data1.dot.nb.final <- x.outside.data1.dot.nb[ ! (x.outside.data1.dot.nb %in% x.inside.data1.dot.nb)] # if a row number of x.inside.data2.dot.nb is present in x.outside.data2.dot.nb, it means that during the sliding, a dot has between sometime inside, sometime outside -> removed +x.outside.data2.dot.nb.final <- x.outside.data2.dot.nb[ ! (x.outside.data2.dot.nb %in% x.inside.data2.dot.nb)] # if a row number of x.inside.data2.dot.nb is present in x.outside.data2.dot.nb, it means that during the sliding, a dot has between sometime inside, sometime outside -> removed +# end y-axis sliding and x-axis limits of the data1 cloud -> x significant data2 +} +# end Method using y unit interval +hframe = rbind( +data.frame( +x = if(is.null(x.data1.l)){NULL}else{x.data1.l}, +y = if(is.null(x.data1.l)){NULL}else{y.data1.down.limit.l}, +kind = if(is.null(x.data1.l)){NULL}else{"down.frame1"} +), +data.frame( +x = if(is.null(x.data1.r)){NULL}else{x.data1.r}, +y = if(is.null(x.data1.r)){NULL}else{y.data1.down.limit.r}, +kind = if(is.null(x.data1.r)){NULL}else{"down.frame2"} +), +data.frame( +x = if(is.null(x.data1.l)){NULL}else{x.data1.l}, +y = if(is.null(x.data1.l)){NULL}else{y.data1.top.limit.l}, +kind = if(is.null(x.data1.l)){NULL}else{"top.frame1"} +), +data.frame( +x = if(is.null(x.data1.r)){NULL}else{x.data1.r}, +y = if(is.null(x.data1.r)){NULL}else{y.data1.top.limit.r}, +kind = if(is.null(x.data1.r)){NULL}else{"top.frame2"} +) +) +vframe = rbind( +data.frame( +x = if(is.null(y.data1.d)){NULL}else{x.data1.left.limit.d}, +y = if(is.null(y.data1.d)){NULL}else{y.data1.d}, +kind = if(is.null(y.data1.d)){NULL}else{"left.frame1"} +), +data.frame( +x = if(is.null(y.data1.t)){NULL}else{x.data1.left.limit.t}, +y = if(is.null(y.data1.t)){NULL}else{y.data1.t}, +kind = if(is.null(y.data1.t)){NULL}else{"left.frame2"} +), +data.frame( +x = if(is.null(y.data1.d)){NULL}else{x.data1.right.limit.d}, +y = if(is.null(y.data1.d)){NULL}else{y.data1.d}, +kind = if(is.null(y.data1.d)){NULL}else{"right.frame1"} +), +data.frame( +x = if(is.null(y.data1.t)){NULL}else{x.data1.right.limit.t}, +y = if(is.null(y.data1.t)){NULL}else{y.data1.t}, +kind = if(is.null(y.data1.t)){NULL}else{"right.frame2"} +) +) +data1.signif.dot <- NULL +data2.signif.dot <- NULL +if(( ! is.null(x.range.split)) & ( ! is.null(y.range.split))){ +if(xy.cross.kind == "|"){ +if(length(unique(c(x.outside.data1.dot.nb.final, y.outside.data1.dot.nb.final))) > 0){ +data1.signif.dot <- data1[data1$DOT_NB %in% unique(c(x.outside.data1.dot.nb.final, y.outside.data1.dot.nb.final)), ] +} +}else if(xy.cross.kind == "&"){ +if(sum(x.outside.data1.dot.nb.final %in% y.outside.data1.dot.nb.final) > 0){ +data1.signif.dot <- data1[data1$DOT_NB %in% x.outside.data1.dot.nb.final[x.outside.data1.dot.nb.final %in% y.outside.data1.dot.nb.final], ] +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE INCONSISTENCY\n\n============\n\n")) +stop(tempo.cat) +} +if( ! is.null(data2)){ +if(xy.cross.kind == "|"){ +if(length(unique(c(x.outside.data2.dot.nb.final, y.outside.data2.dot.nb.final))) > 0){ +data2.signif.dot <- data2[data2$DOT_NB %in% unique(c(x.outside.data2.dot.nb.final, y.outside.data2.dot.nb.final)), ] +} +}else if(xy.cross.kind == "&"){ +if(sum(x.outside.data2.dot.nb.final %in% y.outside.data2.dot.nb.final) > 0){ +data2.signif.dot <- data2[data2$DOT_NB %in% x.outside.data2.dot.nb.final[x.outside.data2.dot.nb.final %in% y.outside.data2.dot.nb.final], ] +} +}else{ +tempo.cat <- (paste0("\n\n============\n\nERROR: CODE INCONSISTENCY\n\n============\n\n")) +stop(tempo.cat) +} +} +}else if(( ! is.null(x.range.split)) & is.null(y.range.split)){ +if(length(y.outside.data1.dot.nb.final) > 0){ +data1.signif.dot <- data1[data1$DOT_NB %in% y.outside.data1.dot.nb.final, ] +} +if( ! is.null(data2)){ +if(length(y.outside.data2.dot.nb.final) > 0){ +data2.signif.dot <- data2[data2$DOT_NB %in% y.outside.data2.dot.nb.final, ] +} +} +}else if(is.null(x.range.split) & ( ! is.null(y.range.split))){ +if(length(x.outside.data1.dot.nb.final) > 0){ +data1.signif.dot <- data1[data1$DOT_NB %in% x.outside.data1.dot.nb.final, ] +} +if( ! is.null(data2)){ +if(length(x.outside.data2.dot.nb.final) > 0){ +data2.signif.dot <- data2[data2$DOT_NB %in% x.outside.data2.dot.nb.final, ] +} +} +} +if(graph.check == TRUE){ +fun_open_window(pdf.disp = TRUE, path.fun = graph.path, pdf.name.file = "segmentation_graph") +if(( ! is.null(x.range.split)) & ( ! is.null(y.range.split))){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, vframe), x = list(x1, "x", "x"), y = list(y1, "y", "y"), categ = list(NULL, "kind", "kind"), legend.name = list("data1", "hframe" , "vframe"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_path", "geom_path"), title = "DATA1", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data1.signif.dot)){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, vframe, data1.signif.dot), x = list(x1, "x", "x", x1), y = list(y1, "y", "y", y1), categ = list(NULL, "kind", "kind", NULL), legend.name = list("data1", "hframe" , "vframe", "data1.signif.dots"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2), "black"), geom = list("geom_point", "geom_path", "geom_path", "geom_point"), title = "DATA1 + DATA1 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +fun_gg_empty_graph(text = "NO PLOT BECAUSE NO DATA1 DOTS OUTSIDE THE LIMITS", text.size = 12, title = "DATA1 + DATA1 SIGNIFICANT DOTS") +} +if( ! is.null(data2)){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, hframe , vframe), x = list(x1, x2, "x", "x"), y = list(y1, y2, "y", "y"), categ = list(NULL, NULL, "kind", "kind"), legend.name = list("data1", "data2", "hframe" , "vframe"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_path", "geom_path"), title = "DATA1 + DATA2", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data2.signif.dot)){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.signif.dot, hframe , vframe), x = list(x1, x2, x2, "x", "x"), y = list(y1, y2, y2, "y", "y"), categ = list(NULL, NULL, NULL, "kind", "kind"), legend.name = list("data1", "data2", "data2.signif.dots", "hframe" , "vframe"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], "black", rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path", "geom_path"), title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +fun_gg_empty_graph(text = "NO PLOT BECAUSE NO DATA2 DOTS OUTSIDE THE LIMITS", text.size = 12, title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS") +} +} +}else if(( ! is.null(x.range.split)) & is.null(y.range.split)){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe), x = list(x1, "x"), y = list(y1, "y"), categ = list(NULL, "kind"), legend.name = list("data1", "hframe"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_path"), title = "DATA1", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data1.signif.dot)){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, hframe, data1.signif.dot), x = list(x1, "x", x1), y = list(y1, "y", y1), categ = list(NULL, "kind", NULL), legend.name = list("data1", "hframe", "data1.signif.dots"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2), "black"), geom = list("geom_point", "geom_path", "geom_point"), title = "DATA1 + DATA1 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +fun_gg_empty_graph(text = "NO PLOT BECAUSE NO DATA1 DOTS OUTSIDE THE LIMITS", text.size = 12, title = "DATA1 + DATA1 SIGNIFICANT DOTS") +} +if( ! is.null(data2)){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, hframe), x = list(x1, x2, "x"), y = list(y1, y2, "y"), categ = list(NULL, NULL, "kind"), legend.name = list("data1", "data2", "hframe"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_point", "geom_path"), title = "DATA1 + DATA2", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data2.signif.dot)){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.signif.dot, hframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list(NULL, NULL, NULL, "kind"), legend.name = list("data1", "data2", "data2.signif.dots", "hframe"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], "black", rep(hsv(h = c(0.1, 0.15), v = c(0.75, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +fun_gg_empty_graph(text = "NO PLOT BECAUSE NO DATA2 DOTS OUTSIDE THE LIMITS", text.size = 12, title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS") +} +} +}else if(is.null(x.range.split) & ( ! is.null(y.range.split))){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, vframe), x = list(x1, "x"), y = list(y1, "y"), categ = list(NULL, "kind"), legend.name = list("data1", "vframe"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_path"), title = "DATA1", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data1.signif.dot)){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, vframe, data1.signif.dot), x = list(x1, "x", x1), y = list(y1, "y", y1), categ = list(NULL, "kind", NULL), legend.name = list("data1", "vframe", "data1.signif.dots"), color = list(fun_gg_palette(2)[2], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2), "black"), geom = list("geom_point", "geom_path", "geom_point"), title = "DATA1 + DATA1 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +fun_gg_empty_graph(text = "NO PLOT BECAUSE NO DATA1 DOTS OUTSIDE THE LIMITS", text.size = 12, title = "DATA1 + DATA1 SIGNIFICANT DOTS") +} +if( ! is.null(data2)){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, vframe), x = list(x1, x2, "x"), y = list(y1, y2, "y"), categ = list(NULL, NULL, "kind"), legend.name = list("data1", "data2", "vframe"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_path"), title = "DATA1 + DATA2", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +if( ! is.null(data2.signif.dot)){ +tempo.graph <- fun_gg_scatter(data1 = list(data1, data2, data2.signif.dot, vframe), x = list(x1, x2, x2, "x"), y = list(y1, y2, y2, "y"), categ = list(NULL, NULL, NULL, "kind"), legend.name = list("data1", "data2", "data2.signif.dots", "vframe"), color = list(fun_gg_palette(2)[2], fun_gg_palette(2)[1], "black", rep(hsv(h = c(0.5, 0.6), v = c(0.9, 1)), 2)), geom = list("geom_point", "geom_point", "geom_point", "geom_path"), title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS", xlim = x.range.plot, ylim = y.range.plot) +if( ! is.null(tempo.graph$warnings)){ +warning <- paste0(ifelse(is.null(warning), tempo.graph$warnings, paste0(warning, "\n", tempo.graph$warnings))) +} +}else{ +fun_gg_empty_graph(text = "NO PLOT BECAUSE NO DATA2 DOTS OUTSIDE THE LIMITS", text.size = 12, title = "DATA1 + DATA2 + DATA2 SIGNIFICANT DOTS") +} +} +} +fun_close_specif_window() +} +tempo.list <- list(hframe = hframe, vframe = vframe, data1.signif.dot = data1.signif.dot, data2.signif.dot = data2.signif.dot, warnings = warning) +return(tempo.list) +} + + +################ Import + + +######## fun_pack_import() #### Check if R packages are present and import into the working environment + + +# Check OK: clear to go Apollo +fun_pack_import <- function(req.package, path.lib = NULL){ +# AIM +# check if the specified R packages are present in the computer and import them into the working environment +# ARGUMENTS +# req.package: character vector of package names to import +# path.lib: optional character vector specifying the absolute pathways of the directories containing some of the listed packages +# REQUIRED PACKAGES +# none +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# RETURN +# nothing +# EXAMPLES +# fun_pack_import(req.package = "nopackage") +# fun_pack_import(req.package = "ggplot2") +# fun_pack_import(req.package = "ggplot2", path.lib = "blablabla") +# DEBUGGING +# req.package = "ggplot2" ; path.lib = "C:/Program Files/R/R-3.5.1/library" +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = req.package, class = "character", fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_param_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# main code +if(is.null(path.lib)){ +path.lib <- .libPaths() # .libPaths(new = path.lib) # or .libPaths(new = c(.libPaths(), path.lib)) +}else{ +.libPaths(new = sub(x = path.lib, pattern = "/$|\\\\$", replacement = "")) # .libPaths(new = ) add path to default path. Beware: .libPaths() does not support / at the end of a submitted path. Thus check and replace last / or \\ in path +} +for(i0 in 1:length(req.package)){ +if( ! req.package[i0] %in% rownames(installed.packages(lib.loc = path.lib))){ +stop(paste0("\n\n================\n\nERROR IN ", function.name, ": PACKAGE ", req.package[i0], " MUST BE INSTALLED IN:\n", paste(path.lib, collapse = "\n"), "\n\n================\n\n")) +}else{ +suppressWarnings(suppressPackageStartupMessages(library(req.package[i0], lib.loc = path.lib, quietly = TRUE, character.only = TRUE))) +} +} +} + + +######## fun_python_pack_import() #### Check if python packages are present + + +# Check OK: clear to go Apollo +fun_python_pack_import <- function(req.package, path.lib = NULL, R.path.lib = NULL){ +# AIM +# check if the specified python packages are present in the computer (no import) +# ARGUMENTS +# req.package: character vector of package names to import +# path.lib: optional character vector specifying the absolute pathways of the directories containing some of the listed packages +# R.path.lib: absolute path of the required packages, if not in the default folders +# REQUIRED PACKAGES +# reticulate +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# fun_pack_import() +# RETURN +# nothing +# EXAMPLES +# fun_python_pack_import(req.package = "nopackage") +# fun_python_pack_import(req.package = "serpentine") +# fun_python_pack_import(req.package = "serpentine", path.lib = "blablabla") +# DEBUGGING +# req.package = "serpentine" ; path.lib = "C:/Program Files/R/R-3.5.1/library" ; R.path.lib = NULL +# req.package = "bad" ; path.lib = NULL ; R.path.lib = NULL +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +if(length(find("fun_pack_import", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_pack_import() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = req.package, class = "character", fun.name = function.name) ; eval(ee) +if( ! is.null(path.lib)){ +tempo <- fun_param_check(data = path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE path.lib PARAMETER DOES NOT EXISTS: ", path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if( ! is.null(R.path.lib)){ +tempo <- fun_param_check(data = R.path.lib, class = "character", fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & ! all(dir.exists(R.path.lib))){ +cat(paste0("\n\n============\n\nERROR IN ", function.name, ": \nDIRECTORY PATH INDICATED IN THE R.path.lib PARAMETER DOES NOT EXISTS: ", R.path.lib, "\n\n============\n\n")) +arg.check <- c(arg.check, TRUE) +} +} +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# end argument checking +# package checking +fun_pack_import(req.package = "reticulate", path.lib = R.path.lib) +# end package checking +# main code +if(is.null(path.lib)){ +path.lib <- reticulate::py_run_string(" +import sys ; +path_lib = sys.path +") # python string +path.lib <- path.lib$path_lib +} +for(i0 in 1:length(req.package)){ +tempo.try <- vector("list", length = length(path.lib)) +for(i1 in 1:length(path.lib)){ +tempo.try[[i1]] <- try(suppressWarnings(reticulate::import_from_path(req.package[i0], path = path.lib[i1])), silent = TRUE) +} +if(all(sapply(tempo.try, FUN = grepl, pattern = "[Ee]rror"))){ +stop(paste0("\n\n================\n\nERROR IN ", function.name, ": PACKAGE ", req.package[i0], " MUST BE INSTALLED IN THE MENTIONNED DIRECTORY:\n", paste(path.lib, collapse = "\n"), "\n\n================\n\n")) +}else{ +assign(req.package[i0], reticulate::import(req.package[i0])) +} +} +} + + +################ Exporting results (text & tables) + + +######## fun_export_data() #### Print string or data object into output file + + +# Check OK: clear to go Apollo +fun_export_data <- function(data = NULL, output ="results.txt", path = "C:/Users/Gael/Desktop", no.overwrite = TRUE, rownames.kept = FALSE, vector.cat = FALSE, noquote = TRUE, sep = 2){ +# AIM +# log file function: print a character string or a data object into a same output file +# REQUIRED FUNCTIONS FROM CUTE_LITTLE_R_FUNCTION +# fun_param_check() +# ARGUMENTS +# data: object to print in the output file. cannot be NULL +# output: name of the output file +# path: location of the output file +# no.overwrite: (logical) if output file already exists, defines if the printing is appended (default TRUE) or if the output file content is erased before printing (FALSE) +# rownames.kept: (logical) defines whether row names have to be removed or not in small tables (less than length.rows rows) +# vector.cat (logical). If TRUE print a vector of length > 1 using cat() instead of capture.output(). Otherwise (default FALSE) the opposite +# noquote: (logical). If TRUE no quote are present for the characters +# sep: number of separating lines after printed data (must be integer) +# RETURN +# nothing +# EXAMPLES +# fun_export_data() +# fun_export_data(data = 1:3, output = "results.txt", path = "C:/Users/Gael/Desktop", no.overwrite = TRUE, rownames.kept = FALSE, vector.cat = FALSE, noquote = FALSE, sep = 2) +# DEBUGGING +# data = 1:3 ; output = "results.txt" ; path = "C:/Users/Gael/Desktop" ; no.overwrite = TRUE ; rownames.kept = FALSE ; vector.cat = FALSE ; noquote = FALSE ; sep = 2 # for function debugging +# function name +function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") +# end function name +# required function checking +if(length(find("fun_param_check", mode = "function")) == 0){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": REQUIRED fun_param_check() FUNCTION IS MISSING IN THE R ENVIRONMENT\n\n================\n\n") +stop(tempo.cat) +} +# end required function checking +# argument checking +# argument checking without fun_param_check() +if(is.null(data)){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": data ARGUMENT CANNOT BE NULL\n\n================\n\n") +stop(tempo.cat) +} +# end argument checking without fun_param_check() +# argument checking with fun_param_check() +arg.check <- NULL # for function debbuging +checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools +ee <- expression(arg.check <- c(arg.check, tempo$problem) , checked.arg.names <- c(checked.arg.names, tempo$param.name)) +tempo <- fun_param_check(data = output, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & output == ""){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": output ARGUMENT AS \"\" DOES NOT CORRESPOND TO A VALID FILE NAME\n\n================\n\n") +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_param_check(data = path, class = "character", length = 1, fun.name = function.name) ; eval(ee) +if(tempo$problem == FALSE & dir.exists(path) == FALSE){ +tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": path ARGUMENT DOES NOT CORRESPOND TO EXISTING DIRECTORY\n", paste(path, collapse = "\n"),"\n\n================\n\n") +arg.check <- c(arg.check, TRUE) +} +tempo <- fun_param_check(data = no.overwrite, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = rownames.kept, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = vector.cat, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = noquote, class = "logical", length = 1, fun.name = function.name) ; eval(ee) +tempo <- fun_param_check(data = sep, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) +if(any(arg.check) == TRUE){ +stop() # nothing else because print = TRUE by default in fun_param_check() +} +# end argument checking with fun_param_check() +# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.2/r_debugging_tools-v1.2.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_param_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_param_check() +# the 4 next lines are inactivated but kept because at a time, I might have a problem with data (solved with data = NULL). These 4 lines are just to know how to detect a missing argument. Important here because if data is not provided, print the code of the data function +# arg.user.list <- as.list(match.call(expand.dots=FALSE))[-1] # recover all the arguments provided by the function user (excluding the argument with defaults values not provided by the user. Thus, it is really the list indicated by the user) +# default.arg.list <- formals(fun = sys.function(sys.parent())) # list of all the arguments of the function with their default values (not the values of the user !). It seems that ls() as first line of the function provide the names of the arguments (empty, called, etc., or not) +# arg.without.default.value <- sapply(default.arg.list, is.symbol) & sapply(sapply(default.arg.list, as.character), identical, "") # logical to detect argument without default values (these are typeof "symbol" and class "name" and empty character +# if( ! all(names(default.arg.list)[arg.without.default.value] %in% names(arg.user.list))){ # test that the arguments with no null values are provided by the user +# tempo.cat <- paste0("\n\n================\n\nERROR IN ", function.name, ": VALUE REQUIRED FOR THESE ARGUMENTS WITH NO DEFAULTS VALUES: ", paste(names(default.arg.list)[arg.without.default.value][ ! names(default.arg.list)[arg.without.default.value] %in% names(arg.user.list)], collapse = " "), "\n\n================\n\n") +#stop(tempo.cat) +# } +# end argument checking +# main code +if(all(class(data) %in% c("matrix", "data.frame", "table"))){ +if(rownames.kept == FALSE & all(class(data) == "data.frame") & nrow(data) != 0 & nrow(data) <= 4){ # for data frames with nrows <= 4 +rownames.output.tables <- "" +length.rows <- nrow(data) +for(i in 1:length.rows){ # replace the rownames of the first 4 rows by increasing number of spaces (beacause identical row names not allowed in data frames). This method cannot be extended to more rows as the printed data frame is shifted on the right because of "big empty rownames" +rownames.output.tables <- c(rownames.output.tables, paste0(rownames.output.tables[i]," ", collapse="")) +} +row.names(data) <- rownames.output.tables[1:length.rows] +}else if(rownames.kept == FALSE & all(class(data) %in% c("matrix", "table"))){ +rownames(data) <- rep("", nrow(data)) # identical row names allowed in matrices and tables +} +if(noquote == TRUE){ +capture.output(noquote(data), file=paste0(path, "/", output), append = no.overwrite) +}else{ +capture.output(data, file=paste0(path, "/", output), append = no.overwrite) +} +}else if(is.vector(data) & all(class(data) != "list") & (length(data) == 1 | vector.cat == TRUE)){ +if(noquote == TRUE){ +cat(noquote(data), file= paste0(path, "/", output), append = no.overwrite) +}else{ +cat(data, file= paste0(path, "/", output), append = no.overwrite) +} +}else{ # other (array, list, factor or vector with vector.cat = FALSE) +if(noquote == TRUE){ +capture.output(noquote(data), file=paste0(path, "/", output), append = no.overwrite) +}else{ +capture.output(data, file=paste0(path, "/", output), append = no.overwrite) +} +} +sep.final <- paste0(rep("\n", sep), collapse = "") +write(sep.final, file= paste0(path, "/", output), append = TRUE) # add a sep } diff --git a/cute_little_R_functions.docx b/cute_little_R_functions.docx index 9893a2ad6306192320f90458c183c782517c6436..20fee7f01dcd2fd13b0b300902a80ffc5086df52 100644 GIT binary patch literal 548896 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�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%0DVL}PP0~l>a@}n~Rqc^IRkfSCa_u3{0r`1!cmIph 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
J<{tZo#@ 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�tjNN!_ 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⪼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 delta 219030 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%0Ah5z|*d-FnXh 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%0Dy?)4?C%HWtSsg+d2 z+?=3gS`BkPqQrN1T`Rv<zjz28YO5G<^QuI;zoT>FX?+%>r3(_NEhkN;NJ$y6R;r;x z=ZCbX@i;3<Nx)4RwP@y_33P>+4l}v?E4ZpMDQ9!B8BI(ENb)Jfgk?^_jxj2vG8Bcq zrAJOy?N4+Z#EGiBR+xT3oH6~xthXr)2tiIwt~B%<HRQH1(t~pPQDRhCzhyH&t5*^e zGj-EtIuRV<D7^~$!TU2P^hM+5Sta7oEBx^4FA;G42x}A!b450%{Ah~kB_*Vjl)7gp zX(le)T(~?8&}DXDSeboCewvs~o+18adRwXg;3OHyps<;rar=A4YBBDlu|eCric1$` zWdc_pvYp6tA0JlL1N>&sLoaB?(lR#C?cOZg-UVi7vU-4gF&zW{e-EYaZ@!zK3*hWY z&aXY>{OCHSPuFz0;$M6o0h@O8?V@E=hWI{h)C7p`w+5CbWqaZ83pIQUBi^`;%<nFi z(ZMt}+@9GTV0dbOhRe%=j0(EiY=Pf!b`+S^Y>Fl~#!dMro;)MHF1leSsn*bYd2828 zhSDvBMQWRJB8YncR1a=dY4h!Cv|hlw-@aqGzqDn)>tIJ=IWM|kCfjcm@Z){S@y`SV zR3L_keqlX;CoLAuB#S>aw?3^XvJ(1|p4&uD?`VA4XB#G>s<$bYOAwAHMvSy0R-G?9 z(jk<s9T{rM=gys*iujgF#A5~BATkpPB>h?WfJAE<0Q)h%f4{po9A$9wJ18kC4l79Z zmhLyp8N}Z}c!t*{Dkf}_^blnBwS8=kU;rZT%oqQ-^Akv#2LDLZFwV<CdsSVT4!rtU z_=B7MA%VymtF%qs!pDiziQ)M|0*V`IjV+!RNm~*qMbmC^Y7CZ$oh4PrRi6ImqDHD6 z`>xwYqw3H8VdQ#S0cmdf{<^>K{r+hcy}~Q)XX_lyf*pMaEQ7^_*G(U|xO0RGDzF_M z+O+5>h+f5bqGyvUj#1iIKMcN8$|rD&ioHq;rj4RXkK`K!Kkf70wQ0ll=B;~+Pfw4G z1#8;zszsYH0e3Lv>|?tUgTn1{qYAJbL&ca`EiU7*yA84Ya6(){rvJ6OH_{^-K-yAt zz{_Q|!?qPtg#?8K4lBATu*#_>32X>S4<Qg!#Cn5QjyH8JHlu}@Lt1a)L%=Gefk7#k zW8^Qc5azjHnj_H5Ca4AV7WCHb7}`i@dqCbAPmz?wE9{>q_VB5(%y`OxG=LDtEc~Rt zDHflL!&k|GqZBDShnE#<6mn)~HR&9Cy~T#Xiy6Vp{nTmxnO1Z!smJHJ04)Ag0MvKf zSAHbcGAW9{+~bl<Y2Q5Db+UI@xGuZk$gf|;<0E6V|F~h5DM}qoK-iX=PkeozC8shF zmyuXV51=+?<~aX@Jjis>f{~um?a_sd0T&{I`w;(h_V6mej`BO?#n}`QQe7hu)Cofx zU$!W6@f?(5PD<iifYcRxCZJ<N+ZvQ2){dJ~Uf?GBL>8CL8~3?CdnEp5GJc1~FL9eK z4nc2x`&(h{LjOl0{Mj#CzI4Z0P29+E0xzx1CYt2F_2HB<wtYA#0bT|<GSI-1c=^)# z;Db2H;D5GZVt5+c!Ly8e##G$Qjsa>rDY=Vvm$wcrKVRd1{eU}v*#&+huBYX0avh%- z=`|;MFKwE9963eb48Rc6sNzO_JE`KjQc>1~?}cXHw(8!n;t&J#-!h7a1R_qMK}|^( zF(M#|$1xxyMd$Hqg8t4uakSlc$H_C*RX-k$-Tr7)E(;N6EPNhx>=MAfT$262$*e$9 zl2YUHD4*Z1Ult?KG}P-?)HU6el!jND{3Z1NBS!^82_XW%y~dbjA=A-dTaylVfF`nF zeG2n?@ndD<OTwbw;7WS7*V={|{B*a?nwf`-yL3mGW+m#1{tm*Nqr01-So$-%qW@Ay z6z%X@>yzJ+^19HT+wFWs1oy<|0lW;kj5H~6CZy1x2(uh0uj#!~lV3>Y;3?S4R!T9D zqfPBD6vA8N)u~<7)xi_zOzTL+v`~-SVP8BOe&ATLmQ7(b+IT2b+fX8I!@P1`9iC*_ zP9TkwRKLS>a<WJ4PK*ME)YNcnNyLdR<Kc%(cTl%T+!0UY4RP9nVlxKqBs;q07h1Ln z4L21tPn&>TK28okz;KleZ6;%SD97_Wb4XJ|G-r^J+wSUNO$R5iE4jVzHE-;WRDV`y z{`(-&0SKQ*vgoPitXIm9$RR4YcCyPY9Rl<$Y?;PdLrM3XwGB4=dU*A0q_>C<OMkeQ z&-#=SPb9kK6uk`=Dz`ijxdN^8X?#1DU3c{UK~F%?VO#osN??Z}p>XnN#2_Nw3?^Jh z^lyx)2fRK}Lsp!Rxp3?mD3%67xixU{iv-3k7_ok((FY+>^XEv3D@K&tUrZBIzRk9F zF2(e~X=`2P_#J|`C8`M<>1U_(^06Z<4E7$gcR-FR8T*pw-x0;3{(XJ|k-KNZpKJFf z_ufEhc>t(Ch&-$AHNgA2aesue=7T8k8soE?aR-NYj>VDs9)jTJzs$(?v2)pX>5R<e zC`fxxu6a{2AMz>K&xDAd*=*k~+^=^@kNyZz-6OMXA5{TyG!9IVh+j%<MZ+z%2i4?1 z@Iy7lcHLp=d|&-|cRAj`L!196zzj1OZwGV<*K2(YUG?bK73{T=O~1l{bcZ%;)?U>K zejWWdmN%TH{s?#Ga-7ticb#N5R8zc`2H<pD-rtI9!t!(lTZXU0N<Vy%-)BF~?Gki< z@^S2NZrGtryXVyQZmlHMF^+x}{E$GD`=;x-U~&;FW&{Jt6a+nFCj>8wzMrLnxB%vl zKlWBA(ay5CKcNjitz$sgO+er8lQ#FjU)mJdddFQ=s04o|Ps}Tdb~%ap+4T(L1ukU; z{}8=~TVc$4Dlm{cyWEt_+eLzi3)V;UyVD=Dznu7-Jh!;Ko8G?rCWz$=tcqGa94mT+ zG3KgZS|U1s+mNhG$f=Evb^pcOAOz@P)6FjV!({gtn5^{#CpX15>pkP~S2}aKfzWys z3hr5s<7;0l_h<F|f!{CQg3Svw;58ekiIaGlpF2e`?B2HMj$rwIlx;Bv8K%?OwwC^U zb%g_oh==fs;mZ-`gk=Jpfr7Os?BETUF|~Me1SZlQ&9wMDW{k|wlyyIs8vqauu7gu0 zf<DZWy8Df1>p2f`&3=#(D;K=|l1$p4zo1avr3a(B28j{{xy@Dyc{y_$5Hp8Dk6`^+ z-s+$p;4XsxehR#Yp9B%~pz(&4rE(MIaFNZQeXhL$S2J+;<0oV+VuCXe=e5Y-Y9m>+ zIw8Nhr;zv#Nr=_9A-~(GMFI7BXTaCmY}+Rie*6j#`Sv@?8wz@CRrm+XZ(>!RqB>9N zL9yO{pc&?uorO<MCv>C79}i5?qscyDH)+j^{Jls0v|~>OVS05|;rLLOaC8sE^mb=D zjgFbJpG~A57U9VGZwW9E1jql{1@L-6;^xoplByb`?#4qrMLpf?lL0a;G^=G|1V-^} z;*^Xc3_Y}dc0#+*-+K9}1$K|WXD`3GTG+hNq8=-a6=lZ?<QAmT5PZ}7S0^;YMM<X` z_8S3us!a%Y)~qQqMgU&WJKc2m_Wjh5&bar0<N<FE&!_bhf{u%UE~|we)v7;nlefIZ zi(iPlx9&zc^~JWBo)}OwP|1V5WtgP-V-z5_{!~tSgE&4)a>SsDPEjl_$1Rqu2P=9i zK|pU>!7<zmTT6N^nVhQQ$?E{x{@f(99mzFD!d&nGF7YTbiB}Qg%AiDGJR3M@n{NHW zaohg%4B1dtor+Q^yq)z)=!uqi*u{>cEBaS7k>XH<<=5#^qz+)G1hLgY0{(I8<q!+s z#B{V){*%9kTO0v=P-E#y!F8txMNh2)9cWrt_2g65ImXn0kM)>>VCIEDET}K_wa=bB z;NDi4xtCP!R2qIl{Oy?z9jqc1$MyKk8_-@>$G|i}5bwPgf$1QO17rEhERWG0<ww>| zRv^-Y`fH&}&l)iJSMzjoC;8(5hI9?SGMx*;b186z$)%vLE;apvkhZ%gpYtJh^J*lh z%*CDU*#P|0_6q-;xCBG<Jbwibl|+2w<M;fCG!64DWI_aj`8TfL_41pt(Z&ARU*}4v zro5Hg2Vc~1x1=W$VJMSzMI(_i(Aj-tF4v_+Wm1K`OE`c9(%svE?BRGmHi=o?n7vd& zxWSU5<qmw|{o=X00<Gm92B|7C?MQ!w<E?^OXYjoMW}+z8(*1oIH&;!?=R-FDE|#8K zTNoA;KMu~=LxDTzlmSzcL}4BpEblr$VISWw%;@(!g^YFY44e7~n+dl9id_$0r86g| zUz)_8+IK+fN@Dj<>riqSHLnXQNRHrfz@^3fyx^&(=Ii#Y`$gTuFd|NtfD4@WwfY`X zwG^3OOm?X7c{pu2q)u!vGVV|9SpR%Eh<a+2;BrkKOP&Ii;@NEDiv(z6(X<8`S`|=} zpFafG<ROQ^D68RNDgXT1M#Mre;BrVttdf#xZ^H&6-`RrudRnhYTIQw+m?Eh0A=CMY zHlGZyaS4>}j&+n`yzFRuAVPN<oA2=@*ya*_(J2N(RB>a9K#~ell9QHFb3Oe>>)bZi zNRTrrMey2c0=YJoEh9u^Efal@je>@Ldy-se-R;-*`I}8JgM(<`>QeqCg#GThLP~}} z!&wSMOU=de)|gA-Ldnizz<y6K*b?=W=EH~UG}amWYqju@gcd=2wl$<k78CEP3PWO1 zN_vO~Q{}_u9fFTlaoc-kqd-;4cV1cPvws|`o}YrBzgXA2INxk|C|uk7Y11I6tE;r2 zwgatmu0x9~8=wU{KnvF+yS+QdMPhtWUqB3`vZ)mX{msl;aig_&sZ{!OXp@6f@>6Fl zKZP8ZL$QMgo2rD$LT(tu@P&4i&g@$buI!b!Y1|L-Cvlem(Rx?F1kw1}Y&qd(zwBPu z{57-Pxdfw;RsAp81Xkfrcw$E#BCzr=O~=>EVj$S{dA)P~4n9}jX9H%wvS|Lt^;8Fd zOxMnhcj#|~DfnB!y|g#ADWIzZ7Z3_Rzf+ZJh#Vx7uxT8kFdm_xiFhQ3v}cAd%C^ys z{MaeES~uct`bm~^nUEAJ!{)G2$^18roRslK4BLvnQ|nJ6Cj>_x+H%g|;h&_0mxG(w zP?Yd<k=nQ{Svj9gH-awgh@aQPjRWk!7zRBjM$68xe6~bA_HKLDq2Y2nYEKAw{Cot0 z>8Ob=IhdATV@Vp+intd2GkM94q`K!`W#1AK4=Xt+SE&06n8G9u`9?q~C<`}QA!JNC z2Kyv}+_iL@eSYJOJ3^4Iu5Qgg;jzh>ycLnnGJJZZTDIV7^I0tyzlF9Q=EbD~KV$W0 zkea#p(4GTM{^*QViH#MRf4ynZVz(`WN&;8kN?Dbw*9NreTz#LBhS`#kS|)0s&kflx zc>f7F`YS;~dR5HZ6JRx`S-2*WE4uz%DO$zMkLUc~S3I3qglH&;m8Ieo@n*CpQ3Xak z+c68DAi;~<&Gq4^yDQpx^AY%$Z-Hgp$J~VNU{drAgXXrz*VH||Hg-T|?5ad)BdLF0 zHRL1<3C#kFqa!hI=<_X+$M>$?k4q?0mW!Eht9q&V)Arw*K;(z0!Th(NC{S)*#TuGo zn!0(3Keeu<42CcTx+o3u?2L(*T7`-pV|$PK-8C2sMfw9Y23C8DJK2EVnn3Vi$A5pP z;}13SlttDa0pV<EIJMlJiPDl}%elb{>AiMxIUw?ruTwy<jpq*+l||bA{K^5v0<4Oy z=R=eNl$hYZ+Q#0&7pjl<O0mrE;#C8lf2=S`{1O{3Jg4Y!?n)ayT<C=HDJbvnIEYlB z+H<eutW}Q?&hq*qY5=8}`_q_?wj`dDe^JRv=^e|OF=H%VRQ_~9Y2^VJF|-={-_tr^ zfA{@(G4#SZiP!qEn@E@gRwKmO`ttvA^-YbLMccCJq+{E*ZQHi(bZmXGZQHhOcgMDE z>tye9&&&M>>tU`rt7_D!Vs);OD=Z>Ug=`X<uwy`P62kvmKt1{7<#-c7{3W+4XA37^ zD^ThDuOa|K)t&@Y+*G@$Z^4F7hztx2&99K7h5|l97~nrA_HA~;BNNvP8={aSOhG|K zqVCT!DL#OLf||4hp+rj^Tx;5CLQUwlQXSo92HId3125BEKb%i-VCqzwwaglXcPfRG z2NdP_D~jet<%c8nB+Y}`W>?f3H}eNe`!GU}%X%f5XY2MMWo)gi1IF9M7lHQje%@Oc zR-%qvfKiq3mp4-gSJW?t2*~EN+-UCm71rol8mZfSsd@WrJbamT@(PaoAlpJ;rV(-N zHD88Za~Nj8z_QFc?Fa?5I%Xw^>x;j#w2L3OE9Pq;Fo~n@=dE$UKS4CtQW@Oq_K=cu z(}@@m2Rmmj&r&{G!30rUqAN@;V+-Nqjm>g)z<IZ4->!79Vp=tkqu-;6^1N2{d^4@V zK&b>O92v%uMJiPI598dTA*8$ozGFw>l!{3bN~onlDWs2AIlk#*ac7a8nLBC?xAx3A zTxo8T#OUd25Z0I;ghyU}Wn#l`8JFAPhA=VFke2xS&}m7?g<Q7sB~>AJvMDR1X|(bi z;K-xOKSro}R7FWur<h%`WOp%HXcd@YKI2;76XY?Ce(s|JLsqPn`~xBXc_4zf3s)%R zET4IiN4vMp=<BE-CUAT@zbJ+zPB@iiH_b~BMne*X-^-Xl#21RM2hPc1?<#p%u($B= zUkW%T)M8V!z&6si!)xknzK%_JUWY>h{N1NnR8>v6aQx|+kwU5~8OVrgG;RBAF#jxM zzOUtoz{w9(YN`_%)+oVEQAgWS$S#-seMp__;zq{bQ>U-tB}r|u$q!%&y%<pH1N`Il zvpdBHq^<z`+co;ffb!zRz?Ug{O>MD2wJ{(+(0<Alm=Zg5`|5go^E_;91{QY!TB&Nr zuFR<U#z2e^4{%S|rEh|K>DfrsId@`T#YqBcw?T!%VP1tVno%8L2g4c@U66@q-h+9x z>$lg0rIJ(i<_Yvi|J;MV<#eE#Ud4kZm|yR3M`X9LVvTb(o@9y?M>3^G5*#ovnM0+h zMW`|BL=%;M(P-baxK&-^XB`v*9;AP4Egi*0&c2XZ4P%K4;+L?uS>kRMOD%G6+qzyQ z=iToHY5Q(I=3^5%JJOTA9s$di3-0^e?0MqbvZD`!&@(HY{+<cg&t@ik-9B@!*w-ie zuQ=a3AQy+5f*Zk5)rtn59Q)&d@;&GNC6+gTOyeBL=-cfw$_yWJa$E|4*eS~I{bVwx zq*<Qr?pGuCpR{A8<9<KZ35Ld4eTS5lExEYfiVc3dHTz-8X@%J6<ahLNK+DJb&&ErK zpj94r<sl^vvSx`DdS+*k**b;sH<^R?E2`JBAFix?h#gW`6)#hZO(MoWeL)cG?=5dk z;|p%V{`Dr;E#e%zmsmW&dz*_i|7Z3Fwmb_1`(+&$oG$|Git!rZ5={oF%%Ox>=hj(s zaisCxjJ2qdI*mVg|0l{|sz)vns4|>9i7A=w48`GC`hYQ5RJGJbnL;YJ5BR=d5_YSm z1DWL%oIw$C!=V!>XT>^_6R3<Lttxqp<{s*z4V=6@rYBcftU4~BG=@CJ$=e@|B)2de zS0$}2%VVOUZXpdGoBrm7lf7U0FO^)^zosHBY}Tcchk7>MG=oGj@`H7>F;7t`JtDS@ z$)IE>4=TZtt(`$u+&URPU46ZH<Lrk91=q{;miJqj7$-*u-$icjQsH7R^@GB#z-6oh z<!dW@*8+VtVV+b#)>Y$?+#jZU+{#=pRG9o<%)}ZSz_j;3PB?%1l@juX)2^2^_a#$m zPd1J&fNA-_A(ln|$ZcP(1+jBF34}C+rM2ScbNZT3A9Wr?w~H3_2xMk6d*mbKn=M)j zrn+)~8&qOskikbMNY+^Z^+jGDaLR>ro74jjgo*WEGejc++JR;d-W&SsaX?uL6on$d zh050MPc29Xv9*?{W79{?@a+W|-PuZc^~;yUmwz-xTR!Dnz=>f6SPGY&m#pB%HlXzk z@KL{e`FxiKr=fYJwQUv%X<dVj3{{wk5lR5htH;)}rto>DH8`Xx)G2y<7x<)SEKgs? z(Fk-&pmqpoeAj-(95fDXE7k$OUK_dkSMM{}FmF=L^>A=WYYCn_uq#EC3^Pr&k{mPB zH*jqelSmu8hx!m1LKP}yR=aF#i6koplW@BGo1??M^9{F1W9+DgaRC1>L1Hn;31^Xj zGKgNYmzS+c(%@rhNG(Zo8>zLbgn<~fDlig`<f0cKN$;BQY4Q}SkcGSkCsU*7_Zhy6 z8W+&LY!%lO2O)ZCc_}Q0@}l2wDyQ9nWukEjw5nf}Tk(^}O`A?-HvUqvc{}^9Z8&Hr z8pjVGR>2&ZUy}oG3zTH%*MVq>-js1ZPTmF)=JYzX{*n~}evg~bX+!QzNoGT1*zRCm zc(lI(FlOfJ#B`k$omzWC5nYH|5_OcZe&%@|g*A^&C1vsOy@L$DzmU3tM7Nf&6B@+o zxGa}la%QdKeq)GfrpD7G8Ctb6x)fI6^cJ4<xQc>o`du+}iOpu$PTYO11+~Z0AG*P+ z`nKkP@-hSx2@hkb)mKvLtJZ^={V`lIE0&-F%z_Y(U}*j&zka4c+}Aj@2yYYgW?8!! zV=rE|XwG1BTS~DBX4`YJgNmS%4I?I-zwWhGC>5tLXG1Ypa_eP!>0!wluM}lYTB5Ma z%OYLz5Eeoa`gypks6)xR(DcNS-DHK52>iY|oF<$o;9H8WVyZ%4>Weu2SBhqtO6Ru# zqmvQx6S1d4Gl9Go$EKg%G?ys;dAFm?2C5Y^l#u4r7I|Zo`dFF1$^{ljPJSryDlT$K z33T&SD^_J(rK}ZBM#ikZ#1$B2H|bHqR@gc)Du}pm($~Gtjz7qV&MVh>jz6%WdGd$x z|DI{6+0q84KVK4<Ni!_-N6uL33|j;gMNH_IhdN=mjBxMQGy0!))ETAO^h4KkvgI36 zo5lXg&)7Rl-Qq;1s(EE~Oi7{`4(DCh9>b&q(IA)d5un~(dpZXx10Qn~Z5mAgnTWWq z(Ukm`z@RQukFE=+%r#Uu=VAyhHbK=IJgLEGRWx^vN^Q)0b#dAHBtjbfk_`i}&sU2+ zgYqaKA1jUPMVwr3#vk1md1$IRmRQ3HasNVqpR4~%Yi>nK!ycXcN7phC7H4|(P`_aK z5vm(lP`AkuLMmszD51gO;Whbuzk`M{vxHNqdTe4&kdn>Qn){JF|3sNd7?3E+ZN{VU zMkb3Hz9icufdc(>h>^$m9!w30+Fb=jLg^V|J`s&T)e2RosCy0hh^|EsrL`cQ$3X75 zi_3bBYpcfF`CEVdF5B{Yp?77tf5&07$5(2?Dzh6@JCfw#0g;;zKn#6Qqyg_O4EQvu zDb%TDzzjQ--CDKMHsm}EHH4bfjP0L?WakeXi(79R;j_QHCG^4vyrcm}u^*aiE32h* z!XEEN{x;Rb<}Mtj3$WTG9AliXuIcz&9a=kSwlP!cEC%l%7KbbClEZ14DAaK0ASAF* zG#c%@5Zk8@jEI3mY#&*spt7l5$syg+q(!Z0<OHd&XtW2Z?~K1#NblbRMu3KeKb}qc ztV=%8LdliTnoSAlw^9KZ(Ixi&*nxbDCOzs8%?$i=IC@}rjuD0$`)%86+#INjExWO` znA7)ih-h?k9{dc&uh>Rw#71pyb)RET<2PG4zQLx$6amO3bq}uRD%=Q&xV?>LB7eQM zgmy*#zWe*1?Bz{(JdnrwPFPUT+*F8OplS`}jT#%4!vsju#3=$YqqY?bI($zhSoILk z)HmmwuX-nv%=!x0#35coElWfdIx7=K?&o08+>#?`J~Axnp{L>xol35<Po*~|fcVZV zmfJU7$V#kVQjGWG&8)N7<U({!6A1B-(hmhn=+R-b5D&R~0<I<0MTn2<HGYkUPIhRN zsG@XuSQy2$1IYp|Un$tpffCJZFuYC{fyFH|iJ^~|@%f2Viw-)B9AUF<Z};4L;MgZI zJW<KVx!ut+PDP0LeK5y;ijMq`-h-`=srP9@UMvraKtsYfpIz%;nH<)}?_VaOHy(<d zWm-kd9{1cZfM)ci2Dg&1HA}ELf7Es$OsRQR@&7_?z<;nd>BvadD0DR14Ku@Gp*xK) zIkbG4KaJ^K&~`ADZhS7I52tOV(0L^Sg^C@M@rWxT-jI~520>DVCxl|-hSViVRJZ%1 z!Vp}oOTNMuDF)M0l(X(U!1)qkN)SseY{wu14tQ~W9vhrjSA`{rKPMmQR}1~WT;kC# zkd0*k0qN&GnqBqQX=}`?0<K_$Hr1JtE{2ji1uA&8XC)yHNZ2-H*UZi!Wqg>5ItiK| zjrx!eTlXxNML3FhiC3o1+x93~8MIoIkLhd8YMGtC9(?$t_y0F>F-qRJVL!9N`?IOT zDO~+)eeC=l>r*aAFc3-#@CBd$4vr7=J<^aH=Q-5gqM^#sleVzewZ@j;E5;GPSDZty zurk!kj=T*TY9wt<fwj11*V?2^7D~wvF=O1pkhsxK3U>SD&9ZSIU-Z1|w);@?NbCA? zW8_lCoUKRQ>p8METiU-MqKKK0RWTl_L@0eFHB%#WhFiUSMq4ce$lLji;bOD(Cazsu z>`B<?qT>!#GMpz`vt=fA@oHZl#I43lpAq*3R)W`dcKP3FOUX8>M_1m`XHZIO;(ul> zNs|j6jMAtB5*;UlxCy%}EIPo#V^=tHnSErC;JD0@MIuBE9WBcz^0ZfGC)zt+Q|}*0 zQU<ZbBpBMT6M#Kt@3<Qi8qmi*%?2A{9Pesrn_*D%t^%MLo+45|R(t*ilQgFX#t9m# z@y>Vhf}6<Q>n?l_h28E(`OwM}R+&*~|w^R8MMF|0^aUd%U<M@%*~92+VXk7HR% z1KZnvbm;v7X-J(`37gd34Ei0gjsgW`3>CRcmS!{55&)k^5Br}z&V6!Z0>6C2^_bqe zC+M{NYU}BcI%zkDWDO%E9y_+kG7%b@4_}jpV31G!Wpj{jdAZuZ@-+scyN3f^h_^53 z=7C7}TM@7#$|OqFVsknZgUc)-=@>P)_JbX>)|huAX)fvku*uT=h3#~9lm~R5KVb1f zqq{>T2JnfL?70&02zOSkr`SmaMbNu)DqBJCJt1)#iW5W2Q9s5)9#>-Z@6z6^q8#g2 zI^%uRrK|Y)HEK{wDj9%Mvqu4fSTL2vHdteJh2d$WIfMj)Y4r%sLY=5d(h^+F{UVO} zJw;$<I53?fPCzbkSA$3uE}Mmgpj;X~AhXVC1yCQ}BFu7OE!w2wA|ZFb;vzBz%1pen zIu$^mMy!(}wqRJcDA3!1mqjmg2t-+a?p6BsrB-&S62>FC9`IfsQk!sPJW+Pu(KHh} zSW0X=gJ$-f%%MxkS;08O`UuKln|JWA?U~C5SU?B=<RHLltB{%wW==7(l4DcH;{e{! z07T<B+}6Tcufcu(KW+DdI2gg{>cvvnR)B^m_Hdh1g1aya97&vZoqH(6lPJ%5&9WS_ z5==DHQoIU9aQr>J2*r$}cwQbeBJqI4Dm4YK_||eLGfBHW!bQ=*wy9}eTIydqhXg5# zH5BW1oVY-+d;c$@3Ix)07gWMlaX<mohXYu)NK;xKd>PTO`mU-36|Ceak^`7~!kv5A zWA@7To_Ktg8hwwU6Lwcb*mSX2gthevnUSNMAc(~(rmtu!LDEBr9{*|Ylove5Yu>!& zV~_;q7e}J=7m_LJDhaM_km1{dnR_OX8L}^;H4)hE{tN~DZah(eS4x=u9{~JB=3gQ~ z`XbwaI=5p2Dilj`F&tWG!g*30T;@)ZQKIOu%Pod*y;>6&f28gfa9JsqJ<IwQE&l$? zoM)z=*(Le8bmEl29u^W2E{;s_<WdU4-p%FkjHy98Ymoxg3OT;N(R?NG8kIc@$$ph8 z4lK^2c%{=Vcf<a#{P>cs6aa&ihIR(IlDNZTeMm=uSu0jKM|P4>O2(4r;CXJ~OAUSH zUjb2sW%KZKvrzFag(#$2N59dxId(WTq5`og`=MeD;oAY!i1<;pi0NjT)G3{U2K#nd zi*`%?2{S6Ti}2~&*(9ULx*Z}Xc6FmEkBC38%^JkAuT-=pO&FVzcz_G3*oy7s4Q8DT z{6(Xe>}kri(Y68`-YcUdYR&d;vI_X4K}^>-HvBW)hsXVMc>I|eeu8O=C{~6^vGjEA z?W`8fw05lQx4XFXRV$IbFlc$=*f3~P(bhB#B=!PeRHZ|PMV17Oqs4{Qxd~LFCv4#L zGD}fN>{c<cqtww(Zh%FUh<A=?GU%4RH9&sb?qJ@mI75EImd|0DAD?z*;%)%mMr)Mm z0zq)LZhF#aRjR0K4Fm`d#^zc0$0J>h(b)C&Xa860!aG*xQ#K%%1IRVuROijNG!N~I zNX`YiG2B|azMfN?`=B2)-5~#zTgKRqw1M<a!8Wtcw)8he2cYI}F3wcPkilG^6q_f* zA1w`|_O==tMkoXCoIwTcGdT#S@((?z13#RcoHLwl?=+51;j->e%ZpxscER1$F%V_W z_iwhw^vAWO-b=u`cs=06`pv+ek-+>o@|hJiLrY8do6MA3$ygWhY^ep_FbEi*4ue1O zVhJfWH8QtG01%866QD0empCJ1!?1<LZ3G!FIZL^VA?@fY$(OCG2P`ATI<`p9g^BR_ z(K`c%e(bEE6V9R?p%#AcI^SgSL88$T(dxk2Xfic86#!a=@{xS`ugY0BjhZNCx}yT; zqi-Sg*4tbulZ%BTiy~`<YEFLCJ;L6a$;Nw-a7<v=6CeN{7wBHA!3f-A&nOu3uz(Fb znIajpqW8aYo%uV~s!@Kjvv0T+!8LZwiMP$k>*v@Id59NyBl4eIiWRr3Gp379@wPmS zfLdFa8<4<5bnc5jkj|(NZ)AAf%=ED5NKWIe0?F=76JKZ~ok<cF4#(xwlk5)XSK1+7 z3u}PpPw?Ke)C$M)LX#S`hGaUx76;d^{DiL1o}r&Xyi-MDrR7aiC}3JJAH8lVfjH7U zjvam60=c7PTyyP%%|SL64zXrfcHrhP8Fzqa6rZf--qeQACNaCu4Pk7oE+sDK)NOtm zK_;(7^@FoIFKd5Id<EJ%Lr(de{fTtKg$aPRXM;ZJJ|lfz^Q?$$5V>-Qh1tVcdM4HJ z@l$51#VEIbro}B-d^KYO;WiCQ<ABGw+;6KncyB=~xMpdYo*5ODx}kn0RZNKd`$8>J zgkF`#TUGe%HXu)$%|ki{GEVHVxGds%DCqNmbzbFa73nISWg)c_;opw}_M5D#<pN-3 zUp*R~$up$U(RE?a>rl}f^{7qxMaPJp$sUFX8FxU)H92BLi+#!jc|lle#~3=12~{q@ z990=K-1_V{jN}A!Z`qqB95_>+-G*jD5Ceg#cX!C$M6&TCfZ?MVk{DQAELOiZlMsy9 z@+=LTlwL?n@<7UCo^nCzYe_aq%K$nKaf>7=*Cvm)o@1In1CdW1;UwadlAI_6NzptK z2n-K7W3T>I{mI7Z>3ot|_ImDT7`=X*i90mg{a-QcSH`2Q_c2(~QK#iLTGvigH@3xD zhl8Ei(fm63pVr%$uVi*tP<#XWYq-4`#WHnZ?m<lXFKJY9R_!L*>|s_wUHS@hKG+#{ zGk4?lK@kXMV*!?=6f)+7Mb7n>HzSX=JIIS~T}nFB)WyDf7HLZ>@<A=tb16OfD#Y%# zO*<g|#eA~2H=MHoy9lhKKFHV*^x3q+wZ2{2q9vN?sg_B<$U=YC5A7fMV5krLbBg%L zf2zc#cr8(6TLt_yz;ywiJ;)}9kYheOB1nJPKg45wHad!PzvQl>$+3bnUDF0a@kI*n z(_F)v%OD09Rt^~9w3`g0eY8<VcVf*kF}0&tP^EVS?fHi}a6H6!76OyX{_vzL6;3{# zJSF|PYb7@7oMC=9YI&x{4Q>z^(|B?3=I6H@%R|h91n@*wr9c1(nd$T^fDo7^e(OWk z0-e?Yo3ezKmNszyIoWk#EwAo&h|zy94DZH1QJY!F$B9$yr~tDH6x7`8W3xDgSPGum ze-WOfR5e=4+}E&v>`oLj{xf-7w^vvptk9uK>G%kSUt>AS`0DKAAsXW{C#_(AnQZWU zr@!3oFUR*-17;5BRTb_?u_@DYDy2z(nw(RJ?ymaCZUB3@nw7Y~Gt(A|a%%zwv200u zZi?B&)DZ73a7r<*bqDJIsaU}^j!fQgL={s0x?at3X>tLkY#n>K&JWdx3OFVbIx%$` zIK9QR-QLQw^fK+F;H(7xm4cKLw&cSiueGM9O+=o6w(k!hmh^49z#p#@dv;A|z4&{t zhvWnwtECo~&3xO?N25V^{9`t`r7@~9K&xu<FEu;4)iFS`$h!e&(CH6KFaN)B!ITUI z5E(65xCJxKBUEB~D{!cT8eP;mwTze{6SQZ~D}x?XP|B}F$YxOy|0;eN;t}(uuXg3K zBtbxF?dNPqZ;tM#ql1rV2_2<>ddcZ~)}*84JtBQ@K5m1hN`RJ!$e2R92traYuWfKX z<L}#KL=@JZxXxfFay3;{(P_VYhZmBhH;)P+Ko;mWB9K_qv#Ni&eQPaj2^2#U@Me4# zBZ=|UMEr_W(4V`+TLuq#J*y-G#epo`5^F#X*x*Dc8GnPHnFhjffZ5Bw=7E~OS#h8l z6qYn}A#h`nJwtHdXLBAi_?vTo9Pdsu)gsw!T<q~Ebko~w&?)6mMu7o&_x*ijrHE$2 zKS1(B-9Sg>jo;mT!m|0WYIo5Pl);pWZ&I#KuBT77P8O8ZuR@yD^HwZ!a8a|}NEHCR z^W%hgH<HLj&I28CqECe|<<3ys9s&-XHzmWN<Gq<9ECHYH?d%`EgwmU5^bcI|{a5g7 zC_pL_AhuqV1SD{K9C({z1$E)Tdawrb#w|;Gzrs(uN?}$U;};-{QD~^Eo9Qct>(!|a zE8g+Rs35QlKP{lOUoO8c+xyjrkq3Z0U(t%?RWNhYd=%6LJwTj=00r8SYqUaqt*r3m zCj&zZ)Z;Wg-u46=LiKv}oN*kLJGJ0{#S#()(LRa(JD02Fy8jQx);}q<v)-1o%xx-k z`xc(0^)132Q0m1&$f)(+?|Nafkn7AES@YoYn)5d8^>xh#_ERXl-bB&<)NDZ6IAbR| zqP69V0E~hdI%^SVnW<<YCsLRd&9!Bcg6y1vweMt&bB4>UW?9&+(0hA=vL<Xc@_#M9 z8rVlO*KoR%tzX_S>d3s?+Jo;wO(DlgbMXcl%|=v@p^9t%CM5AIL?s2M2~z9w#^2oq zTDz7xS=s2-U*FqT^wx|HfG}PKw0T%sNrJ&2qi%hg&t%)WkG+`p-8@83RWTa8Z4^~X zOw=`-0KB=qS5e_Qd?8E*1_*)FDc(elv*C{KbOE<i!R>?<0VdlNra*%gnTV;dg7E!& zXL5&_66U50=tDJs+p>!IQmRnf!mq66NN|tHeCYBn%T?6(hSfh+fbQhr)UAQelJAo> zY;f+0V*r0V{`VI#<TS(kfVv5{^D=kx*PyWt&C2=8hLl>;_>s^zy)MKn|2=Qr0|i!Z zBBASCMf^n~c=5pz3k6gF7Z&NK9}dnR%lCc^J-b=7K8a*W4DY-!5xkkP9S3Xj>iHvw zk%0a%aAFGF;=tHlz(55ngeF%ozy5M*B2Mq1bGO>{gZ5~ZVr2#i`cKC8r)%kInv^KP z*Yu}n_l%iOW4{EV05HHi@H*NFS}n8m@#xFa&NDsUYY<<)y>-0!+s9@g)<o;`$9<_> zsl51AP}<8evkX4?>3ND>1E1R@miM)~=DP0A5Zhu~la;>&@T*>W`~=ILrt=o5SXEx@ z-5&aqOroy4zVx+^hFn;1mw?KJ9|T`8EM0lHeL*~7Ct`uwmO{DiyDr*D9rhhv>3R&* ze7J!&RT~$29YU|?R1Z=o2m&VPD%i4g>MfQprc*FHeGcKD(TMCFdSNajM6XM+-rNK! z>^7ZffZ>}2bb=FiiL9uHy8!o6dwzUKpWO3_{*xR?LFb~AQ6v){41o=D_TPo5h4Dl+ zo8`dBYa1p#K4MOu5XGX4*hTArJjWDS`zfW2GVrLj_FU4h8zh<3ld7V3$JdHE6LpX= z%37dyifXfAZii)CD4=2Ws$1sTq_&t6MpP0s9Y{|D<QoiaaIDe>A=%jXXr}7*Y?csC z5|c|~jT&P1FRf>Hn~5{^_Z0T8P7m2fhh~Obb6!oGT)ZSFI^2b<#K`BxL~Lx%BD4KN zOa{?_;Gi*V6YwZ(k@b`R8Juv`b!?D6u;P0Q3^PqA=r|@thxS^IX#hh(PZK@@JwJBy znHUuT7(;Z=er;udsg$L$BahxwTM!R{;j{R=a3`iroE$6KXo~!7)pWA+0C~$~3i3^W z8Zba(jpaXh;JtNi+2J~yM4p5ik22eJg>yF9avlVKV87OH)5QC5afNP=!+oXtKNDl> zQQ7DdSO(Aw9VY*7eygY6iwoVdz-=lSFTwfA|BZ&B)O&$x%LqrYODuIS|C@f)cxPi< z(U}->5M?;Y{vnqV!FJi2)@*@9hN==vofRg|a~)dpX8nK?PCUio>i0z6L;SFe94gn& zn?g%KjBG!L7!(nn%f1hZ!+m@Du)T#lp!Lt4YSWaz+nP*I{+n~}ow#SPU=zbIq5KUU zpjOnYRea`ueG8Ys5KJYKV)SODxJV$uIcex(rXTM&30$4*9azac<QCoC-JO_P!AsZH zE%)9=sWkAiKh<-eiXmP~_AK3dn$HZz5^=ul`PsH*X14RnAU>Gu{1o6-s2&d}z;CA) z#iK6+;%H|N)gK?`H<pT~lpTk6lL#>e%-ff*^*Bk`?M02kag`{1Uf?!ycaR}LRi&jV z+`#`ui<q;<NRihtd?rzu?>hp$^Mp(2h{H$C@PT3*3BxTD{mffkkcSc?xG#{cD4oc( z=�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 diff --git a/examples_alone.txt b/examples_alone.txt index 8c32bc9..5364f56 100644 --- a/examples_alone.txt +++ b/examples_alone.txt @@ -1,12 +1,24 @@ -# COMPILATION OF THE EXAMPLES PRESENTS IN cute_little_R_functions.R +################ COMPILATION OF THE EXAMPLES PRESENTS IN cute_little_R_functions.R ################ + +######## fun_param_check() test <- 1:3 ; fun_param_check(data = test, data.name = NULL, print = TRUE, options = NULL, all.options.in.data = FALSE, class = NULL, typeof = NULL, mode = NULL, prop = TRUE, double.as.integer.allowed = FALSE, length = NULL) test <- 1:3 ; fun_param_check(data = test, print = TRUE, class = "numeric", typeof = NULL, double.as.integer.allowed = FALSE) +test <- 1:3 ; fun_param_check(data = test, print = TRUE, class = "vector", mode = "numeric") +test <- matrix(1:3) ; fun_param_check(data = test, print = TRUE, class = "vector", mode = "numeric") + + + +######## fun_object_info() fun_object_info(data = 1:3) - fun_object_info(data.frame(a = 1:2, b = ordered(factor(c("A", "B"))))) +fun_object_info(data.frame(a = 1:2, b = ordered(factor(c("A", "B"))))) fun_object_info(list(a = 1:3, b = ordered(factor(c("A", "B"))))) + + +######## fun_1D_comp() + obs1 = 1:5 ; obs2 = 1:5 ; names(obs1) <- LETTERS[1:5] ; names(obs2) <- LETTERS[1:5] ; fun_1D_comp(obs1, obs2) obs1 = 1:5 ; obs2 = 1:5 ; names(obs1) <- LETTERS[1:5] ; fun_1D_comp(obs1, obs2) obs1 = 1:5 ; obs2 = 3:6 ; names(obs1) <- LETTERS[1:5] ; names(obs2) <- LETTERS[1:4] ; fun_1D_comp(obs1, obs2) @@ -18,45 +30,91 @@ obs1 = 1:5 ; obs2 = 1.1:6.1 ; fun_1D_comp(obs1, obs2) obs1 = as.table(1:5); obs2 = as.table(1:5) ; fun_1D_comp(obs1, obs2) obs1 = as.table(1:5); obs2 = 1:5 ; fun_1D_comp(obs1, obs2) + + +######## fun_2D_comp() + obs1 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = as.data.frame(matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) obs1 = matrix(101:110, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = matrix(1:10, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) obs1 = matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5])) ; obs2 = matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4]))) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) obs1 = t(matrix(1:10, byrow = TRUE, ncol = 5, dimnames = list(letters[1:2], LETTERS[1:5]))) ; obs2 = t(matrix(c(1:5, 101:105, 6:10), byrow = TRUE, ncol = 5, dimnames = list(c("a", "z", "b"), c(LETTERS[1:2], "k", LETTERS[5:4])))) ; obs1 ; obs2 ; fun_2D_comp(obs1, obs2) + + +######## fun_2D_head() + obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_head(obs1, 3) obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_head(obs1, 3, "r") + + +######## fun_2D_tail() + obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_tail(obs1, 3) obs1 = matrix(1:30, ncol = 5, dimnames = list(letters[1:6], LETTERS[1:5])) ; obs1 ; fun_2D_tail(obs1, 3, "r") + + +######## fun_list_comp() + obs1 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; obs2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; fun_list_comp(obs1, obs2) obs1 = list(1:5, LETTERS[1:2]) ; obs2 = list(a = 1:5, b = LETTERS[1:2]) ; fun_list_comp(obs1, obs2) obs1 = list(b = 1:5, c = LETTERS[1:2]) ; obs2 = list(a = 1:5, b = LETTERS[1:2], d = matrix(1:6)) ; fun_list_comp(obs1, obs2) obs1 = list(b = 1:5, c = LETTERS[1:2]) ; obs2 = list(LETTERS[5:9], matrix(1:6), 1:5) ; fun_list_comp(obs1, obs2) + + +######## fun_dataframe_remodeling() + obs <- data.frame(col1 = (1:4)*10, col2 = c("A", "B", "A", "A")) ; obs ; fun_dataframe_remodeling(obs) obs <- data.frame(col1 = (1:4)*10, col2 = 5:8) ; obs ; fun_dataframe_remodeling(obs, quanti.col.name = "quanti", quali.col.name = "quali") obs <- data.frame(col1 = (1:4)*10, col2 = 5:8) ; rownames(obs) <- paste0("row", 1:4) ; obs ; fun_dataframe_remodeling(obs, quanti.col.name = "quanti", quali.col.name = "quali") + + +######## fun_refactorization() + obs <- data.frame(a = LETTERS[1:6], b = paste0(letters[1.6], c(1,1,2,2,3,3)), c = ordered(LETTERS[7:12]), d = 1:6, e = "A")[-c(1:2),] ; sapply(obs, levels) ; fun_refactorization(obs, FALSE) obs <- data.frame(a = LETTERS[1:6], b = paste0(letters[1.6], c(1,1,2,2,3,3)), c = ordered(LETTERS[7:12]), d = 1:6, e = "A")[-c(1:2),] ; sapply(obs, levels) ; fun_refactorization(obs, TRUE) obs <- factor(LETTERS[1:6])[-c(1:2)] ; obs ; fun_refactorization(obs, TRUE) obs <- ordered(LETTERS[1:6])[-c(1:2)] ; obs ; fun_refactorization(obs, TRUE) obs <- factor(LETTERS[1:6], levels = rev(LETTERS[1:6]))[-c(1:2)] ; obs ; fun_refactorization(obs, FALSE) -cat(fun_rounding(data = c(10, 100.001, 333.0001254, 12312.1235), dec.nb = 2, after.lead.zero = FALSE)) -cat(fun_rounding(data = c("10", "100.001", "333.0001254", "12312.1235"), dec.nb = 2, after.lead.zero = FALSE)) + + +######## fun_round() + +cat(fun_round(data = c(10, 100.001, 333.0001254, 12312.1235), dec.nb = 2, after.lead.zero = FALSE), "\n\n") +cat(fun_round(data = c("10", "100.001", "333un_var_trim_display().0001254", "12312.1235"), dec.nb = 2, after.lead.zero = FALSE), "\n\n") +cat(fun_round(data = c("10", "100.001", "333.0001254", "12312.1235"), dec.nb = 2, after.lead.zero = TRUE), "\n\n") + + + +######## fun_90clock_matrix_rot() obs <- matrix(1:10, ncol = 1) ; obs ; fun_90clock_matrix_rot(obs) obs <- matrix(LETTERS[1:10], ncol = 5) ; obs ; fun_90clock_matrix_rot(obs) -mat1 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; dimnames(mat1) <- list(LETTERS[1:4], letters[1:2]) ; fun_hexa_hsv_color_matrix(mat1, mat.hsv.h = FALSE, notch = 1, s = 1, v = 1, forced.color = NULL) + + + +######## fun_num2color_mat() + +mat1 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; dimnames(mat1) <- list(LETTERS[1:4], letters[1:2]) ; fun_num2color_mat(mat1, mat.hsv.h = FALSE, notch = 1, s = 1, v = 1, forced.color = NULL) + + + +######## fun_by_case_matrix_op() mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2), kind.of.operation = "+") mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2), kind.of.operation = "*") mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(LETTERS[1:4], c(NA, NA))) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2), kind.of.operation = "-") mat1 = matrix(c(1,1,1,2,1,5,9,8), ncol = 2, dimnames = list(c("A1", "A2", "A3", "A4"), letters[1:2])) ; mat2 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; mat3 = matrix(c(1,1,1,2,1,5,9,NA), ncol = 2, dimnames = list(LETTERS[1:4], letters[1:2])) ; fun_by_case_matrix_op(mat.list = list(mat1, mat2, mat3), kind.of.operation = "+") + + +######## fun_mat_inv() + mat1 = matrix(c(1,1,1,2,1,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) # use solve() mat1 = matrix(c(0,0,0,0,0,0,0,0,0), ncol = 3) ; fun_mat_inv(mat = mat1) # use the trick mat1 = matrix(c(1,1,1,2,Inf,5,9,8,9), ncol = 3) ; fun_mat_inv(mat = mat1) @@ -65,25 +123,171 @@ mat1 = matrix(c(1,2), ncol = 1) ; fun_mat_inv(mat = mat1) mat1 = matrix(0, ncol = 1) ; fun_mat_inv(mat = mat1) mat1 = matrix(2, ncol = 1) ; fun_mat_inv(mat = mat1) + + +######## fun_mat_fill() + +mat1 = matrix(c(1,NA,NA,NA, 0,2,NA,NA, NA,3,4,NA, 5,6,7,8), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = NA, warning.print = TRUE) # bottomleft example +mat1 = matrix(c(1,1,1,2, 0,2,3,0, NA,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = NA, warning.print = TRUE) # error example +mat1 = matrix(c(1,1,1,2, 0,2,3,0, NA,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warning.print = TRUE) # bottomright example +mat1 = matrix(c(1,1,1,2, "a",2,3,NA, "a","a",0,0, "a","a","a",0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = "a", warning.print = TRUE) # topright example +mat1 = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,NA, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warning.print = TRUE) # topleft example +mat1 = matrix(c(0,0,0,2, 0,0,3,0, 0,3,0,0, 5,0,0,0), ncol = 4) ; mat1 ; fun_mat_fill(mat = mat1, empty.cell.string = 0, warning.print = TRUE) # error example + + + +######## fun_consec_pos_perm() + +fun_consec_pos_perm(data1 = LETTERS[1:5], data2 = NULL, n = 20, seed = 1, count.print = 10, text.print = "", cor.method = "spearman", cor.limit = 0.2) +fun_consec_pos_perm(data1 = 101:110, data2 = 21:30, n = 20, seed = 1, count.print = 10, text.print = "", cor.method = "spearman", cor.limit = 0.2) + + + +######## fun_window_width_resizing() + fun_window_width_resizing(class.nb = 10, inches.per.class.nb = 0.2, ini.window.width = 7, inch.left.space = 1, inch.right.space = 1, boundarie.space = 0.5) + + +######## fun_open_window() + fun_open_window(pdf.disp = FALSE, path.fun = "C:/Users/Gael/Desktop", pdf.name.file = "graph", width.fun = 7, height.fun = 7, paper = "special", no.pdf.overwrite = TRUE, return.output = TRUE) -fun_graph_param_prior_plot(param.reinitial = FALSE, xlog.scale = FALSE, ylog.scale = FALSE, remove.label = TRUE, remove.x.axis = TRUE, remove.y.axis = TRUE, std.x.range = TRUE, std.y.range = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 4.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = FALSE) + + +######## fun_prior_plot() + +fun_prior_plot(param.reinitial = FALSE, xlog.scale = FALSE, ylog.scale = FALSE, remove.label = TRUE, remove.x.axis = TRUE, remove.y.axis = TRUE, std.x.range = TRUE, std.y.range = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 4.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = FALSE) + + + +######## fun_post_plot() + # Example of log axis with log y-axis and unmodified x-axis: -prior.par <- fun_graph_param_prior_plot(param.reinitial = TRUE, xlog.scale = FALSE, ylog.scale = TRUE, remove.label = TRUE, remove.x.axis = FALSE, remove.y.axis = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 0.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = TRUE) ; plot(1:100, log = "y") ; fun_feature_post_plot(y.side = 2, y.log.scale = prior.par$ylog, x.lab = "Values", y.lab = "TEST", y.axis.magnific = 1.25, y.label.magnific = 1.5, y.dist.legend = 0.7, just.label.add = ! prior.par$ann) +prior.par <- fun_prior_plot(param.reinitial = TRUE, xlog.scale = FALSE, ylog.scale = TRUE, remove.label = TRUE, remove.x.axis = FALSE, remove.y.axis = TRUE, down.space = 1, left.space = 1, up.space = 1, right.space = 1, orient = 1, dist.legend = 0.5, tick.length = 0.5, box.type = "n", amplif.label = 1, amplif.axis = 1, display.extend = FALSE, return.par = TRUE) ; plot(1:100, log = "y") ; fun_post_plot(y.side = 2, y.log.scale = prior.par$ylog, x.lab = "Values", y.lab = "TEST", y.axis.magnific = 1.25, y.label.magnific = 1.5, y.dist.legend = 0.7, just.label.add = ! prior.par$ann) # Example of log axis with redrawn x-axis and y-axis: -prior.par <- fun_graph_param_prior_plot(param.reinitial = TRUE) ; plot(1:100) ; fun_feature_post_plot(x.side = 1, x.lab = "Values", y.side = 2, y.lab = "TEST", y.axis.magnific = 1, y.label.magnific = 2, y.dist.legend = 0.6) +prior.par <- fun_prior_plot(param.reinitial = TRUE) ; plot(1:100) ; fun_post_plot(x.side = 1, x.lab = "Values", y.side = 2, y.lab = "TEST", y.axis.magnific = 1, y.label.magnific = 2, y.dist.legend = 0.6) # example with margins in the device region: -windows(5,5) ; par(mai=c(0.5,0.5,0.5,0.5), omi = c(0.25,0.25,1,0.25), xaxs = "i", yaxs = "i") ; plot(0:10) ; a <- fun_feature_post_plot(x.side = 0, y.side = 0) ; x <- c(a$x.mid.left.dev.region, a$x.left.dev.region, a$x.mid.right.dev.region, a$x.right.dev.region, a$x.mid.left.fig.region, a$x.left.fig.region, a$x.mid.right.fig.region, a$x.right.fig.region, a$x.right.plot.region, a$x.left.plot.region, a$x.mid.plot.region) ; y <- c(a$y.mid.bottom.dev.region, a$y.bottom.dev.region, a$y.mid.top.dev.region, a$y.top.dev.region, a$y.mid.bottom.fig.region, a$y.bottom.fig.region, a$y.mid.top.fig.region, a$y.top.fig.region, a$y.top.plot.region, a$y.bottom.plot.region, a$y.mid.plot.region) ; par(xpd = NA) ; points(x = rep(5, length(y)), y = y, pch = 16, col = "red") ; text(x = rep(5, length(y)), y = y, c("y.mid.bottom.dev.region", "y.bottom.dev.region", "y.mid.top.dev.region", "y.top.dev.region", "y.mid.bottom.fig.region", "y.bottom.fig.region", "y.mid.top.fig.region", "y.top.fig.region", "y.top.plot.region", "y.bottom.plot.region", "y.mid.plot.region"), cex = 0.65, col = grey(0.25)) ; points(y = rep(5, length(x)), x = x, pch = 16, col = "blue") ; text(y = rep(5, length(x)), x = x, c("x.mid.left.dev.region", "x.left.dev.region", "x.mid.right.dev.region", "x.right.dev.region", "x.mid.left.fig.region", "x.left.fig.region", "x.mid.right.fig.region", "x.right.fig.region", "x.right.plot.region", "x.left.plot.region", "x.mid.plot.region"), cex = 0.65, srt = 90, col = grey(0.25)) - +windows(5,5) ; par(mai=c(0.5,0.5,0.5,0.5), omi = c(0.25,0.25,1,0.25), xaxs = "i", yaxs = "i") ; plot(0:10) ; a <- fun_post_plot(x.side = 0, y.side = 0) ; x <- c(a$x.mid.left.dev.region, a$x.left.dev.region, a$x.mid.right.dev.region, a$x.right.dev.region, a$x.mid.left.fig.region, a$x.left.fig.region, a$x.mid.right.fig.region, a$x.right.fig.region, a$x.right.plot.region, a$x.left.plot.region, a$x.mid.plot.region) ; y <- c(a$y.mid.bottom.dev.region, a$y.bottom.dev.region, a$y.mid.top.dev.region, a$y.top.dev.region, a$y.mid.bottom.fig.region, a$y.bottom.fig.region, a$y.mid.top.fig.region, a$y.top.fig.region, a$y.top.plot.region, a$y.bottom.plot.region, a$y.mid.plot.region) ; par(xpd = NA) ; points(x = rep(5, length(y)), y = y, pch = 16, col = "red") ; text(x = rep(5, length(y)), y = y, c("y.mid.bottom.dev.region", "y.bottom.dev.region", "y.mid.top.dev.region", "y.top.dev.region", "y.mid.bottom.fig.region", "y.bottom.fig.region", "y.mid.top.fig.region", "y.top.fig.region", "y.top.plot.region", "y.bottom.plot.region", "y.mid.plot.region"), cex = 0.65, col = grey(0.25)) ; points(y = rep(5, length(x)), x = x, pch = 16, col = "blue") ; text(y = rep(5, length(x)), x = x, c("x.mid.left.dev.region", "x.left.dev.region", "x.mid.right.dev.region", "x.right.dev.region", "x.mid.left.fig.region", "x.left.fig.region", "x.mid.right.fig.region", "x.right.fig.region", "x.right.plot.region", "x.left.plot.region", "x.mid.plot.region"), cex = 0.65, srt = 90, col = grey(0.25)) + + + +######## fun_close_specif_window() + windows() ; windows() ; pdf() ; dev.list() ; fun_close_specif_window(kind = c("pdf", "x11"), return.text = TRUE) ; dev.list() -fun_var_trim_display(data = c(1:100, 1:10), displayed.nb = NULL, single.value.display = FALSE, trim.method = "mean.sd", trim.cutoffs = c(0.05, 0.975), interval.scale.disp = TRUE, down.space = 0.75, left.space = 0.75, up.space = 0.3, right.space = 0.25, orient = 1, dist.legend = 0.37, box.type = "l", amplif.label = 1.25, amplif.axis = 1.25, std.x.range = TRUE, std.y.range = TRUE, cex.pt = 0.2, col.box = hsv(0.55, 0.8, 0.8), x.nb.inter.tick = 4, y.nb.inter.tick = 0, tick.length = 0.5, sec.tick.length = 0.3, text.corner = "", amplif.legend = 1, magnific.text.corner = 0.75, trim.return = TRUE) -fun_export_data() -fun_export_data(data = 1:3, output = "results.txt", path = "C:/Users/Gael/Desktop", no.overwrite = TRUE, rownames.kept = FALSE, vector.cat = FALSE, sep = 2) +######## fun_empty_graph() + +fun_empty_graph(text = "NO GRAPH", title = "GRAPH1") + + + +######## fun_gg_palette() + +fun_gg_palette(n = 2) +plot(1, pch = 16, cex = 5, col = fun_gg_palette(n = 2)[2]) # second color of the two color ggplot2 palette + + + +######## fun_gg_scatter() + +obs1 <- data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = names(obs1)[1]), y = list(L1 = names(obs1)[2]), categ = list(L1 = names(obs1)[3]), legend.name = NULL, color = NULL, geom = list(L1 = "geom_point"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 1, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = FALSE, classic = FALSE) +obs1 <- data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = names(obs1)[1]), y = list(L1 = names(obs1)[2]), categ = NULL, legend.name = NULL, geom = list(L1 = "geom_point"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = "test_x", ylab = "test_y", color = list(L1 = 5), pt.size = 2, li.size = 0.5, alpha = 1, title = "GRAPH1", text.size = 15, return = TRUE, classic = FALSE) +obs1 <- data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")) ; obs1 ; fun_gg_scatter(data1 = list(L1 = obs1), x = list(L1 = names(obs1)[1]), y = list(L1 = names(obs1)[2]), categ = NULL, legend.name = NULL, geom = list(L1 = "geom_path"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = "test_x", ylab = "test_y", color = list(L1 = 5), pt.size = 2, li.size = 0.5, alpha = 1, title = "GRAPH1", text.size = 15, return = TRUE, classic = FALSE) +data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1"))) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2]), categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3]), legend.name = list(L1 = "GROUP1", L2 = "GROUP2"), color = list(L1 = fun_gg_palette(4)[1:2], L2 = fun_gg_palette(4)[3:4]), geom = list(L1 = "geom_point", L2 = "geom_point"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 2, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = FALSE, path.lib = NULL) +data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A2", "A2", "A3", "A3", "B1", "B1"))) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = names(data1$L3)[2]), categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3], L3 = names(data1$L3)[3]), legend.name = NULL, color = list(L1 = fun_gg_palette(7)[1:2], L2 = fun_gg_palette(7)[3:4], L3 = fun_gg_palette(7)[5:7]), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_path"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 4, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = FALSE, path.lib = NULL) +data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A2", "A2", "A3", "A3", "B1", "B1"))) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = names(data1$L3)[2]), categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3], NULL), legend.name = NULL, color = list(L1 = fun_gg_palette(7)[1:2], L2 = fun_gg_palette(7)[3:4], L3 = NULL), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_path"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 4, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = FALSE, path.lib = NULL) +data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A4", "A5", "A6", "A7", "B4", "B5"))) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = NULL), categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3], L3 = names(data1$L3)[3]), legend.name = NULL, color = list(L1 = "red", L2 = "blue", L3 = "green"), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_vline"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 4, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = FALSE, path.lib = NULL) +data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A4", "A5", "A6", "A7", "B4", "B5"))) ; data1$L1$a[3] <- NA ; data1$L1$group[5] <- NA ; data1$L3$group3[4] <- NA ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = NULL), categ = list(L1 = names(data1$L1)[3], L2 = names(data1$L2)[3], L3 = names(data1$L3)[3]), legend.name = NULL, color = list(L1 = "red", L2 = "blue", L3 = "green"), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_vline"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 4, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = FALSE, path.lib = NULL) +data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A", "A", "A", "B", "B", "B")), L2 = data.frame(a = (1:6)*2, b = ((1:6)^2)*2, group = c("A1", "A1", "A1", "B1", "B1", "B1")), L3 = data.frame(a = (1:6)*3, b = ((1:6)^2)*3, group3 = c("A2", "A2", "A3", "A3", "B1", "B1"))) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1], L2 = names(data1$L2)[1], L3 = names(data1$L3)[1]), y = list(L1 = names(data1$L1)[2], L2 = names(data1$L2)[2], L3 = names(data1$L3)[2]), categ = NULL, legend.name = list(L1 = "A", L2 = "B", L3 = "C"), color = list(L1 = "black", L2 = 2, L3 = "purple"), geom = list(L1 = "geom_point", L2 = "geom_point", L3 = "geom_point"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 1, li.size = 0.5, alpha = 1, title = "GRAPH1", text.size = 20, return = TRUE, classic = TRUE, path.lib = NULL) +data1 <- list(L1 = data.frame(a = 1:6, b = (1:6)^2, group = c("A1", "A2", "A3", "B1", "B2", "B3"))) ; data1$L1$a[2:3] <- NA ; x = list(L1 = names(data1$L1)[1]) ; y = list(L1 = NULL) ; categ = list(L1 = names(data1$L1)[3]) ; data1 ; fun_gg_scatter(data1 = data1, x = list(L1 = names(data1$L1)[1]), y = list(L1 = NULL), categ = list(L1 = names(data1$L1)[3]), legend.name = list(L1 = "VALUE"), color = list(L1 = "red"), geom = list(L1 = "geom_hline"), xlim = NULL, ylim = NULL, extra.margin = 0.05, xlab = NULL, ylab = NULL, pt.size = 1, li.size = 0.5, alpha = 0.5, title = "GRAPH1", text.size = 12, return = TRUE, classic = TRUE, path.lib = NULL) + + + +######## fun_gg_bar_mean() + +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", categ.color = "white") # separate bars, modification of bar color 1 (a single value) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", categ.color = c("red", "blue")) # separate bars, modification of bar color 2 (one value par class of categ2) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), bar.color = rep(c("brown", "orange"), time = 10)) ; obs1 ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", categ.color = obs1$bar.color) # separate bars, modification of bar color 3 (one value per line of obs1, with respect of the correspondence between categ2 and bar.color columns) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = "same") # separate bars, modification of dot color 1 (same dot color as the corresponding bar) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = "green") # separate bars, modification of dot color 2 (single color for all the dots) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = c("green", "brown")) # separate bars, modification of dot color 3 (one value par class of categ2) +obs1 <- data.frame(a = 1:10, group1 = rep(c("G", "H"), times = 5)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = hsv(h = (1:nrow(obs1)) / nrow(obs1))) # separate bars, modification of dot color 4 (any color for each dot) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2")) # grouped bars, default arguments +obs1 <- data.frame(a = 1:24, group1 = rep(c("G", "H"), times = 12), group2 = rep(c("A", "B", "C", "D"), each = 6)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), return = TRUE) # more grouped bars +obs1 <- data.frame(a = log10((1:20) * 100), group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), ylog = TRUE) # grouped bars, log scale. Beware, y column must be log, otherwise incoherent scale +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL) # grouped bars, no dots +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.color = "white") # grouped bars, modification of bar color 1 (a single value) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.color = c("red", "blue")) # grouped bars, modification of bar color 2 (one value par class of categ2) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10), bar.color = rep(c("brown", "orange"), each = 10)) ; obs1 ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), categ.color = obs1$bar.color) # grouped bars, modification of bar color 3 (one value per line of obs1, with respect of the correspondence between categ2 and bar.color columns) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "same") # grouped bars, modification of dot color 1 (same dot color as the corresponding bar) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "green") # grouped bars, modification of dot color 2 (single color for all the dots) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = c("green", "brown")) # grouped bars, modification of dot color 3 (one value par class of categ2) +obs1 <- data.frame(a = 1:10, group1 = rep(c("G", "H"), times = 5), group2 = rep(c("A", "B"), each = 5)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = hsv(h = (1:nrow(obs1)) / nrow(obs1))) # grouped bars, modification of dot color 4 (any color for each dot) +obs1 <- data.frame(a = 1:20, group1 = rep(c("G", "H"), times = 10), group2 = rep(c("A", "B"), each = 10)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), class.order = list(NULL, c("B", "A")), legend.name = "", categ.color = c("red", "blue"), dot.color = "grey", error.bar = "SD", bar.width = 0.25, error.bar.width = 0.8, jitter = 1, ylim = c(10, 30), y.include.zero = FALSE, top.extra.margin = 0.5, bottom.extra.margin = 1, xlab = "GROUP", ylab = "MEAN", pt.size = 4, pt.border.size = 0, alpha = 1, show.stat = "above", stat.size = 4, title = "GRAPH1", text.size = 20, return = TRUE, break.nb = 10, classic = TRUE, grid = TRUE) # grouped bars, all the argumentsobs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = NULL, bar.width = 0.25) # width example. With bar.width = 0.25, three times more space between single bars than the bar width +obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = "group1", dot.color = NULL, bar.width = 1) # width example. With bar.width = 1, no space between single bars +obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, bar.width = 0.25) # width example. With bar.width = 0.25, three times more space between sets of grouped bars than the set width +obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, bar.width = 1) # width example. With bar.width = 0, no space between sets of grouped bars +obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, error.bar = "SD", error.bar.width = 1) # width example. With error.bar.width = 1, whiskers have the width of the corresponding bar +obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = NULL, error.bar = "SD", error.bar.width = 0) # width example. No whiskers +obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "grey", pt.size = 3, alpha = 1, jitter = 1) # width example. With jitter = 1, dispersion around the corresponding bar width +obs1 <- data.frame(a = 1:1000, group1 = rep(c("G", "H"), times = 500), group2 = rep(LETTERS[1:5], each = 200)) ; fun_gg_bar_mean(data1 = obs1, y = "a", categ = c("group1", "group2"), dot.color = "grey", pt.size = 3, alpha = 1, jitter = 0) # width example. No dispersion + + + +######## fun_gg_heatmap() + +fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), title = "GRAPH 1") +fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), return = TRUE) +fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), legend.name = "VALUE", title = "GRAPH 1", text.size = 5, data2 = matrix(rep(c(1,0,0,0), 4), ncol = 4), invert2 = FALSE, return = TRUE) +fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), data2 = matrix(rep(c(1,0,0,0), 5), ncol = 5)) +fun_gg_heatmap(data1 = matrix(1:16, ncol = 4), data2 = reshape2::melt(matrix(rep(c(1,0,0,0), 4), ncol = 4))) +fun_gg_heatmap(data1 = reshape2::melt(matrix(1:16, ncol = 4)), data2 = reshape2::melt(matrix(rep(c(1,0,0,0), 4), ncol = 4))) + + + +######## fun_gg_empty_graph() + +fun_gg_empty_graph(text = "NO GRAPH", title = "GRAPH1") + + + +######## fun_var_trim_display() + +fun_var_trim_display(data = c(1:100, 1:10), displayed.nb = NULL, single.value.display = FALSE, trim.method = "mean.sd", trim.cutoffs = c(0.05, 0.975), interval.scale.disp = TRUE, down.space = 0.75, left.space = 0.75, up.space = 0.3, right.space = 0.25, orient = 1, dist.legend = 0.37, box.type = "l", amplif.label = 1.25, amplif.axis = 1.25, std.x.range = TRUE, std.y.range = TRUE, cex.pt = 0.2, col.box = hsv(0.55, 0.8, 0.8), x.nb.inter.tick = 4, y.nb.inter.tick = 0, tick.length = 0.5, sec.tick.length = 0.3, corner.text = "", amplif.legend = 1, magnific.corner.text = 0.75, trim.return = TRUE) + + + +######## fun_segmentation() + +set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = 20, x.step.factor = 10, y.range.split = 23, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], xy.cross.kind = "|", graph.check = TRUE, graph.path = "C:/Users/Gael/Desktop/", path.lib = NULL) +set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = NULL, x.step.factor = 10, y.range.split = 23, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], xy.cross.kind = "|", graph.check = TRUE, graph.path = "C:/Users/Gael/Desktop/", path.lib = NULL) +set.seed(1) ; data1 = data.frame(x = rnorm(500), y = rnorm(500)) ; data2 = data.frame(x = rnorm(500, 0, 2), y = rnorm(500, 0, 2)) ; set.seed(NULL) ; fun_segmentation(data1 = data1, x1 = names(data1)[1], y1 = names(data1)[2], x.range.split = 20, x.step.factor = 10, y.range.split = NULL, y.step.factor = 10, error = 0, data2 = data2, x2 = names(data2)[1], y2 = names(data2)[2], xy.cross.kind = "&", graph.check = TRUE, graph.path = "C:/Users/Gael/Desktop/", path.lib = NULL) + + + +######## fun_pack_import() + +fun_pack_import(req.package = "nopackage") +fun_pack_import(req.package = "ggplot2") +fun_pack_import(req.package = "ggplot2", path.lib = "blablabla") + + + +######## fun_python_pack_import() + +fun_python_pack_import(req.package = "nopackage") +fun_python_pack_import(req.package = "serpentine") +fun_python_pack_import(req.package = "serpentine", path.lib = "blablabla") + + + +######## fun_export_data() + +fun_export_data() +fun_export_data(data = 1:3, output = "results.txt", path = "C:/Users/Gael/Desktop", no.overwrite = TRUE, rownames.kept = FALSE, vector.cat = FALSE, noquote = FALSE, sep = 2) -- GitLab