Commit 808d0b42 authored by Amine  GHOZLANE's avatar Amine GHOZLANE

Update packages to R3.6.1

parent 84d7c6c7
......@@ -2,64 +2,60 @@
options(bitmapType='cairo')
if (!require("Rcpp")){
install.packages("Rcpp", repos="http://cran.univ-paris1.fr/")
install.packages("Rcpp", repos="https://cran.univ-paris1.fr/")
}
if(!require(shiny)){
install.packages("shiny", repos="http://cran.univ-paris1.fr/")
install.packages("shiny", repos="https://cran.univ-paris1.fr/")
library(shiny)
}
if(!require(shinydashboard)){
devtools::install_github('aghozlane/shinydashboard')
library(shinydashboard)
}
if(!require(rjson)){
install.packages('rjson', repos="http://cran.univ-paris1.fr/")
install.packages('rjson', repos="https://cran.univ-paris1.fr/")
library(rjson)
}
if(!require(ape)){
install.packages('ape', repos="http://cran.univ-paris1.fr/")
install.packages('ape', repos="https://cran.univ-paris1.fr/")
library(ape)
}
if(!require(GUniFrac)){
install.packages('GUniFrac', repos="http://cran.univ-paris1.fr/")
install.packages('GUniFrac', repos="https://cran.univ-paris1.fr/")
library(GUniFrac)
}
if(!require(devtools)){
install.packages('devtools', repos="http://cran.univ-paris1.fr/")
library(devtools)
}
if (!require(psych)) {
install.packages('psych', repos="http://cran.univ-paris1.fr/")
install.packages('psych', repos="https://cran.univ-paris1.fr/")
library(psych)
}
if (!require(ggplot2)) {
install.packages('ggplot2', repos="http://cran.univ-paris1.fr/")
install.packages('ggplot2', repos="https://cran.univ-paris1.fr/")
library(ggplot2)
}
if (!require(vegan)) {
install.packages('vegan', repos="http://cran.univ-paris1.fr/")
install.packages('vegan', repos="https://cran.univ-paris1.fr/")
library(vegan)
}
if (!require(dendextend)) {
install.packages('dendextend', repos="http://cran.univ-paris1.fr/")
install.packages('dendextend', repos="https://cran.univ-paris1.fr/")
library(dendextend)
}
if (!require(circlize)) {
install.packages('circlize', repos="http://cran.univ-paris1.fr/")
install.packages('circlize', repos="https://cran.univ-paris1.fr/")
library(circlize)
}
if (!require(devtools)) {
install.packages('devtools', repos="http://cran.univ-paris1.fr/")
install.packages('devtools', repos="https://cran.univ-paris1.fr/")
library(devtools)
}
if(!require(treeWeightD3)){
......@@ -72,20 +68,23 @@ if(!require(treeWeightD3)){
# library(BiocInstaller)
# }
#torename
if (!require(d3heatmap)) {
devtools::install_github('aghozlane/d3heatmap')
#devtools::install_github('aghozlane/d3heatmap')
devtools::install_github("rstudio/d3heatmap")
library(d3heatmap)
}
# Let us use biomformat instead of biom
if (!require(biomformat)){
devtools::install_github("aghozlane/biomformat")
library(biomformat)
#torename
if (!require(biomformatshaman)){
devtools::install_github("aghozlane/biomformatshaman")
library(biomformatshaman)
}
if (!require(scatterD3)) {
#devtools::install_github('aghozlane/scatterD3')
install.packages("scatterD3")
install.packages("scatterD3", repos="https://cran.univ-paris1.fr/")
library(scatterD3)
}
......@@ -94,19 +93,26 @@ if (!require(rNVD3)) {
library(rNVD3)
}
if(!require(BiocManager)){
install.packages("BiocManager")
}
if (!require(genefilter)) {
source("https://bioconductor.org/biocLite.R")
biocLite("genefilter")
BiocManager::install("genefilter", ask=FALSE)
library(genefilter)
}
if(!require("SummarizedExperiment")){
BiocManager::install("SummarizedExperiment", ask=FALSE)
library(SummarizedExperiment)
}
if (!require(googleVis)) {
install.packages('googleVis', repos="http://cran.univ-paris1.fr/")
install.packages('googleVis', repos="https://cran.univ-paris1.fr/")
suppressPackageStartupMessages(library(googleVis))
}
if (!require(shinyjs)) {
install.packages('shinyjs', repos="http://cran.univ-paris1.fr/")
install.packages('shinyjs', repos="https://cran.univ-paris1.fr/")
library(shinyjs)
}
......@@ -116,42 +122,42 @@ if(!require(d3vennR)){
}
if (!require(DT)) {
install.packages('DT', repos="http://cran.univ-paris1.fr/")
install.packages('DT', repos="https://cran.univ-paris1.fr/")
library(DT)
}
if (!require(RColorBrewer)) {
install.packages('RColorBrewer', repos="http://cran.univ-paris1.fr/")
install.packages('RColorBrewer', repos="https://cran.univ-paris1.fr/")
library(RColorBrewer)
}
if (!require(gplots)) {
install.packages('gplots', repos="http://cran.univ-paris1.fr/")
install.packages('gplots', repos="https://cran.univ-paris1.fr/")
library(gplots)
}
if (!require(DESeq2)) {
if (!require(DESeq2shaman)) {
devtools::install_github("aghozlane/DESeq2shaman")
library(DESeq2)
library(DESeq2shaman)
}
if (!require(ade4)) {
install.packages('ade4', repos="http://cran.univ-paris1.fr/")
install.packages('ade4', repos="https://cran.univ-paris1.fr/")
library(ade4)
}
if (!require(scales)) {
install.packages('scales', repos="http://cran.univ-paris1.fr/")
install.packages('scales', repos="https://cran.univ-paris1.fr/")
library(scales)
}
if (!require(phytools)) {
install.packages('phytools', repos="http://cran.univ-paris1.fr/")
install.packages('phytools', repos="https://cran.univ-paris1.fr/")
library(phytools)
}
if(!require(philentropy)){
install.packages("philentropy", repos="http://cran.univ-paris1.fr/")
install.packages("philentropy", repos="https://cran.univ-paris1.fr/")
library(philentropy)
}
......@@ -166,56 +172,57 @@ if (!require("shinytoastr")){
}
if (!require("shinyWidgets")){
devtools::install_github("aghozlane/shinyWidgets")
install.packages("shinyWidgets")
#devtools::install_github("aghozlane/shinyWidgets")
library(shinyWidgets)
}
if (!require("sendmailR")){
install.packages("sendmailR", repos="http://cran.univ-paris1.fr/")
install.packages("sendmailR", repos="https://cran.univ-paris1.fr/")
library(sendmailR)
}
if (!require("shinyBS")){
install.packages("shinyBS", repos="http://cran.univ-paris1.fr/")
install.packages("shinyBS", repos="https://cran.univ-paris1.fr/")
library(shinyBS)
}
library(tools)
if (!require("flexdashboard")){
install.packages("flexdashboard", repos="http://cran.univ-paris1.fr/")
install.packages("flexdashboard", repos="https://cran.univ-paris1.fr/")
library(flexdashboard)
}
if (!require("backports")){
install.packages("backports", repos="http://cran.univ-paris1.fr/")
install.packages("backports", repos="https://cran.univ-paris1.fr/")
library(backports)
}
if (!require("readr")){
install.packages("readr", repos="http://cran.univ-paris1.fr/")
install.packages("readr", repos="https://cran.univ-paris1.fr/")
library(readr)
}
if (!require("jsonlite")){
install.packages("jsonlite", repos="http://cran.univ-paris1.fr/")
install.packages("jsonlite", repos="https://cran.univ-paris1.fr/")
library(jsonlite)
}
if (!require("shinyFiles")){
install.packages("shinyFiles", repos="http://cran.univ-paris1.fr/")
install.packages("shinyFiles", repos="https://cran.univ-paris1.fr/")
library(shinyFiles)
}
if (!require("htmltools")){
install.packages("htmltools", repos="http://cran.univ-paris1.fr/")
install.packages("htmltools", repos="https://cran.univ-paris1.fr/")
library(htmltools)
}
# if (!require("V8")){
# install.packages("V8", repos="http://cran.univ-paris1.fr/")
# install.packages("V8", repos="https://cran.univ-paris1.fr/")
# library(htmltools)
# }
......@@ -225,27 +232,27 @@ if (!require("htmltools")){
# }
if (!require("rAmCharts")){
install.packages("rAmCharts")
install.packages("rAmCharts", repos="https://cran.univ-paris1.fr/")
library(rAmCharts)
}
if(!require("colourpicker")){
install.packages("colourpicker")
install.packages("colourpicker", repos="https://cran.univ-paris1.fr/")
library(colourpicker)
}
if(!require("data.table")){
install.packages("data.table")
install.packages("data.table", repos="https://cran.univ-paris1.fr/")
library(data.table)
}
if(!require("UpSetR")){
install.packages("UpSetR")
install.packages("UpSetR", repos="https://cran.univ-paris1.fr/")
library(UpSetR)
}
if(!require("ggrepel")){
install.packages("ggrepel")
install.packages("ggrepel", repos="https://cran.univ-paris1.fr/")
library(ggrepel)
}
......@@ -255,16 +262,11 @@ if(!require("ggrepel")){
# }
if(!require("igraph")){
install.packages("igraph")
install.packages("igraph", repos="https://cran.univ-paris1.fr/")
library(igraph)
}
if(!require("visNetwork")){
install.packages("visNetwork")
install.packages("visNetwork", repos="https://cran.univ-paris1.fr/")
library(visNetwork)
}
if(!require("SummarizedExperiment")){
BiocManager::install("SummarizedExperiment")
library(SummarizedExperiment)
}
\ No newline at end of file
......@@ -104,7 +104,7 @@ Project_box_result <- function(masque_key,curdir){
conditionalPanel(condition="input.masque_db=='rdp'",numericInput("rdp_thres",h6(strong("Threshold:")),0.5,step=0.01,min=0.01,max=1)),
actionButton("LoadResMasque", "Upload the results",icon=icon('upload')),
tags$style(type='text/css', "#LoadResMasque { width:100%; }"),
receiveSweetAlert(messageId = "LoadResMasque")
#receiveSweetAlert(messageId = "LoadResMasque")
),
#shinydashboard::box(title="Upload the results",width = NULL, background = "light-blue",
#selectInput("masque_database","Select the database",choices=c("Silva" = "silva","Greengenes" = "greengenes", "MARDE"="merde")),
......@@ -112,7 +112,6 @@ Project_box_result <- function(masque_key,curdir){
#actionButton("RunResMasque",label = "Upload the results",icon=icon('upload')),
#tags$style(type='text/css', "#RunResMasque { width:100%; margin-top: 15px;}")
#),
#receiveSweetAlert(messageId = "WTF2"),
box(id="box-zip",title="Download .zip file",width = NULL, status = "success",
downloadButton('Download_masque_zip', 'Download the results'),
tags$style(type='text/css', "#Download_masque_zip { width:100%;}")
......
......@@ -3,9 +3,7 @@ shinyServer(function(input, output,session) {
hide(id = "loading-content", anim = TRUE, animType = "fade",time=1.5)
hide(id = "loading-content-bar", anim = TRUE, animType = "fade",time=1.5)
### ###
##
#### LOAD FILES ####
##
### ###
......@@ -43,13 +41,15 @@ shinyServer(function(input, output,session) {
if (!is.null(values$count_table_masque) && file.exists(values$count_table_masque)){
tryCatch(read.csv(values$count_table_masque,sep="\t",header=TRUE,check.names=FALSE)->data,
error=function(e) sendSweetAlert(messageId="ErrorCounts",
#messageId="ErrorCounts",
error=function(e) sendSweetAlert(session,
title = "Oops",
text=paste("The count file can not be read in SHAMAN.\n \n",e),type ="error"))
}
else{
tryCatch(read.csv(inFile$datapath,sep=input$sepcount,header=TRUE,check.names=FALSE)->data,
error=function(e) sendSweetAlert(messageId="ErrorCounts",
#messageId="ErrorCounts",
error=function(e) sendSweetAlert(session,
title = "Oops",
text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
}
......@@ -77,7 +77,8 @@ shinyServer(function(input, output,session) {
if(input$TypeTaxo=="Table" && !is.null(inFile))
{
tryCatch(read.csv(inFile$datapath,sep=input$septaxo,header=TRUE)->data,
error=function(e) sendSweetAlert(messageId="ErrorTaxo",
#messageId="ErrorTaxo",
error=function(e) sendSweetAlert(session,
title = "Oops",
text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
......@@ -98,13 +99,15 @@ shinyServer(function(input, output,session) {
{
if (!is.null(values$rdp_annot_masque) && file.exists(values$rdp_annot_masque)){
tryCatch(read_rdp(values$rdp_annot_masque,values$rdp_thres_masque)->data,
error=function(e) sendSweetAlert(messageId="ErrorRDP",
#messageId="ErrorRDP",
error=function(e) sendSweetAlert(session,
title = "Oops",
text=paste("The annotation file can not be read in SHAMAN.\n \n",e),type ="error"))
}
else{
tryCatch(read_rdp(inFile$datapath,input$RDP_th)->data,
error=function(e) sendSweetAlert(messageId="ErrorRDP",
#messageId="ErrorRDP",
error=function(e) sendSweetAlert(session,
title = "Oops",
text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
}
......@@ -128,14 +131,16 @@ shinyServer(function(input, output,session) {
if (!is.null(inFile) && is.null(values$biom_masque)){
tryCatch(read_biom(inFile$datapath)->data,
error=function(e) sendSweetAlert(messageId="ErrorBiom1",
#messageId="ErrorBiom1",
error=function(e) sendSweetAlert(session,
title = "Oops",
text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
}
if (!is.null(values$biom_masque) && file.exists(values$biom_masque)){
tryCatch(read_biom(values$biom_masque)->data,
error=function(e) sendSweetAlert(messageId="ErrorBiom2",
#messageId="ErrorBiom2",
error=function(e) sendSweetAlert(session,
title = "Oops",
text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
}
......@@ -317,7 +322,8 @@ shinyServer(function(input, output,session) {
if (is.null(inFile)) return(NULL)
tryCatch(read.csv(inFile$datapath,sep=input$sepsize,header=TRUE)->data,
error=function(e) sendSweetAlert(messageId="ErrorSizeFactor",
#messageId="ErrorSizeFactor",
error=function(e) sendSweetAlert(session,
title = "Oops",
text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
return(as.data.frame(data))
......@@ -908,7 +914,8 @@ shinyServer(function(input, output,session) {
## Create JSON file
withProgress(message = 'Creating JSON file...',{CreateJSON(input,values)})
if(file.exists(values$json_name)) values$num = 1
sendSweetAlert(messageId="SuccessMasque",
#messageId="SuccessMasque",
sendSweetAlert(session,
title = "Success",
text = paste("Your data have been submitted. You will receive an e-mail once the computation over. <br /> This can take few hours.
<br />
......@@ -926,7 +933,8 @@ shinyServer(function(input, output,session) {
observeEvent(input$submit,{
tryCatch(MasqueSubmit(),
error=function(e) sendSweetAlert(messageId="ErrorMasque",
#messageId="ErrorMasque",
error=function(e) sendSweetAlert(session,
title = "Oops",
text=paste("Something wrong when submitting.\n \n",e),type ="error"))
......@@ -1305,7 +1313,7 @@ shinyServer(function(input, output,session) {
}
}
}
#CHANGEMENT DE COULEUR BORDEL
#CHANGEMENT DE COULEUR
else if(!is.null(Error) && isolate(values$num)>=1) values$error_progress = TRUE
})
......@@ -1407,16 +1415,17 @@ shinyServer(function(input, output,session) {
#PS = Project_status(values$masque_key,values$curdir)
values$biom_masque = paste(values$curdir,"www","masque","done",paste("file",values$masque_key,sep=""),paste("shaman_silva.biom",sep=""),sep= .Platform$file.sep)
values$tree_masque = paste(values$curdir,"www","masque","done",paste("file",values$masque_key,sep=""),paste("shaman_silva_tree.nhx",sep=""),sep= .Platform$file.sep)
sendSweetAlert(messageId="DemoDataset", title = "Success", text = paste("Data of", DemoDataset[[1]][2], "were successfully loaded. You can go to statistical analysis section."), type = "success", html=TRUE)
removeCssClass(class = 'pwdRED', selector = '#password_home')
addCssClass(class = 'pwdGREEN', selector = '#password_home')
hideElement("masque-form",anim=TRUE)
hideElement("masque-infobox",anim=TRUE)
hideElement("boxsum",anim=TRUE)
showElement("reload-project",anim=TRUE)
hideElement("project_over",anim=TRUE)
hideElement("pass",anim=TRUE)
#showElement("MasqueToShaman",anim=TRUE)
#sendSweetAlert(messageId="DemoDataset", title = "Success", text = paste("Data of", DemoDataset[[1]][2], "were successfully loaded. You can go to statistical analysis section."), type = "success", html=TRUE)
sendSweetAlert(session, title = "Success", text = paste("Data of", DemoDataset[[1]][2], "were successfully loaded. You can go to statistical analysis section."), type = "success", html=TRUE)
removeCssClass(class = 'pwdRED', selector = '#password_home')
addCssClass(class = 'pwdGREEN', selector = '#password_home')
hideElement("masque-form",anim=TRUE)
hideElement("masque-infobox",anim=TRUE)
hideElement("boxsum",anim=TRUE)
showElement("reload-project",anim=TRUE)
hideElement("project_over",anim=TRUE)
hideElement("pass",anim=TRUE)
#showElement("MasqueToShaman",anim=TRUE)
}
else{
values$tree_masque = NULL
......@@ -1851,7 +1860,8 @@ shinyServer(function(input, output,session) {
values$biom_masque = paste(values$curdir,"www","masque","done",paste("file",values$masque_key,sep=""),paste("shaman_",input$masque_db,".biom",sep=""),sep= .Platform$file.sep)
values$tree_masque = paste(values$curdir,"www","masque","done",paste("file",values$masque_key,sep=""),paste("shaman_",input$masque_db,"_tree.nhx",sep=""),sep= .Platform$file.sep)
}
sendSweetAlert(messageId="LoadResMasque", title = "Success", text = "Processed data were successfully loaded. You can go to statistical analysis part to analyze your data with SHAMAN.", type = "success", html=TRUE)
#sendSweetAlert(messageId="LoadResMasque", title = "Success", text = "Processed data were successfully loaded. You can go to statistical analysis part to analyze your data with SHAMAN.", type = "success", html=TRUE)
sendSweetAlert(session, title = "Success", text = "Processed data were successfully loaded. You can go to statistical analysis part to analyze your data with SHAMAN.", type = "success", html=TRUE)
})
......@@ -1875,7 +1885,8 @@ shinyServer(function(input, output,session) {
values$biom_masque = paste(values$curdir,"www","masque","done",paste("file",values$masque_key,sep=""),paste("shaman_",input$masque_db_home,".biom",sep=""),sep= .Platform$file.sep)
values$tree_masque = paste(values$curdir,"www","masque","done",paste("file",values$masque_key,sep=""),paste("shaman_",input$masque_db_home,"_tree.nhx",sep=""),sep= .Platform$file.sep)
}
sendSweetAlert(messageId="LoadResMasque_home", title = "Success", text = "Processed data were successfully loaded. You can go to statistical analysis part to analyze your data with SHAMAN.", type = "success", html=TRUE)
#sendSweetAlert(messageId="LoadResMasque_home", title = "Success", text = "Processed data were successfully loaded. You can go to statistical analysis part to analyze your data with SHAMAN.", type = "success", html=TRUE)
sendSweetAlert(session, title = "Success", text = "Processed data were successfully loaded. You can go to statistical analysis part to analyze your data with SHAMAN.", type = "success", html=TRUE)
})
## Export results in .zip
......@@ -2683,7 +2694,9 @@ shinyServer(function(input, output,session) {
## Run DESeq2 via RunDESeq button
observeEvent(input$RunDESeq,{
create_forked_task(ResDiffAnal())
if(.Platform$OS.type =="windows")
ResDiffAnal()
else create_forked_task(ResDiffAnal())
})
......
......@@ -63,11 +63,11 @@ function(request) {
p("Pierre Lechat", "(Coding, testing, feature suggestions)"),
h3("Acknowledgements"),
p("Thanks to the following people for patches and other suggestions for improvements:"),
p("Carine Rey, ", "Hugo Varet,", "Julien Tap, ","Anna Zhukova.")
p("Carine Rey, ", "Hugo Varet,", "Emeline Perthame,", "Julien Tap, ","Anna Zhukova.")
),
tabPanel("Citing SHAMAN",
p("If you use SHAMAN for your project, please cite our first application of SHAMAN in Quereda et al. 2016.",style = "font-family: 'times'; font-si16pt"),
p("Publication using SHAMAN :",style = "font-family: 'times'; font-si18pt; font-style: strong"),
p("Publication using SHAMAN:",style = "font-family: 'times'; font-si18pt; font-style: strong"),
p(a("Prediction of the intestinal resistome by a three-dimensional structure-based method.", href="https://www.ncbi.nlm.nih.gov/pubmed/30478291"),"Ruppé E, Ghozlane A, Tap J, et al.;Nature microbiology 2018",style = "font-family: 'times'; font-si16pt"),
p(a("Diverse laboratory colonies of Aedes aegypti harbor the same adult midgut bacterial microbiome.", href="https://www.ncbi.nlm.nih.gov/pubmed/29587819"), "Dickson LB, Ghozlane A, Volant S, Bouchier C, Ma L, Vega-Rúa A, Dusfour I, Jiolle D, Paupy C, Mayanja MN, Kohl A, Lutwama JJ, Duong V, Lambrechts L; Parasit Vectors 2018",style = "font-family: 'times'; font-si16pt"),
......@@ -441,9 +441,9 @@ function(request) {
),
div(style = "text-align:center;",
actionButton("submit", strong("Check and submit"), icon("chevron-circle-right"),class="btn-primary",style = "color: #fff"),
receiveSweetAlert(messageId = "ErrorMasque"),
tags$style(type='text/css', "#submit { width:50%; margin-top: 5px;}"),
receiveSweetAlert(messageId = "SuccessMasque")
#receiveSweetAlert(messageId = "ErrorMasque"),
tags$style(type='text/css', "#submit { width:50%; margin-top: 5px;}")#,
#receiveSweetAlert(messageId = "SuccessMasque")
)
),
......@@ -523,8 +523,8 @@ function(request) {
selectInput("FileFormat","",c("Count table & taxonomy (*.csv or *.tsv)"="fileCounts","BIOM file"="fileBiom","Project number"="projnum"),selected="fileCounts"),
conditionalPanel(condition="input.FileFormat=='fileCounts'",
checkboxInput("NoTaxoFile","No taxonomy table",value=FALSE),
selectInput("DemoDataset",h6(strong('Or select a dataset')),c("..."="...","ZymoBIOMICS mock 16S"=c("30a47fca2dc3|Volant et al. 2019 in review")),selected="..."),
receiveSweetAlert(messageId = "DemoDataset")
selectInput("DemoDataset",h6(strong('Or select a dataset')),c("..."="...","ZymoBIOMICS mock 16S"=c("30a47fca2dc3|Volant et al. 2019 in review")),selected="...")#,
#receiveSweetAlert(messageId = "DemoDataset")
),
conditionalPanel(condition="input.FileFormat=='projnum'",
inlineCSS(list(.pwdGREEN = "background-color: #DDF0B3",.pwdRED = "background-color: #F0B2AD")),
......@@ -592,13 +592,13 @@ function(request) {
),
column(id="tabboxdata_col",width=12,uiOutput("TabBoxData")),
receiveSweetAlert(messageId = "ErrorTaxo"),
receiveSweetAlert(messageId = "ErrorBiom1"),
receiveSweetAlert(messageId = "ErrorBiom2"),
receiveSweetAlert(messageId = "ErrorSizeFactor"),
receiveSweetAlert(messageId = "ErrorCounts"),
receiveSweetAlert(messageId = "ErrorRDP")
column(id="tabboxdata_col",width=12,uiOutput("TabBoxData"))#,
# receiveSweetAlert(messageId = "ErrorTaxo"),
# receiveSweetAlert(messageId = "ErrorBiom1"),
# receiveSweetAlert(messageId = "ErrorBiom2"),
# receiveSweetAlert(messageId = "ErrorSizeFactor"),
# receiveSweetAlert(messageId = "ErrorCounts"),
# receiveSweetAlert(messageId = "ErrorRDP")
),
#### STATISTICAL ANALYSIS ####
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment