The package omXplore
is able to embed third party plots. This vignette aims to explain how to add an external plot to the main UI of omXplore
.
omXplore 1.1.0
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”.
omXplore_mySecondPlot <- function(obj, i) {
ui <- omXplore_mySecondPlot_ui(id)
server <- omXplore_mySecondPlot_server(id, obj, i)
app <- shinyApp(ui = ui, server = server)
}
sessionInfo()
## R Under development (unstable) (2024-10-21 r87258)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.04.1 LTS
##
## Matrix products: default
## BLAS: /home/biocbuild/bbs-3.21-bioc/R/lib/libRblas.so
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_GB 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: America/New_York
## 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 jsonlite_1.8.9
## [3] MultiAssayExperiment_1.33.0 magrittr_2.0.3
## [5] shinyjqui_0.4.1 TH.data_1.1-2
## [7] estimability_1.5.1 MALDIquant_1.22.3
## [9] rmarkdown_2.28 zlibbioc_1.53.0
## [11] vctrs_0.6.5 htmltools_0.5.8.1
## [13] S4Arrays_1.7.0 curl_5.2.3
## [15] broom_1.0.7 SparseArray_1.7.0
## [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 sandwich_3.1-1
## [25] impute_1.81.0 emmeans_1.10.5
## [27] zoo_1.8-12 lubridate_1.9.3
## [29] cachem_1.1.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-65 digest_0.6.37
## [43] pcaMethods_1.99.0 colorspace_2.1-1
## [45] S4Vectors_0.45.0 GenomicRanges_1.59.0
## [47] fansi_1.0.6 timechange_0.3.0
## [49] httr_1.4.7 abind_1.4-8
## [51] compiler_4.5.0 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.0 scatterplot3d_0.3-44
## [61] gtools_3.9.5 caTools_1.18.3
## [63] mzR_2.41.0 flashClust_1.01-2
## [65] tools_4.5.0 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.0 QFeatures_1.17.0
## [73] grid_4.5.0 reshape2_1.4.4
## [75] cluster_2.1.6 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.0 foreach_1.5.2
## [87] ggrepel_0.9.6 pillar_1.9.0
## [89] stringr_1.5.1 limma_3.63.0
## [91] later_1.3.2 splines_4.5.0
## [93] dplyr_1.1.4 lattice_0.22-6
## [95] survival_3.7-0 tidyselect_1.2.1
## [97] vioplot_0.5.0 knitr_1.48
## [99] gridExtra_2.3 bookdown_0.41
## [101] IRanges_2.41.0 ProtGenerics_1.39.0
## [103] SummarizedExperiment_1.37.0 stats4_4.5.0
## [105] xfun_0.48 Biobase_2.67.0
## [107] statmod_1.5.0 factoextra_1.0.7
## [109] MSnbase_2.33.0 matrixStats_1.4.1
## [111] DT_0.33 visNetwork_2.1.2
## [113] stringi_1.8.4 UCSC.utils_1.3.0
## [115] lazyeval_0.2.2 yaml_2.3.10
## [117] evaluate_1.0.1 codetools_0.2-20
## [119] MsCoreUtils_1.19.0 tibble_3.2.1
## [121] BiocManager_1.30.25 affyio_1.77.0
## [123] multcompView_0.1-10 cli_3.6.3
## [125] xtable_1.8-4 munsell_0.5.1
## [127] jquerylib_0.1.4 Rcpp_1.0.13
## [129] GenomeInfoDb_1.43.0 coda_0.19-4.1
## [131] XML_3.99-0.17 parallel_4.5.0
## [133] leaps_3.2 ggplot2_3.5.1
## [135] assertthat_0.2.1 AnnotationFilter_1.31.0
## [137] bitops_1.0-9 viridisLite_0.4.2
## [139] mvtnorm_1.3-1 rlist_0.4.6.2
## [141] affy_1.85.0 scales_1.3.0
## [143] xts_0.14.1 ncdf4_1.23
## [145] purrr_1.0.2 highcharter_0.9.4
## [147] crayon_1.5.3 rlang_1.1.4
## [149] vsn_3.75.0 multcomp_1.4-26
## [151] shinyjs_2.1.0