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
.
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:
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)
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
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”.
## R version 4.4.2 (2024-10-31)
## 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.33.1
## [5] magrittr_2.0.3 shinyjqui_0.4.1
## [7] estimability_1.5.1 MALDIquant_1.22.3
## [9] rmarkdown_2.29 zlibbioc_1.52.0
## [11] vctrs_0.6.5 htmltools_0.5.8.1
## [13] S4Arrays_1.7.1 curl_6.0.1
## [15] broom_1.0.7 SparseArray_1.7.2
## [17] mzID_1.45.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.81.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.19.0
## [41] clue_0.3-66 digest_0.6.37
## [43] pcaMethods_1.99.0 colorspace_2.1-1
## [45] S4Vectors_0.45.2 GenomicRanges_1.59.1
## [47] fansi_1.0.6 timechange_0.3.0
## [49] httr_1.4.7 abind_1.4-8
## [51] compiler_4.4.2 doParallel_1.0.17
## [53] backports_1.5.0 BiocParallel_1.41.0
## [55] viridis_0.6.5 dendextend_1.19.0
## [57] gplots_3.2.0 MASS_7.3-61
## [59] DelayedArray_0.33.3 scatterplot3d_0.3-44
## [61] gtools_3.9.5 caTools_1.18.3
## [63] mzR_2.41.1 flashClust_1.01-2
## [65] tools_4.4.2 PSMatch_1.11.0
## [67] httpuv_1.6.15 quantmod_0.4.26
## [69] FactoMineR_2.11 glue_1.8.0
## [71] promises_1.3.2 QFeatures_1.17.0
## [73] grid_4.4.2 cluster_2.1.6
## [75] reshape2_1.4.4 generics_0.1.3
## [77] gtable_0.3.6 preprocessCore_1.69.0
## [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.47.0
## [85] BiocGenerics_0.53.3 foreach_1.5.2
## [87] ggrepel_0.9.6 pillar_1.9.0
## [89] stringr_1.5.1 limma_3.63.2
## [91] later_1.4.1 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.49 gridExtra_2.3
## [99] IRanges_2.41.2 ProtGenerics_1.39.0
## [101] SummarizedExperiment_1.37.0 stats4_4.4.2
## [103] xfun_0.49 Biobase_2.67.0
## [105] statmod_1.5.0 factoextra_1.0.7
## [107] MSnbase_2.33.2 matrixStats_1.4.1
## [109] DT_0.33 visNetwork_2.1.2
## [111] stringi_1.8.4 UCSC.utils_1.3.0
## [113] lazyeval_0.2.2 yaml_2.3.10
## [115] evaluate_1.0.1 codetools_0.2-20
## [117] MsCoreUtils_1.19.0 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-1
## [127] GenomeInfoDb_1.43.2 XML_3.99-0.17
## [129] parallel_4.4.2 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-2
## [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.75.0
## [147] shinyjs_2.1.0