Adding third party plots

Introduction

An interesting feature about omXplore is the capacity to insert custom plots into the collection of vignettes of the Shiny app view_dataset(). This is useful to complete the panel of built-in plots of omXplore and the main UI (See ?view_dataset).

This vignette aims to describe how to (i) develop a plot function compliant with omXplore and (ii) add a new plot in the main app of the package omXplore.

Develop a plot module for omXplore

Any plot function, to be compatible with omXplore, must be written as a shiny module to allow for better code organisation and re-usability. Let suppose one wants to write a plot called “myFirstPlot”. As usual, the code of this shiny app is divided into two parts:

  • User interface (UI): function “myFirstPlot_ui()”
  • Server: function “myFirstPlot_server()”

Moreover, the parameters of these two functions must have the same name and class as the built-in plot functions in omXplore . For more details, see ?extFoo1 which is a simple example of what a generic plot function should looks like.

Following Bioconductor’s recommendations about Running shiny apps, the source code for this plot function should look as follows:

myFirstPlot <- function(obj, i) {
  ui <- myFirstPlot_ui(id)
  server <- myFirstPlot_server(id, obj, i)
  app <- shinyApp(ui = ui, server = server)
}

These three functions (myFirstPlot_ui(), myFirstPlot_server() and myFirstPlot()) can be written in the same source file (e.g. myFirstPlot.R)

Adding an existing module

From a R package

When one wants to add an external plot from a R package, it is by means of the parameter ‘addons’ of the function view_dataset(). This parameter is a list structured as follows:

  • the name of each slot is the name of a R package in which a plot module is implemented,

  • the content of the slot is a vector of modules names.

It is necessary that the functions *_ui() and *_server are defined outside the global app function myFirstPlot(). This is because the function “view_dataset” cannot use the function myFirstPlot() and it must use the two functions myFirstPlot_ui(), myFirstPlot_server().

Thus, the following code will not work:

myFirstPlot <- function(obj, i) {
  ui <- function(id) {
  ...
  }
  server <- function(id, obj, i) {
  moduleServer(id, 
    function(input, output, session) {
    ...
  })
  }
  
  app <- shinyApp(ui = ui, server = server)
}

A functional code is as follows:

myFirstPlot_ui <- function(id) {
  ...
}


myFirstPlot_server <- function(id, obj, i) {
  moduleServer(id, 
    function(input, output, session) {
    ...
  })
}

myFirstPlot <- function(obj, i) {
  ui <- myFirstPlot_ui(id)
  server <- myFirstPlot_server(id, obj, i)
  app <- shinyApp(ui = ui, server = server)
}

As an example, the code below will add three external plots:

  • package myPkgA: the plot functions “extFoo1” and “extFoo2”,

  • package myPkgB: the plot function “extFoo1”.

The corresponding R code is the following:

addons <- list(
  myPkgA = c("extFoo1", "extFoo2"),
  myPkgB = c("extFoo1")
  )
view_dataset(myData, addons)

Functions can have same names if they are part of different packages.

With this procedure, it is not necessary to load the entire package in order to user the plot module. omXplore loads only the necessary code for the plot fucntions.

Icon for clickable vignette

If the plot function is part of a R package, it is possible to store a *.png image that serves as icon for the clickable vignette displayed in the (B) area of the main app of omXplore. For that purpose, the file should be stored in the ‘images’ directory of the corresponding package and its name should be the same as the function it refers to.

The global file structure for the plot function of the example is the following:

MyPackage/
|-- R/
|   |-- myFirstPlot.R
|-- inst/
|   |-- images/
|       |-- myFirstPlot.png

From R console

If the plot function is written in a R script nor console, the same rules are used to write the three functions described in the previous section.

However, there are two important modifications:

  • the name of the three functions must be prefixed by “omXplore_’

  • so as to let omXplore find the plot function, it must already be loaded in the global R environment before running the app view_dataset(). Please note that in this case, there is to need to set the parameter “addons”.

omXplore_mySecondPlot <- function(obj, i) {
  ui <- omXplore_mySecondPlot_ui(id)
  server <- omXplore_mySecondPlot_server(id, obj, i)
  app <- shinyApp(ui = ui, server = server)
}

Session information

sessionInfo()
## R version 4.4.1 (2024-06-14)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.04.1 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=C              
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: Etc/UTC
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] omXplore_1.1.0   BiocStyle_2.35.0
## 
## loaded via a namespace (and not attached):
##   [1] RColorBrewer_1.1-3          sys_3.4.3                  
##   [3] jsonlite_1.8.9              MultiAssayExperiment_1.31.5
##   [5] magrittr_2.0.3              shinyjqui_0.4.1            
##   [7] estimability_1.5.1          MALDIquant_1.22.3          
##   [9] rmarkdown_2.28              zlibbioc_1.51.2            
##  [11] vctrs_0.6.5                 htmltools_0.5.8.1          
##  [13] S4Arrays_1.5.11             curl_5.2.3                 
##  [15] broom_1.0.7                 SparseArray_1.5.45         
##  [17] mzID_1.43.0                 TTR_0.24.4                 
##  [19] sass_0.4.9                  KernSmooth_2.23-24         
##  [21] bslib_0.8.0                 htmlwidgets_1.6.4          
##  [23] plyr_1.8.9                  impute_1.79.0              
##  [25] emmeans_1.10.5              zoo_1.8-12                 
##  [27] lubridate_1.9.3             cachem_1.1.0               
##  [29] buildtools_1.0.0            igraph_2.1.1               
##  [31] mime_0.12                   iterators_1.0.14           
##  [33] lifecycle_1.0.4             pkgconfig_2.0.3            
##  [35] Matrix_1.7-1                R6_2.5.1                   
##  [37] fastmap_1.2.0               shiny_1.9.1                
##  [39] GenomeInfoDbData_1.2.13     MatrixGenerics_1.17.1      
##  [41] clue_0.3-65                 digest_0.6.37              
##  [43] pcaMethods_1.97.0           colorspace_2.1-1           
##  [45] S4Vectors_0.43.2            GenomicRanges_1.57.2       
##  [47] fansi_1.0.6                 timechange_0.3.0           
##  [49] httr_1.4.7                  abind_1.4-8                
##  [51] compiler_4.4.1              doParallel_1.0.17          
##  [53] backports_1.5.0             BiocParallel_1.41.0        
##  [55] viridis_0.6.5               dendextend_1.18.1          
##  [57] gplots_3.2.0                MASS_7.3-61                
##  [59] DelayedArray_0.33.1         scatterplot3d_0.3-44       
##  [61] gtools_3.9.5                caTools_1.18.3             
##  [63] mzR_2.39.2                  flashClust_1.01-2          
##  [65] tools_4.4.1                 PSMatch_1.9.1              
##  [67] httpuv_1.6.15               quantmod_0.4.26            
##  [69] FactoMineR_2.11             glue_1.8.0                 
##  [71] promises_1.3.0              QFeatures_1.15.3           
##  [73] grid_4.4.1                  cluster_2.1.6              
##  [75] reshape2_1.4.4              generics_0.1.3             
##  [77] gtable_0.3.6                preprocessCore_1.67.1      
##  [79] shinyBS_0.61.1              sm_2.2-6.0                 
##  [81] tidyr_1.3.1                 data.table_1.16.2          
##  [83] utf8_1.2.4                  XVector_0.45.0             
##  [85] BiocGenerics_0.53.0         foreach_1.5.2              
##  [87] ggrepel_0.9.6               pillar_1.9.0               
##  [89] stringr_1.5.1               limma_3.61.12              
##  [91] later_1.3.2                 dplyr_1.1.4                
##  [93] lattice_0.22-6              tidyselect_1.2.1           
##  [95] vioplot_0.5.0               maketools_1.3.1            
##  [97] knitr_1.48                  gridExtra_2.3              
##  [99] IRanges_2.39.2              ProtGenerics_1.37.1        
## [101] SummarizedExperiment_1.35.5 stats4_4.4.1               
## [103] xfun_0.48                   Biobase_2.67.0             
## [105] statmod_1.5.0               factoextra_1.0.7           
## [107] MSnbase_2.31.2              matrixStats_1.4.1          
## [109] DT_0.33                     visNetwork_2.1.2           
## [111] stringi_1.8.4               UCSC.utils_1.1.0           
## [113] lazyeval_0.2.2              yaml_2.3.10                
## [115] evaluate_1.0.1              codetools_0.2-20           
## [117] MsCoreUtils_1.17.3          tibble_3.2.1               
## [119] BiocManager_1.30.25         affyio_1.77.0              
## [121] multcompView_0.1-10         cli_3.6.3                  
## [123] xtable_1.8-4                munsell_0.5.1              
## [125] jquerylib_0.1.4             Rcpp_1.0.13                
## [127] GenomeInfoDb_1.41.2         XML_3.99-0.17              
## [129] parallel_4.4.1              leaps_3.2                  
## [131] ggplot2_3.5.1               assertthat_0.2.1           
## [133] AnnotationFilter_1.31.0     bitops_1.0-9               
## [135] viridisLite_0.4.2           mvtnorm_1.3-1              
## [137] rlist_0.4.6.2               affy_1.85.0                
## [139] scales_1.3.0                xts_0.14.1                 
## [141] ncdf4_1.23                  purrr_1.0.2                
## [143] highcharter_0.9.4           crayon_1.5.3               
## [145] rlang_1.1.4                 vsn_3.73.0                 
## [147] shinyjs_2.1.0