# Plugins of BioInstaller Shiny Application

#### Jianfeng Li

#### 2018-11-20

## Introduction

Both the R files and plugin files (TOML format) are supported to extend and add new functions of BioInstaller Shiny application. Users can modifed the value of shiny_plugin_dir to use a custom plugins library. The plugins filename: shiny.easy_project.parameters.toml, shiny.maftools.parameters, etc. Now we use the “shiny.{toolname}.parameters.toml” rule to search the plugin file, or you can modifed the line 84 of `global_bar.R` to change the rule.

## Demos

### Plugin easy_project

First level: `ui`, `parameters`

- `ui.sections` defined the boxes, such as the `new_proj`.
- `ui.sections.ui_basic` defined the basic parameter of a box.

In the parameters, we could defined the section type, a simplest plugin of BioInstaller should only contains a `input` type box, and the box can input parameters and submit a long-time cost task.

- `rcmd_last` contains the commands need to be ran in the workers.
- `progressbar_message` only for `instant` module plugins to shows the running box
- `render_id` is the prefix of the auto-generated boxes element
- `input_ui_order` defined the sections of `input` box, such as `single_input` and `start_analysis`

    [easy_project.ui.sections]
    order = ["new_proj"]
    [easy_project.ui.sections.ui_basic]
    new_proj = "title = 'New bioinformatics analysis project', status = 'primary', width = 12, collapsed = FALSE, collapsible = TRUE"

    [easy_project.paramters.new_proj]
    # For reading annovarR shiny APP easy_project tool input files
    section_type = "input"
    rcmd_last = """
    parent_dir <- normalizePath(parent_dir, mustWork = FALSE)
    project_dir <- normalizePath(file.path(parent_dir, project_name), mustWork = FALSE)
    analysis_dirs <- c(paste0("rnaseq/", c("exp", "fusion", "splicing", "mutation")),
                       paste0("dnaseq/", c("wes/mutation", "wgs/mutation", "chip/peak")))
    data_dirs <- c("fastq", "fasta", "bam", "vcf", "meta")
    meta_json <- list(project_dir = project_dir, project_name = project_name,
      create_time = format(Sys.time(), "%Y-%m-%d %H:%M:%S"),
    creator = Sys.getenv("USER"))
    meta_json$project_id <- git2r::hash(sprintf("%s,%s",
                                        meta_json$project_name, meta_json$create_time))
    sapply(sprintf("%s/%s", project_dir, c(file.path("analysis", analysis_dirs),
                                           file.path("data", data_dirs))),
                                           function(x) {dir.create(x, recursive = TRUE)})
    configr::write.config(meta_json, file.path(project_dir, "project.json"), write.type = "json")
    """
    progressbar_message = ""
    render_id = "easy_project_new_proj"

    #!!!!! input_ui_order required related section
    input_ui_order = ["single_input", "start_analysis"]

    [easy_project.paramters.new_proj.input.single_input]
    title = "Parameters:"
    title_control = "class = 'input-section-p'"
    varname = ["project_name", "parent_dir"]
    input_id = ["input_project_name", "input_parent_dir"]
    type = ["shiny::textInput", "shiny::textInput"]
    label = ["Project Name", "Project parent dir"]

    [easy_project.paramters.new_proj.input.start_analysis]
    input_id = "start_easy_project_analysis"
    type = "shiny::actionButton"
    label = "Submit"

In the `parameters` section, all variables in `varname` are automatically assigned to the element values of `input_id`, such as a text input box, selector or check box.

- `start_analysis` section now is required for submitting a long-time cost task that this section should only need to change the plugin name (e.g. easy_project) only.

### Plugin maftools

All `output` type boxes will get the instant output results including text, table, and plots. All result can be update when click the `Update` button on the box.

- `export_engine` now support `Cairo` and `link`.

`Cairo` need a plot function in the rcmd_last, and a list such as `list(src = "plot_output", alt = paste('Heatmap_3'))`, is required for export a plot through a file path.

    [maftools.ui.sections]
    order = ["readfiles", "getFields", "getSampleSummary", "plotmafSummary",
    "oncoplot_default", "oncoplot_with_cnv", "oncoplot_advanced", "plotTiTv", "lollipopPlot2", "tcgaCompare", "plotVaf",
    "somaticInteractions", "oncostrip", "plotEnrichmentResults", "plotClusters"]
    order_bak = ["readfiles", "getFields", "getSampleSummary", "getGeneSummary", "getClinicalData", "plotmafSummary",
    "oncoplot_default", "oncoplot_with_cnv", "oncoplot_advanced", "plotTiTv", "lollipopPlot", "lollipopPlot2", "tcgaCompare", "plotVaf",
    "gisticChromPlot", "gisticBubblePlot", "gisticOncoPlot", "somaticInteractions", "oncostrip", "plotOncodrive",
    "mafSurvival", "plotEnrichmentResults", "plotClusters"]
    [maftools.ui.sections.ui_basic]
    readfiles = "title = 'Input files', status = 'primary', width = 12, collapsed = FALSE, collapsible = TRUE"
    getFields = "title = 'Output of maftools fields summary', status = 'primary', width = 12, collapsed = TRUE, collapsible = TRUE"
    getSampleSummary = "title = 'Output of maftools sample summary', status = 'primary', width = 12, collapsed = TRUE, collapsible = TRUE"
    getGeneSummary = "title = 'Output of maftools gene summary', status = 'primary', width = 12, collapsed = TRUE, collapsible = TRUE"
    getClinicalData = "title = 'Output of maftools clinical data summary', status = 'primary', width = 12, collapsed = TRUE, collapsible = TRUE"
    plotmafSummary = "title = 'Output of maftools MAF summary', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    oncoplot_default = "title = 'Output of maftools oncoplots', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    oncoplot_with_cnv = "title = 'Output of maftools oncoplots with copy number data', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    oncoplot_advanced = "title = 'Output of maftools oncoplots with advanced', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    plotTiTv = "title = 'Output of maftools transition and transversions', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    lollipopPlot = "title = 'Output of maftools Lollipop plots for amino acid changes', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    lollipopPlot2 = "title = 'Output of maftools Lollipop2 plots for amino acid changes', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    tcgaCompare = "title = 'Output of maftools comparing mutation load', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    plotVaf = "title = 'Output of maftools VAF boxplot', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    gisticChromPlot = "title = 'Output of maftools gistic genome plot', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    gisticBubblePlot = "title = 'Output of maftools gistic bubble plot', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    gisticOncoPlot = "title = 'Output of maftools gistic oncoplot plot', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    somaticInteractions = "title = 'Output of maftools somatic interactions', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    oncostrip = "title = 'Output of maftools somatic interactions (oncostrip)', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    plotOncodrive = "title = 'Output of maftools driver based on positional clustering', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    mafSurvival = "title = 'Output of maftools Survival', status = 'primary', width = 12, collapsed = TRUE, collapsible = TRUE"
    plotEnrichmentResults = "title = 'Output of maftools Clinical enrichment analysis', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"
    plotClusters = "title = 'Output of maftools heterogeneity analysis', status = 'primary', width = 12, collapsed = TRUE, height='auto', collapsible = TRUE"

    [maftools.paramters.readfiles]
    # For reading annovarR shiny APP maftools tool input files
    section_type = "input"
    rcmd_last = """
    laml = read.maf(maf = laml_maf, clinicalData = laml_clin)
    laml.plus.gistic = read.maf(maf = laml_maf, gisticAllLesionsFile = all_lesions, gisticAmpGenesFile = amp_genes,
      gisticDelGenesFile = del_genes, gisticScoresFile = scores_gis, isTCGA = is_tcga)
    laml.gistic = readGistic(gisticAllLesionsFile = all_lesions, gisticAmpGenesFile = amp_genes, gisticDelGenesFile = del_genes, gisticScoresFile = scores_gis, isTCGA = is_tcga)
    primary_maf = read.maf(maf = primary_maf)
    relapse_maf = read.maf(maf = relapse_maf)
    """
    progressbar_message = "Reading related MAF and other files."
    render_id = "maftools_readfiles"

    #!!!!! input_ui_order required related section
    input_ui_order = ["single_input", "cnv_input", "comparsion_input", "other_params", "start_analysis"]

    [maftools.paramters.readfiles.input.single_input]
    title = "Single sample anlayais:"
    title_control = "class = 'input-section-p'"
    varname = ["laml_maf", "laml_clin", "laml_mutsig"]
    input_id = ["input_maf", "input_clin", "input_mutsig"]
    type = ["shiny::selectInput", "shiny::selectInput", "shiny::selectInput"]
    label = ["MAF file (laml_maf)", "Clincal annotation file (laml_clin)", "MutSig reusults (laml_mutsig)"]
    [maftools.paramters.readfiles.input.single_input.choices]
    laml_maf = "!!glue {c(list.files(system.file('extdata', package = 'maftools'), '(maf)', full.names = TRUE), featch_files(c('maf', 'maf.gz'))$file_path)}"
    laml_clin = "!!glue {c(list.files(system.file('extdata', package = 'maftools'), '(txt)|(tsv)', full.names = TRUE), featch_files(c('tsv', 'txt', 'txt.gz', 'tsv.gz'))$file_path)}"
    laml_mutsig = "!!glue {c(list.files(system.file('extdata', package = 'maftools'), '(txt)|(tsv)', full.names = TRUE), featch_files(c('tsv', 'txt', 'txt.gz', 'tsv.gz'))$file_path)}"
    [maftools.paramters.readfiles.input.single_input.selected]
    laml_maf = "@>@system.file('extdata', 'tcga_laml.maf.gz', package = 'maftools')@<@"
    laml_clin = "@>@system.file('extdata', 'tcga_laml_annot.tsv', package = 'maftools')@<@"
    laml_mutsig = "@>@system.file('extdata', 'LAML_sig_genes.txt.gz', package = 'maftools')@<@"

    [maftools.paramters.readfiles.input.cnv_input]
    title = "CNV related analyais:"
    title_control = "class = 'input-section-p'"
    varname = ["all_lesions", "amp_genes", "del_genes", "scores_gis"]
    input_id = ["input_gistic_all_lesions", "input_gistic_amp", "input_gistic_del", "input_gistic_score"]
    type = ["shiny::selectInput", "shiny::selectInput", "shiny::selectInput", "shiny::selectInput"]
    label = ["Gistic all lesions file (all_lesions):", "Gistic amp genes file (amp_genes)",
                          "Gistic del genes file (del_genes)", "Gistic score file (scores_gis)"]
    [maftools.paramters.readfiles.input.cnv_input.choices]
    all_lesions = "!!glue {c(list.files(system.file('extdata', package = 'maftools'), '(txt)|(tsv)', full.names = TRUE), featch_files(c('txt', 'txt.gz'))$file_path)}"
    amp_genes = "!!glue {c(list.files(system.file('extdata', package = 'maftools'), '(txt)|(tsv)', full.names = TRUE), featch_files(c('txt', 'txt.gz'))$file_path)}"
    del_genes = "!!glue {c(list.files(system.file('extdata', package = 'maftools'), '(txt)|(tsv)', full.names = TRUE), featch_files(c('txt', 'txt.gz'))$file_path)}"
    scores_gis = "!!glue {c(list.files(system.file('extdata', package = 'maftools'), '(gistic)', full.names = TRUE), featch_files(c('txt', 'txt.gz', 'gistic'))$file_path)}"
    [maftools.paramters.readfiles.input.cnv_input.selected]
    all_lesions = "@>@system.file('extdata', 'all_lesions.conf_99.txt', package = 'maftools')@<@"
    amp_genes = "@>@system.file('extdata', 'amp_genes.conf_99.txt', package = 'maftools')@<@"
    del_genes = "@>@system.file('extdata', 'del_genes.conf_99.txt', package = 'maftools')@<@"
    scores_gis = "@>@system.file('extdata', 'scores.gistic', package = 'maftools')@<@"

    [maftools.paramters.readfiles.input.comparsion_input]
    title = "Comparsion between different cohort:"
    title_control = "class = 'input-section-p'"
    varname = ["primary_maf", "relapse_maf"]
    input_id = ["input_primary_maf", "input_relapse_maf"]
    type = ["shiny::selectInput", "shiny::selectInput"]
    label = ["Cohort 1 maf file (primary_maf)", "Cohort 2 maf file (relapse_maf)"]
    [maftools.paramters.readfiles.input.comparsion_input.choices]
    primary_maf = "!!glue {c(list.files(system.file('extdata', package = 'maftools'), '(maf)', full.names = TRUE), featch_files(c('maf', 'maf.gz'))$file_path)}"
    relapse_maf = "!!glue {c(list.files(system.file('extdata', package = 'maftools'), '(maf)', full.names = TRUE), featch_files(c('maf', 'maf.gz'))$file_path)}"
    [maftools.paramters.readfiles.input.comparsion_input.selected]
    primary_maf = "@>@system.file('extdata', 'APL_primary.maf.gz', package = 'maftools')@<@"
    relapse_maf = "@>@system.file('extdata', 'APL_relapse.maf.gz', package = 'maftools')@<@"

    [maftools.paramters.readfiles.input.other_params]
    title = "Other paramters"
    title_control = "class = 'input-section-p'"
    varname = ["is_tcga"]
    input_id = ["maftools_is_tcga"]
    type = ["shiny::checkboxInput"]
    label = ["Reading file: Maf file is TCGA format? (is_tcga is TRUE)",
    "Command to read files."]

    [maftools.paramters.readfiles.input.other_params.value]
    is_tcga = true

    [maftools.paramters.readfiles.input.start_analysis]
    input_id = "start_maftools_analysis"
    type = "shiny::actionButton"
    label = "Run"

    [maftools.paramters.getFields]
    section_type = "output"
    rcmd_last = "getFields(laml)"
    render_type = "shiny::renderPrint"
    render_id = "maftools_fields_summary"
    output_type = "shiny::verbatimTextOutput"
    progressbar_message = "Maftools getFields"

    [maftools.paramters.getSampleSummary]
    section_type = "output"
    rcmd_last = "getSampleSummary(laml)"
    render_type = "DT::renderDataTable"
    render_id = "maftools_sample_summary"
    output_type = "DT::dataTableOutput"
    progressbar_message = "Maftools getSampleSummary"

    [maftools.paramters.getGeneSummary]
    section_type = "output"
    rcmd_last = "getGeneSummary(laml)"
    render_type = "DT::renderDataTable"
    render_id = "maftools_gene_summary"
    output_type = "DT::dataTableOutput"
    progressbar_message = "Maftools getGeneSummary"

    [maftools.paramters.getClinicalData]
    section_type = "output"
    render_type = "DT::renderDataTable"
    render_id = "maftools_clinical_data"
    output_type = "DT::dataTableOutput"
    rcmd_last = "getClinicalData(laml)"
    progressbar_message = "Maftools getClinicalData"

    [maftools.paramters.plotmafSummary]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_maf_summary"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 14, units='cm', bg='transparent'"
    rcmd_last = """plotmafSummary(maf = laml, rmOutlier = TRUE, addStat = 'median', dashboard = TRUE, titvRaw = FALSE)"""
    progressbar_message = "Maftools plotmafSummary"

    [maftools.paramters.oncoplot_default]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_oncoplots"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 14, units='cm', bg='transparent'"
    rcmd_last = "oncoplot(maf = laml, top = 10, fontSize = 12)"
    progressbar_message = "Maftools oncoplot_default"

    [maftools.paramters.oncoplot_with_cnv]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_oncoplots_cnv"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 14, units='cm', bg='transparent'"
    rcmd_last = "oncoplot(maf = laml.plus.gistic, top = 10, fontSize = 12)"
    progressbar_message = "Maftools oncoplot with CNV"

    [maftools.paramters.oncoplot_advanced]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_oncoplots_advanced"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 27, units='cm', bg='transparent'"
    rcmd_preprocess = """
    col = RColorBrewer::brewer.pal(n = 8, name = 'Paired')
    names(col) = c('Frame_Shift_Del','Missense_Mutation', 'Nonsense_Mutation', 'Multi_Hit', 'Frame_Shift_Ins',
      'In_Frame_Ins', 'Splice_Site', 'In_Frame_Del')

    #Color coding for FAB classification; try getAnnotations(x = laml) to see available annotations.
    fabcolors = RColorBrewer::brewer.pal(n = 8,name = 'Spectral')
    names(fabcolors) = c("M0", "M1", "M2", "M3", "M4", "M5", "M6", "M7")
    fabcolors = list(FAB_classification = fabcolors)
    mutsigQval = 0.01
    clinicalFeatures = "FAB_classification"
    sortByAnnotation = TRUE

    oncoplot_advanced_params <- list(maf = laml, colors = col, mutsig = laml_mutsig,
      mutsigQval = mutsigQval, clinicalFeatures = clinicalFeatures,
      sortByAnnotation = sortByAnnotation,
      annotationColor = fabcolors)
    """
    rcmd_last = """
    do.call(oncoplot, oncoplot_advanced_params)
    """
    progressbar_message = "Maftools oncoplot with advanced"

    [maftools.paramters.plotTiTv]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_titv"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_preprocess = "laml.titv = titv(maf = laml, plot = FALSE, useSyn = TRUE)"
    rcmd_last = "plotTiTv(res = laml.titv)"
    progressbar_message = "Maftools plotTiTv"

    [maftools.paramters.lollipopPlot]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_lollipop"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_last = """lollipopPlot(maf = laml, gene = 'DNMT3A', AACol = 'Protein_Change', showMutationRate = TRUE)"""
    progressbar_message = "Maftools lollipopPlot"
    [maftools.paramters.lollipopPlot2]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_lollipop2"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_last = """lollipopPlot2(m1 = primary_maf, m2 = relapse_maf, gene = "PML",
                        AACol1 = "amino_acid_change", AACol2 = "amino_acid_change", m1_name = "Primary", m2_name = "Relapse")"""
    progressbar_message = "Maftools lollipopPlot2"

    [maftools.paramters.tcgaCompare]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_mutation_load"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_last = "laml.mutload = tcgaCompare(maf = laml, cohortName = 'Example-LAML')"
    progressbar_message = "Maftools tcgaCompare"

    [maftools.paramters.plotVaf]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_vaf_box"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_last = "plotVaf(maf = laml, vafCol = 'i_TumorVAF_WU')"
    progressbar_message = "Maftools plotVaf"

    [maftools.paramters.gisticChromPlot]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_gistic_genome"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_last = """gisticChromPlot(gistic = laml.gistic, markBands = "all")"""
    progressbar_message = "Maftools gisticChromPlot"

    [maftools.paramters.gisticBubblePlot]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_gistic_bubble"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_last = """gisticBubblePlot(gistic = laml.gistic)"""
    progressbar_message = "Maftools gisticBubblePlot"

    [maftools.paramters.gisticOncoPlot]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_gistic_oncoplot"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_last = """gisticOncoPlot(gistic = laml.gistic, clinicalData = getClinicalData(x = laml),
    clinicalFeatures = 'FAB_classification', sortByAnnotation = TRUE, top = 10)"""
    progressbar_message = "Maftools gisticOncoPlot"

    [maftools.paramters.somaticInteractions]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_somatic_inter"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_last = """somaticInteractions(maf = laml, top = 25, pvalue = c(0.05, 0.1))"""
    progressbar_message = "Maftools somaticInteractions"

    [maftools.paramters.oncostrip]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_somatic_inter_oncostrip"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_last = """oncostrip(maf = laml, genes = c('TP53', 'FLT3', 'RUNX1'))"""
    progressbar_message = "Maftools oncostrip"

    [maftools.paramters.plotOncodrive]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_oncodrive"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_preprocess = """laml.sig = oncodrive(maf = laml, AACol = 'Protein_Change', minMut = 5, pvalMethod = 'zscore')"""
    rcmd_last = """plotOncodrive(res = laml.sig, fdrCutOff = 0.1, useFraction = TRUE)"""
    progressbar_message = "Maftools plotOncodrive"

    [maftools.paramters.mafSurvival]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_survival"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_last = """mafSurvival(maf = laml, genes = 'DNMT3A', time = 'days_to_last_followup',
    Status = 'Overall_Survival_Status', isTCGA = TRUE)"""
    progressbar_message = "Maftools mafSurvival"

    [maftools.paramters.plotEnrichmentResults]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_clinical_enrichment"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_preprocess = "fab.ce = clinicalEnrichment(maf = laml, clinicalFeature = 'FAB_classification')"
    rcmd_last = """plotEnrichmentResults(enrich_res = fab.ce, pVal = 0.05)"""
    progressbar_message = "Maftools plotEnrichmentResults"

    [maftools.paramters.plotClusters]
    section_type = "output"
    render_type = "shiny::renderPlot"
    render_id = "maftools_plot_clusters"
    output_type = "shiny::plotOutput"
    export_engine = "Cairo"
    export_params = "type = 'pdf', width = 21, height = 17, units='cm', bg='transparent'"
    rcmd_preprocess = "tcga.ab.2972.het = inferHeterogeneity(maf = laml, tsb = 'TCGA-AB-2972', vafCol = 'i_TumorVAF_WU')"
    rcmd_last = "plotClusters(clusters = tcga.ab.2972.het)"
    progressbar_message = "Maftools maftools_plot_clusters"

## More demos

In another project annovarR, we developed several plugins files that have not been included in BioInstaller package, such as gvmap, clusterProfiler, ANNOVAR, CEMiTool, vcfanno, annovarR, etc. It is noted that we do not want to limite users to write R codes for extending the R shiny functions. But using the plugin files to simultaneously generate UI and server code is a good choice to simplify the steps for adding new functions in a Shiny application.