###################################################################################################
# SHINY Explorer - XXX (xxx) - ui.R
###################################################################################################
tabPanel('XXX', icon = icon(''),
# SIDEBAR PANEL -----------------------------------------------------------------------------------------------------------------
sidebarPanel(
# GEOGRAPHY -------------------------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_geo', 'Show/Hide GEOGRAPHY', class = 'toggle-choices'),
div(id = "hdn_hsp_geo",
p(),
selectInput('cbo_hsp_geo', 'GEOGRAPHY:', choices = locations, selected = 'LAT'),
conditionalPanel("input.tabs_hsp !== 'funnelplot' && input.tabs_hsp !== 'maps'",
checkboxInput('chk_hsp_geo_cdn', 'Use Code instead of Label', value = TRUE )
)
),
hr(),
# TIMESPAN -------------------------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_tmp', 'Show/Hide TIMESPAN', class = 'toggle-choices'),
div(id = 'hdn_hsp_tmp',
p(),
selectInput('cbo_hsp_tmp', 'TIMESPAN:', choices = c( 'select year(s)' = 1, 'select month(s)' = 2,'choose date range' = 3) ),
conditionalPanel("input.cbo_hsp_tmp == '1'",
sliderInput('sld_hsp_tmp', label = NULL,
min = min(dataset$date.year), max = max(dataset$date.year),
value = c(max(dataset$date.year) - 2, max(dataset$date.year) ),
step = 1, ticks = FALSE, sep = ''
)
),
conditionalPanel("input.cbo_hsp_tmp != '1'",
uiOutput('ui_hsp_tmp')
)
), hr(),
# METRICS ---------------------------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_mtc', 'Show/Hide METRICS', class = 'toggle-choices'),
div(id = 'hdn_hsp_mtc',
p(),
# Metric Controls for TABLE -------------------------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'table'",
# Choose Reference metric
selectInput('cbo_hsp_tblY', 'REFERENCE', choices = build_uiY('hsp') ),
# Choose a filter
selectInput('cbo_hsp_tblF', 'FILTERED BY:', choices = c('NONE', build_uiV(c('CAT', 'LGC')) ) ),
# Choose which value of previous variable dta should be filtered on
conditionalPanel("input.cbo_hsp_tblF !== 'NONE'",
uiOutput('ui_hsp_tbl_flt')
),
# Control the variable to order upon
uiOutput('ui_hsp_tbl_ord'),
# Control if the order is ASCending or DESCending
uiOutput('ui_hsp_tbl_ort'), br(),
# Choose if group above metric
selectInput('cbo_hsp_tblG', 'GROUPED BY:', choices = c('NONE', build_uiV(c('CAT', 'LGC', 'TMS')) ) ),
conditionalPanel("input.cbo_hsp_tblG !== 'NONE'",
# Choose how group above metric:
uiOutput('ui_hsp_tbl_grp'),
# Choose, if applicable, the reference (Total, Rows, Columns) for the above:
uiOutput('ui_hsp_tbl_gpr')
)
),
# Metric Controls for BARPLOT -------------------------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'barplot'",
# Choose Reference metric
selectInput('cbo_hsp_brpY', 'REFERENCE', choices = build_uiY('hsp') ),
# Show Percentage. Only if chosen reference is type 2 (measure)
uiOutput('ui_hsp_brp_pct'),
# Show Average. Only if type = 2 and pct, or 3 and 4 always. IF GROUPED, only when faceting
uiOutput('ui_hsp_brp_avg'),
# Choose a filter
selectInput('cbo_hsp_brpF', 'FILTERED BY:', choices = c('NONE', build_uiV(c('CAT', 'LGC')) ) ),
# Choose which value of previous variable dta should be filtered on
conditionalPanel("input.cbo_hsp_brpF !== 'NONE'",
uiOutput('ui_hsp_brp_flt')
),
# Choose if and how group above metric
selectInput('cbo_hsp_brpG', 'GROUPED BY:', choices = c('NONE', build_uiV(c('CAT', 'LGC', 'TMS')) ) ),
# Choose how grouping should be displayed
conditionalPanel("input.cbo_hsp_brpG !== 'NONE'",
uiOutput('ui_hsp_brp_grp'),
# Show/Hide zero/missing values when dodging
conditionalPanel("input.cbo_hsp_brp_grp == 'dodge'",
checkboxInput('chk_hsp_brp_sna', 'SHOW MISSING', value = FALSE )
),
# Faceting options
conditionalPanel("input.cbo_hsp_brp_grp == 'facet'",
checkboxInput('chk_hsp_brp_scl', 'ALIGN SCALES', value = TRUE ),
selectInput('cbo_hsp_brpG2', 'ADD VARIABLE:', choices = c('NONE', build_uiV(c('CAT', 'LGC', 'TMS')) ) ),
# Choose numbers of columns if faceting only once
conditionalPanel("input.cbo_hsp_brpG2 == 'NONE'",
sliderInput('sld_hsp_brp_fct', 'COLUMNS:', min = 1, max = 6, value = 2, ticks = FALSE)
)
)
)
),
# Metric Controls for BOXPLOT -------------------------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'boxplot'",
# Choose Reference metric
selectInput('cbo_hsp_bxpY', 'REFERENCE:', choices = build_uiV('NUM') ),
# Delete outliers
checkboxInput('chk_hsp_bxp_out', 'Remove Outliers', value = FALSE ),
conditionalPanel("input.chk_hsp_bxp_out === false",
# Force y-axis to show origin
checkboxInput('chk_hsp_bxp_yzr', 'SHOW ORIGIN', FALSE)
),
# Choose a filter
selectInput('cbo_hsp_bxpF', 'FILTERED BY:', choices = c('NONE', build_uiV(c('CAT', 'LGC')) ) ),
# Choose which value of previous variable dta should be filtered on
conditionalPanel("input.cbo_hsp_bxpF !== 'NONE'",
uiOutput('ui_hsp_bxp_flt')
),
# Add mean placeholder in boxes
checkboxInput('chk_hsp_bxp_avg', 'ADD MEAN POINT', FALSE),
# # Add st.dev line in boxes
# conditionalPanel("input.chk_hsp_bxp_avg",
# checkboxInput('chk_hsp_bxp_sdv', 'ADD SD LINE', value = FALSE)
# ),
# Choose if and how group above metric
selectInput('cbo_hsp_bxpG', 'GROUPED BY:', choices = c('NONE', build_uiV(c('CAT', 'LGC', 'TMS')) ) ),
# Choose how grouping should be displayed
conditionalPanel("input.cbo_hsp_bxpG !== 'NONE'",
radioButtons('rdb_hsp_bxp_grp', 'GROUPING TYPE:', choices = c('dodge', 'facet'), inline = TRUE ),
# Faceting options
conditionalPanel("input.rdb_hsp_bxp_grp == 'facet'",
selectInput('cbo_hsp_bxpG2', 'ADD VARIABLE:', choices = c('NONE', build_uiV(c('CAT', 'LGC', 'TMS')) ) ),
# Choose numbers of columns if faceting only once
conditionalPanel("input.cbo_hsp_bxpG2 == 'NONE'",
sliderInput('sld_hsp_bxp_fct', 'COLUMNS:', min = 1, max = 6, value = 2, ticks = FALSE)
)
)
)
),
# Metric Controls for HEATMAP -------------------------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'heatmap'",
# Choose the prefixed timespans to use as Y-coord
selectInput('cbo_hsp_hmpX2', 'TIMEPART:', choices = timeref, selected = 'month_st'),
# Choose Reference metric
selectInput('cbo_hsp_hmpY', 'REFERENCE:', choices = build_uiY('hsp') ),
# If Y is a measure, ask for value or percentage
uiOutput('ui_hsp_hmp_pct'),
# Rescale the values along the x.axis or y.axis
checkboxInput('chk_hsp_hmp_rvv', 'RESCALE VALUES', value = FALSE),
conditionalPanel("input.chk_hsp_hmp_rvv",
uiOutput('ui_hsp_hmp_rvc')
),
# Choose a filter
selectInput('cbo_hsp_hmpF', 'FILTERED BY:', choices = c('NONE', build_uiV(c('CAT', 'LGC')) ) ),
# Choose which value of previous variable dta should be filtered on
conditionalPanel("input.cbo_hsp_hmpF !== 'NONE'",
uiOutput('ui_hsp_hmp_flt')
),
# Choose if group above metric (only faceting in this case)
selectInput('cbo_hsp_hmpG', 'GROUPED BY:', choices = c('NONE', build_uiV(c('CAT', 'LGC')) ) ),
conditionalPanel("input.cbo_hsp_hmpG !== 'NONE'",
selectInput('cbo_hsp_hmpG2', 'ADD VARIABLE:', choices = c('NONE', build_uiV(c('CAT', 'LGC', 'TMS')) ) ),
# Choose numbers of columns if faceting only once
conditionalPanel("input.cbo_hsp_hmpG2 == 'NONE'",
sliderInput('sld_hsp_hmp_fct', 'COLUMNS:', min = 1, max = 6, value = 2, ticks = FALSE)
)
)
),
# Metric Controls for FUNNELPLOT -------------------------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'funnelplot'",
# Choose effect size (X)
selectInput('cbo_hsp_fnlX', 'EFFECT SIZE (X):', choices = c(build_uiY('fnl')) ),
# show reduced effect size
checkboxInput('chk_hsp_fnl_pcY', 'SHOW REDUCED EFFECT SIZE', FALSE),
# trimming effect sizes
uiOutput('ui_hsp_fnl_tmz'),
# Choose reference measure / metric
selectInput('cbo_hsp_fnlY', 'REFERENCE (Y)', choices = build_uiY('hsp', 2:3) ),
# Show Percentage. Only if chosen reference is type 2 (measure)
uiOutput('ui_hsp_fnl_pct'),
# trimming metric values
uiOutput('ui_hsp_fnl_tmt'),
# Choose a filter
selectInput('cbo_hsp_fnlF', 'FILTERED BY:', choices = c('NONE', build_uiV(c('CAT', 'LGC')) ) ),
# Choose which value of previous variable dta should be filtered on
conditionalPanel("input.cbo_hsp_fnlF !== 'NONE'",
uiOutput('ui_hsp_fnl_flt')
),
# overall average
checkboxInput('chk_hsp_fnl_avg', 'ADD AVERAGE LINE', TRUE),
# add funnel plot
uiOutput('ui_hsp_fnl_fnl'),
# funnel p-limits
conditionalPanel("input.chk_hsp_fnl_fnl",
selectInput('cbo_hsp_fnl_flm', 'CONTROL LIMITS:',
choices = funnel.defaults[['prob.tot']],
multiple = TRUE,
selected = funnel.defaults[['prob.sel']]
)
)
),
# Metric Controls for MAPS --------------------------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'maps'",
# Choose Area Metric
selectInput('cbo_hsp_mapY', 'AREA METRIC:', choices = c('NONE', build_uiY('map')) ),
conditionalPanel("input.cbo_hsp_mapY !== 'NONE'",
# Choose how to classify metric
selectInput('cbo_hsp_map_Ycl', 'CLASS METHOD:', choices = class.methods),
# Choose number of classes
sliderInput('sld_hsp_map_Ycn', 'NUMBER OF CLASSES:', min = 3, max = 9, value = 5, step = 1, ticks = FALSE),
# Choose a filter
selectInput('cbo_hsp_mapF', 'FILTERED BY:', choices = c('NONE', build_uiV(c('CAT', 'LGC')) ) ),
# Choose which value of previous variable dta should be filtered on
conditionalPanel("input.cbo_hsp_mapF !== 'NONE'",
uiOutput('ui_hsp_map_flt')
)
),
# Add Points
checkboxInput('chk_hsp_map_hsp', 'ADD POINTS', FALSE),
# Choose between icons or dots for plotting points
conditionalPanel("input.chk_hsp_map_hsp",
radioButtons('rdb_hsp_map_hsp', 'TYPE:', choices = c('Icons', 'Points'), inline = TRUE ),
# Choosing attributes/measures/metrics when Points are plotted
conditionalPanel("input.rdb_hsp_map_hsp == 'Points'",
selectInput('cbo_hsp_mapZ1', 'FILL MEASURE:', choices = c('NONE', build_uiV(c('NUM')) ) ),
conditionalPanel("input.cbo_hsp_mapZ1 !== 'NONE'",
selectInput('cbo_hsp_map_Z1c', 'CLASS METHOD:', choices = class.methods)
),
selectInput('cbo_hsp_mapZ2', 'SIZE MEASURE:', choices = c('NONE', build_uiV(c('NUM')) ) ),
conditionalPanel("input.cbo_hsp_mapZ2 !== 'NONE'",
selectInput('cbo_hsp_map_Z2c', 'CLASS METHOD:', choices = class.methods)
)
)
)
)
# END OF Metrics Controls -------------------------------------------------------------------------------------------
), hr(),
# OPTIONS ---------------------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_opt', 'Show/Hide OPTIONS', class = 'toggle-choices'),
hidden(
div(id = 'hdn_hsp_opt',
p(),
# Option Controls for TABLE ----------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'table'",
# Control the color for the background in the cells with the bars
colourpicker::colourInput('col_hsp_tbb', 'FILL COLOUR:', '#63B8FF', showColour = 'background'),
# Control the color for the font when cells are formatted
colourpicker::colourInput('col_hsp_tbf', 'FONT COLOUR:', 'black', showColour = 'background', palette = 'limited'),
# Control the divergent palette for the background in the INDEX column
selectInput('pal_hsp_tbl', 'PALETTE:', choices = lst.palette[['DIVERGING']], selected = 'Spectral' ),
checkboxInput('chk_hsp_tbl_rvc', 'REVERSE COLOURS', value = FALSE),
# Control the number of colours for the above divergent palette
sliderInput('sld_hsp_tbl_col', 'NUMBER OF QUANTILES:', min = 2, max = 10, value = 5, step = 1, ticks = FALSE)
# END OF TABLE Option Controls ---------------------------------------------------------------------------------------
),
# Option Controls for BARPLOT -------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'barplot'",
# GENERAL --------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_brp_gen', 'Show/Hide GENERAL', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_brp_gen',
p(),
# Plot Zoom
sliderInput('sld_hsp_brp_ggw', 'ZOOM:', min = 4, max = 10, value = 6.5, step = 0.5, ticks = FALSE),
# User decides how many units wants to see
uiOutput('ui_hsp_brp_cnt'),
# Force y-axis to show origin
checkboxInput('chk_hsp_brp_yzr', 'SHOW ORIGIN', TRUE),
# Text Size and Font family
sliderInput('sld_hsp_brp_xlz', 'TEXT SIZE:', min = 1, max = 15, value = 7, step = 0.5, ticks = FALSE),
selectInput('cbo_hsp_brp_ffm', 'FONT FAMILY:', choices = font.table, selected = 'Arial')
), hr()
), br(),
# AXIS --------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_brp_axs', 'Show/Hide AXIS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_brp_axs',
p(),
# Control the rotation of the axis labels
uiOutput('ui_hsp_brp_lbr'),
# Control the appearance of Axis Lines and Ticks, plus Plot Border
checkboxInput('chk_hsp_brp_xlx', 'ADD x-AXIS LINE', TRUE),
checkboxInput('chk_hsp_brp_xly', 'ADD y-AXIS LINE', TRUE),
checkboxInput('chk_hsp_brp_xtk', 'ADD AXIS TICKS', TRUE),
checkboxInput('chk_hsp_brp_plb', 'ADD PLOT BORDER', FALSE),
conditionalPanel("input.chk_hsp_brp_xlx || input.chk_hsp_brp_xly || input.chk_hsp_brp_xtk || input.chk_hsp_brp_plb",
sliderInput('sld_hsp_brp_xsz', 'SIZE:', min = 1, max = 5, value = 2, step = 0.5, ticks = FALSE),
colourpicker::colourInput('col_hsp_brp_xsc', 'COLOUR:', 'grey50', showColour = 'background')
),
# Add and Control the appearance of Axis Titles
checkboxInput('chk_hsp_brp_xlt', 'ADD AXIS TITLES', FALSE),
conditionalPanel("input.chk_hsp_brp_xlt",
sliderInput('sld_hsp_brp_xlt', 'FONT SIZE MULTIPLE:', min = 0, max = 100, value = 20, step = 5, ticks = FALSE, post = '%'),
selectInput('cbo_hsp_brp_xlt', 'FONT FACE:', choices = face.types, selected = 'bold')
)
), hr()
), br(),
# BACKGROUND --------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_brp_bkg', 'Show/Hide BACKGROUND', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_brp_bkg',
p(),
# Background color
colourpicker::colourInput('col_hsp_brp_bkg', 'BACKGROUND COLOUR:', 'white', showColour = 'background'),
# Grids
checkboxGroupInput('chg_hsp_brp_grd', 'ADD GRIDS', choices = c('Horizontal', 'Vertical'), inline = TRUE ),
conditionalPanel("input.chg_hsp_brp_grd.length > 0",
sliderInput('sld_hsp_brp_gdz', 'SIZE:', min = 0.5, max = 5, value = 2, step = 0.5, ticks = FALSE),
colourpicker::colourInput('col_hsp_brp_gdc', 'COLOUR:', 'grey50', showColour = 'background'),
selectInput('cbo_hsp_brp_gdt', 'TYPE:', choices = line.types, selected = 'dotted')
)
), hr()
), br(),
# BARS ------------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_brp_brs', 'Show/Hide BARS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_brp_brs',
p(),
# Control how bars are ordered
selectInput('cbo_hsp_brp_ord', 'ORDERING:', choices = c('Alpha (ASC)' = 1, 'Alpha (DESC)' = 2, 'Values (ASC)' = 3, 'Values (DESC)' = 4) ),
# Control if barplot is horizontal or vertical
radioButtons('rdb_hsp_brp_orn', 'ORIENTATION:', choices = c('Vertical', 'Horizontal'), inline = TRUE ),
# Choose colour / palette
uiOutput('ui_hsp_brp_col'),
conditionalPanel("typeof input.pal_hsp_brp !== 'undefined'",
checkboxInput('chk_hsp_brp_rvc', 'REVERSE COLOURS', value = FALSE)
),
# Control width of bars
sliderInput('sld_hsp_brp_baw', 'WIDTH:', min = 1, max = 10, value = 8, step = 0.5, ticks = FALSE),
# Add and customize bars' borders
checkboxInput('chk_hsp_brp_bdr', 'ADD BARS BORDER', FALSE),
conditionalPanel("input.chk_hsp_brp_bdr",
sliderInput('sld_hsp_brp_bow', 'SIZE:', min = 1, max = 15, value = 6, step = 1, ticks = FALSE),
colourpicker::colourInput('col_hsp_brp_boc', 'COLOUR:', 'black', showColour = 'background'),
selectInput('cbo_hsp_brp_bot', 'TYPE:', choices = line.types, selected = 'solid')
)
), hr()
), br(),
# LABELS IN BARS --------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_brp_lbl', 'Show/Hide LABELS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_brp_lbl',
p(),
# Add (if not grouped stack/fill), and customize value labels in bars (depends on labels IN/OUT and orientation H/V)
checkboxInput('chk_hsp_brp_lbl', 'ADD VALUE LABELS IN BARS', FALSE),
conditionalPanel("input.chk_hsp_brp_lbl",
sliderInput('sld_hsp_brp_lbz', 'LABELS FONT SIZE', min = 1, max = 4, value = 1.6, step = 0.2, ticks = TRUE),
radioButtons('rdb_hsp_brp_lbp', 'LABELS POSITION', choices = c('Inside', 'Outside'), inline = TRUE ),
# uiOutput('ui_hsp_brp_lbp'),
uiOutput('ui_hsp_brp_lbc')
)
), hr()
), br(),
# AVERAGE LINE ----------------------------------------------------------------------------------------------
conditionalPanel("input.chk_hsp_brp_avg",
a(id = 'tgl_hsp_brp_avg', 'Show/Hide AVERAGE LINE', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_brp_avg',
p(),
checkboxInput('chk_hsp_brp_avl', 'ADD VALUE', value = FALSE),
colourpicker::colourInput('col_hsp_brp_avc', 'COLOUR:', 'black', showColour = 'background'),
sliderInput('sld_hsp_brp_avz', 'SIZE:', min = 1, max = 8, value = 4, step = 0.5, ticks = FALSE),
selectInput('cbo_hsp_brp_avt', 'TYPE:', choices = line.types, selected = 'dotdash'),
sliderInput('sld_hsp_brp_avt', 'TRANSPARENCY:', min = 0, max = 10, value = 4, step = 1, ticks = FALSE)
)
), br()
)
# END OF BARS Option Controls ----------------------------------------------------------------------------------------
),
# Option Controls for BOXPLOT -------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'boxplot'",
# GENERAL --------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_bxp_gen', 'Show/Hide GENERAL', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_bxp_gen',
p(),
# Plot Zoom
sliderInput('sld_hsp_bxp_ggw', 'ZOOM:', min = 4, max = 10, value = 6.5, step = 0.5, ticks = FALSE),
# User decides how many units wants to see
uiOutput('ui_hsp_bxp_cnt'),
# Text Size and Font family
sliderInput('sld_hsp_bxp_xlz', 'TEXT SIZE:', min = 1, max = 15, value = 7, step = 0.5, ticks = FALSE),
selectInput('cbo_hsp_bxp_ffm', 'FONT FAMILY:', choices = font.table, selected = 'Arial')
), hr()
), br(),
# AXIS --------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_bxp_axs', 'Show/Hide AXIS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_bxp_axs',
p(),
# Control the rotation of the axis labels
uiOutput('ui_hsp_bxp_lbr'),
# Control the appearance of Axis Lines and Ticks, plus Plot Border
checkboxInput('chk_hsp_bxp_xlx', 'ADD x-AXIS LINE', TRUE),
checkboxInput('chk_hsp_bxp_xly', 'ADD y-AXIS LINE', TRUE),
checkboxInput('chk_hsp_bxp_xtk', 'ADD AXIS TICKS', TRUE),
checkboxInput('chk_hsp_bxp_plb', 'ADD PLOT BORDER', FALSE),
conditionalPanel("input.chk_hsp_bxp_xlx || input.chk_hsp_bxp_xly || input.chk_hsp_bxp_xtk || input.chk_hsp_bxp_plb",
sliderInput('sld_hsp_bxp_xsz', 'SIZE:', min = 1, max = 5, value = 2, step = 0.5, ticks = FALSE),
colourpicker::colourInput('col_hsp_bxp_xsc', 'COLOUR:', 'grey50', showColour = 'background')
),
# Add and Control the appearance of Axis Titles
checkboxInput('chk_hsp_bxp_xlt', 'ADD AXIS TITLES', FALSE),
conditionalPanel("input.chk_hsp_bxp_xlt",
sliderInput('sld_hsp_bxp_xlt', 'FONT SIZE MULTIPLE:', min = 0, max = 100, value = 20, step = 5, ticks = FALSE, post = '%'),
selectInput('cbo_hsp_bxp_xlt', 'FONT FACE:', choices = face.types, selected = 'bold')
)
), hr()
), br(),
# BACKGROUND --------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_bxp_bkg', 'Show/Hide BACKGROUND', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_bxp_bkg',
p(),
# Background color
colourpicker::colourInput('col_hsp_bxp_bkg', 'BACKGROUND COLOUR:', 'white', showColour = 'background'),
# Grids
checkboxGroupInput('chg_hsp_bxp_grd', 'ADD GRIDS', choices = c('Horizontal', 'Vertical'), inline = TRUE ),
conditionalPanel("input.chg_hsp_bxp_grd.length > 0",
sliderInput('sld_hsp_bxp_gdz', 'SIZE:', min = 0.5, max = 5, value = 2, step = 0.5, ticks = FALSE),
colourpicker::colourInput('col_hsp_bxp_gdc', 'COLOUR:', 'grey50', showColour = 'background'),
selectInput('cbo_hsp_bxp_gdt', 'TYPE:', choices = line.types, selected = 'dotted')
)
), hr()
), br(),
# BOXES ------------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_bxp_bxs', 'Show/Hide BOXES', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_bxp_bxs',
p(),
# Control how boxes are ordered
selectInput('cbo_hsp_bxp_ord', 'ORDERING:', choices = c('Alpha (ASC)' = 1, 'Alpha (DESC)' = 2, 'Median (ASC)' = 3, 'Median (DESC)' = 4) ),
# Control if boxplot is horizontal or vertical
radioButtons('rdb_hsp_bxp_orn', 'ORIENTATION:', choices = c('Vertical', 'Horizontal'), inline = TRUE ),
# Choose colour / palette
uiOutput('ui_hsp_bxp_col'),
conditionalPanel("typeof input.pal_hsp_bxp !== 'undefined'",
checkboxInput('chk_hsp_bxp_rvc', 'REVERSE COLOURS', value = FALSE)
),
# Control width of boxes
sliderInput('sld_hsp_bxp_bxw', 'WIDTH:', min = 1, max = 10, value = 8, step = 0.5, ticks = FALSE),
# Distance between boxes when grouped dodged
conditionalPanel("input.rdb_hsp_bxp_grp === 'dodge'",
sliderInput('sld_hsp_bxp_gdd', 'DISTANCE:', min = 1, max = 10, value = 8, step = 1, ticks = FALSE)
)
), hr()
), br(),
# LINES ------------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_bxp_lns', 'Show/Hide LINES', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_bxp_lns',
p(),
# Customize boxes' borders
sliderInput('sld_hsp_bxp_bbw', 'SIZE:', min = 1, max = 15, value = 6, step = 1, ticks = FALSE),
colourpicker::colourInput('col_hsp_bxp_boc', 'COLOUR:', 'black', showColour = 'background'),
selectInput('cbo_hsp_bxp_bbt', 'TYPE:', choices = line.types, selected = 'solid')
), hr()
), br(),
# OUTLIERS ----------------------------------------------------------------------------------------------
conditionalPanel("input.chk_tms_bxp_out === false",
a(id = 'tgl_hsp_bxp_out', 'Show/Hide OUTLIERS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_bxp_out',
p(),
conditionalPanel("input.rdb_hsp_bxp_grp !== 'dodge'",
colourpicker::colourInput('col_hsp_bxp_otf', 'FILL COLOUR:', 'black', showColour = 'background')
),
colourpicker::colourInput('col_hsp_bxp_otb', 'BORDER COLOUR:', 'black', showColour = 'background'),
sliderInput('sld_hsp_bxp_otz', 'SIZE:', min = 1, max = 10, value = 5, step = 1, ticks = FALSE),
sliderInput('sld_hsp_bxp_ott', 'TRANSPARENCY:', min = 0, max = 10, value = 4, step = 1, ticks = FALSE),
selectInput('cbo_hsp_bxp_out', 'SHAPE:', choices = point.shapes, selected = 21 )
)
), br()
),
# AVERAGE INBOX ----------------------------------------------------------------------------------------------
conditionalPanel("input.chk_hsp_bxp_avg",
a(id = 'tgl_hsp_bxp_avg', 'Show/Hide AVERAGE', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_bxp_avg',
p(),
colourpicker::colourInput('col_hsp_bxp_avc', 'COLOUR:', 'darkred', showColour = 'background'),
sliderInput('sld_hsp_bxp_avz', 'SIZE:', min = 1, max = 10, value = 5, step = 1, ticks = FALSE),
selectInput('cbo_hsp_bxp_avs', 'SHAPE:', choices = point.shapes, selected = 21 ),
# selectInput('cbo_hsp_bxp_avl', 'LINETYPE:', choices = line.types, selected = 'dotdash'),
sliderInput('sld_hsp_bxp_avt', 'TRANSPARENCY:', min = 0, max = 10, value = 4, step = 1, ticks = FALSE)
)
), br()
)
# END OF BOXES Option Controls ---------------------------------------------------------------------------------------
),
# Option Controls for HEATMAP -------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'heatmap'",
# GENERAL ---------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_hmp_gen', 'Show/Hide GENERAL', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_hmp_gen',
p(),
# Plot Zoom
sliderInput('sld_hsp_hmp_ggw', 'ZOOM:', min = 4, max = 10, value = 6.5, step = 0.5, ticks = FALSE),
# User decides how many units wants to see
uiOutput('ui_hsp_hmp_cnt'),
# Text Size and Font family
sliderInput('sld_hsp_hmp_xlz', 'TEXT SIZE:', min = 1, max = 15, value = 7, step = 0.5, ticks = FALSE),
selectInput('cbo_hsp_hmp_ffm', 'FONT FAMILY:', choices = font.table, selected = 'Arial')
), hr()
), br(),
# AXIS ------------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_hmp_axs', 'Show/Hide AXIS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_hmp_axs',
p(),
# Control the rotation of the axis labels
uiOutput('ui_hsp_hmp_lbr'),
# Axis Ticks, see boxes border for size and color
checkboxInput('chk_hsp_hmp_xtk', 'ADD AXIS TICKS', TRUE),
# Add and Control the appearance of Axis Titles
checkboxInput('chk_hsp_hmp_xlt', 'ADD AXIS TITLES', FALSE),
conditionalPanel("input.chk_hsp_hmp_xlt",
sliderInput('sld_hsp_hmp_xlt', 'FONT SIZE MULTIPLE:', min = 0, max = 100, value = 20, step = 5, ticks = FALSE, post = '%'),
selectInput('cbo_hsp_hmp_xlt', 'FONT FACE:', choices = face.types, selected = 'bold')
)
), hr()
), br(),
# BOXES -----------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_hmp_bxs', 'Show/Hide BOXES', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_hmp_bxs',
p(),
# Choose palette
selectInput('pal_hsp_hmp', 'FILL PALETTE:', choices = lst.palette, selected = 'YlGnBu'),
# Reverse the colours in palette
checkboxInput('chk_hsp_hmp_rvc', 'REVERSE COLOURS', value = FALSE),
# Transparency
sliderInput('sld_hsp_hmp_trp', 'TRANSPARENCY:', min = 0, max = 7, value = 3, step = 0.5, ticks = FALSE),
# Show/Hide zero/missing values when dodging
checkboxInput('chk_hsp_hmp_sna', 'SHOW MISSING', value = FALSE ),
# NAs boxes' colour
conditionalPanel("input.chk_hsp_hmp_sna",
colourpicker::colourInput('col_hsp_hmp_nas', 'EMPTY BOXES COLOUR:', 'grey62', showColour = 'background')
),
# Control how centres (X-geo) are ordered
selectInput('cbo_hsp_hmp_ord', 'ORDERING:', choices = c('Alpha (ASC)' = 1, 'Alpha (DESC)' = 2, 'Metric (ASC)' = 3, 'Metric (DESC)' = 4) ),
# Put Centres on vertical Axis
checkboxInput('chk_hsp_hmp_orn', 'CENTRES ON Y-AXIS', value = FALSE ),
# Option to make boxes squared (NOTE: coord_flip DOES NOT WORK WITH coord_equal)
conditionalPanel("input.chk_hsp_hmp_orn === false",
checkboxInput('chk_hsp_hmp_sqb', 'MAKE BOXES SQUARED', value = FALSE)
),
# Customize boxes' borders
sliderInput('sld_hsp_hmp_bbz', 'BORDER SIZE:', min = 1, max = 15, value = 6, step = 1, ticks = FALSE),
colourpicker::colourInput('col_hsp_hmp_bbc', 'BORDER COLOUR:', 'black', showColour = 'background'),
selectInput('cbo_hsp_hmp_bbt', 'BORDER TYPE:', choices = line.types, selected = 'solid')
)
)
# END OF TILES Option Controls ---------------------------------------------------------------------------------------
),
# Option Controls for FUNNELPLOT ----------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'funnelplot'",
# GENERAL --------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_fnl_gen', 'Show/Hide GENERAL', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_fnl_gen',
p(),
# Plot Zoom
sliderInput('sld_hsp_fnl_ggw', 'ZOOM:', min = 4, max = 10, value = 6.5, step = 0.5, ticks = FALSE),
# Text Size and Font family
sliderInput('sld_hsp_fnl_xlz', 'TEXT SIZE:', min = 1, max = 15, value = 7, step = 0.5, ticks = FALSE),
selectInput('cbo_hsp_fnl_ffm', 'FONT FAMILY:', choices = font.table, selected = 'Arial')
), hr()
), br(),
# AXIS --------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_fnl_axs', 'Show/Hide AXIS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_fnl_axs',
p(),
# Control the appearance of Axis Lines and Ticks, plus Plot Border
checkboxInput('chk_hsp_fnl_xlx', 'ADD x-AXIS LINE', TRUE),
checkboxInput('chk_hsp_fnl_xly', 'ADD y-AXIS LINE', TRUE),
checkboxInput('chk_hsp_fnl_xtk', 'ADD AXIS TICKS', TRUE),
checkboxInput('chk_hsp_fnl_plb', 'ADD PLOT BORDER', FALSE),
conditionalPanel("input.chk_hsp_fnl_xlx || input.chk_hsp_fnl_xly || input.chk_hsp_fnl_xtk || input.chk_hsp_fnl_plb",
sliderInput('sld_hsp_fnl_xsz', 'SIZE:', min = 1, max = 5, value = 2, step = 0.5, ticks = FALSE),
colourpicker::colourInput('col_hsp_fnl_xsc', 'COLOUR:', 'grey50', showColour = 'background')
),
# Add and Control the appearance of Axis Titles
checkboxInput('chk_hsp_fnl_xlt', 'ADD AXIS TITLES', FALSE),
conditionalPanel("input.chk_hsp_fnl_xlt",
sliderInput('sld_hsp_fnl_xlt', 'FONT SIZE MULTIPLE:', min = 0, max = 100, value = 20, step = 5, ticks = FALSE, post = '%'),
selectInput('cbo_hsp_fnl_xlt', 'FONT FACE:', choices = face.types, selected = 'bold')
)
), hr()
), br(),
# BACKGROUND --------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_fnl_bkg', 'Show/Hide BACKGROUND', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_fnl_bkg',
p(),
# Background color
colourpicker::colourInput('col_hsp_fnl_bkg', 'BACKGROUND COLOUR:', 'white', showColour = 'background'),
# Grids
checkboxGroupInput('chg_hsp_fnl_grd', 'ADD GRIDS', choices = c('Horizontal', 'Vertical'), inline = TRUE ),
conditionalPanel("input.chg_hsp_fnl_grd.length > 0",
sliderInput('sld_hsp_fnl_gdz', 'SIZE:', min = 0.5, max = 5, value = 2, step = 0.5, ticks = FALSE),
colourpicker::colourInput('col_hsp_fnl_gdc', 'COLOUR:', 'grey50', showColour = 'background'),
selectInput('cbo_hsp_fnl_gdt', 'TYPE:', choices = line.types, selected = 'dotted')
)
), hr()
), br(),
# POINTS -------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_fnl_pnt', 'Show/Hide POINTS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_fnl_pnt',
p(),
sliderInput('sld_hsp_fnl_pnz', 'SIZE:', min = 1, max = 10, value = 3, step = 1, ticks = FALSE),
colourpicker::colourInput('col_hsp_fnl_pnf', 'FILL COLOUR:', 'black', showColour = 'background'),
colourpicker::colourInput('col_hsp_fnl_pnc', 'BORDER COLOUR:', 'black', showColour = 'background'),
sliderInput('sld_hsp_fnl_pno', 'OPACITY:', min = 1, max = 10, value = 7, step = 1, ticks = FALSE),
selectInput('cbo_hsp_fnl_pnh', 'SHAPE:', choices = point.shapes, selected = 21 )
), hr()
), br(),
# LABELS -------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_fnl_lbl', 'Show/Hide LABELS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_fnl_lbl',
p(),
sliderInput('sld_hsp_fnl_lbz', 'TEXT SIZE:', min = 1, max = 10, value = 4, step = 0.5, ticks = FALSE),
colourpicker::colourInput('col_hsp_fnl_lbc', 'TEXT COLOUR:', 'black', showColour = 'background'),
sliderInput('sld_hsp_fnl_lbo', 'TEXT OPACITY:', min = 1, max = 10, value = 6, step = 1, ticks = FALSE),
colourpicker::colourInput('col_hsp_fnl_sgc', 'SEGMENT COLOUR:', 'black', showColour = 'background'),
sliderInput('sld_hsp_fnl_sgz', 'SEGMENT SIZE:', min = 1, max = 10, value = 4, step = 0.5, ticks = FALSE),
sliderInput('sld_hsp_fnl_sgt', 'SEGMENT OPACITY:', min = 0, max = 10, value = 6, step = 1, ticks = FALSE),
sliderInput('sld_hsp_fnl_sgm', 'MIN LENGTH:', min = 0, max = 5, value = 0.5, step = 0.1, ticks = FALSE),
checkboxInput('chk_hsp_fnl_sgr', 'ADD ARROW', value = FALSE)
), hr()
), br(),
# AVERAGE LINE ----------------------------------------------------------------------------------------------
conditionalPanel("input.chk_hsp_fnl_avg",
a(id = 'tgl_hsp_fnl_avg', 'Show/Hide AVERAGE LINE', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_fnl_avg',
p(),
checkboxInput('chk_hsp_fnl_avl', 'ADD VALUE', value = FALSE),
colourpicker::colourInput('col_hsp_fnl_avc', 'COLOUR:', 'red', showColour = 'background'),
sliderInput('sld_hsp_fnl_avz', 'SIZE:', min = 1, max = 8, value = 4, step = 0.5, ticks = FALSE),
selectInput('cbo_hsp_fnl_avt', 'TYPE:', choices = line.types, selected = 'dotdash')
)
), br()
),
# FUNNEL LIMITS ----------------------------------------------------------------------------------------------
conditionalPanel("input.chk_hsp_fnl_fnl",
a(id = 'tgl_hsp_fnl_fnl', 'Show/Hide FUNNEL LIMITS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_fnl_fnl',
p(),
sliderInput('sld_hsp_fnl_fnz', 'SIZE:', min = 1, max = 8, value = 4, step = 0.5, ticks = FALSE),
selectInput('cbo_hsp_fnl_fnc', 'COLOUR(S):',
choice = funnel.defaults[['col.tot']], multiple = TRUE,
selected = funnel.defaults[['col.sel']]
),
selectInput('cbo_hsp_fnl_fnt', 'TYPE(S):',
choices = funnel.defaults[['type.tot']], multiple = TRUE,
selected = funnel.defaults[['type.sel']]
),
checkboxInput('chk_hsp_fnl_fnv', 'ADD VALUE(S)', value = FALSE)
)
), br()
)
# END OF POINTS Option Controls -------------------------------------------------------------------------------------------------
),
# Option Controls for MAP ------------------------------------------------------------------------------------------------
conditionalPanel("input.tabs_hsp == 'maps'",
# GENERAL --------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_map_gen', 'Show/Hide GENERAL', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_map_gen',
p(),
# Choose background tile
selectInput('cbo_hsp_map_tls', 'TILES:', choices = c(tiles.list), selected = tile.ini),
conditionalPanel("input.cbo_hsp_mapY !== 'NONE'",
# Add Legend
checkboxInput('chk_hsp_map_lgn', 'ADD LEGEND', TRUE),
conditionalPanel("input.chk_hsp_map_lgn",
# Legend Position
selectInput('cbo_hsp_map_lgn', 'POSITION:', choices = c('bottomright', 'bottomleft', 'topleft', 'topright') )
)
)
), hr()
), br(),
# POLYGONS -------------------------------------------------------------------------------------------------
conditionalPanel("input.cbo_hsp_mapY !== 'NONE'",
a(id = 'tgl_hsp_map_pol', 'Show/Hide AREAS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_map_pol',
p(),
# Palette IF any metric is chosen, otherwise colour
selectInput('pal_hsp_mapY', 'FILL PALETTE:', choices = lst.palette, selected = 'Blues'),
conditionalPanel("typeof input.pal_hsp_mapY !== 'undefined'",
checkboxInput('chk_hsp_mapY_rvc', 'REVERSE COLOURS', value = FALSE)
),
# Transparency
sliderInput('sld_hsp_mapY_trp', 'TRANSPARENCY:', min = 0, max = 10, value = 3, step = 0.5, ticks = FALSE),
# Borders Size and colour
colourpicker::colourInput('col_hsp_mapY_bcl', 'BORDER COLOUR:', 'black', showColour = 'background'),
sliderInput('sld_hsp_mapY_bsz', 'BORDER SIZE:', min = 1, max = 20, value = 4, step = 1, ticks = FALSE)
), hr()
), br()
),
# POINTS ---------------------------------------------------------------------------------------------------
conditionalPanel("input.chk_hsp_map_hsp",
a(id = 'tgl_hsp_map_pnt', 'Show/Hide POINTS', class = 'toggle-choices-sub'),
hidden(
div(id = 'hdn_hsp_map_pnt',
p(),
# Palette IF any metric is chosen, otherwise colour
uiOutput('ui_hsp_mapZ_col'),
conditionalPanel("typeof input.pal_hsp_mapZ !== 'undefined'",
checkboxInput('chk_hsp_mapZ_rvc', 'REVERSE COLOURS', value = FALSE)
),
# Transparency
sliderInput('sld_hsp_mapZ_trp', 'TRANSPARENCY:', min = 0, max = 10, value = 3, ticks = FALSE),
# Shape
selectInput('cbo_hsp_mapZ_shp', 'SHAPE:', choices = point.shapes, selected = 21 )
), hr()
), br()
)
# END OF MAPS Option Controls ----------------------------------------------------------------------------------------
)
# END OF Option Controls -------------------------------------------------------------------------------------------------
)), hr(),
# DOWNLOAD --------------------------------------------------------------------------------------------------------------------
a(id = 'tgl_hsp_dwn', 'Show/Hide DOWNLOAD', class = 'toggle-choices'),
hidden(
div(id = 'hdn_hsp_dwn',
p(),
# Common input for filename, needs a UI to change default
uiOutput('ui_hsp_dwn'),
# Download dataset for TABLE
conditionalPanel("input.tabs_hsp == 'table'",
textOutput('out_hsp_dwn'), br(),
downloadButton('dwn_hsp_dta', label = btndwn.text[1], class = 'btndwn')
),
# Download dataset behind charts and map
conditionalPanel("input.tabs_hsp !== 'table'",
downloadButton('dwn_hsp_tbl', label = btndwn.text[5], class = 'btndwn')
),
# Download static JPG / interactive HTML for MAP
conditionalPanel("input.tabs_hsp == 'maps'",
downloadButton('dwn_hsp_mpp', label = btndwn.text[3], class = 'btndwn'),
downloadButton('dwn_hsp_mph', label = btndwn.text[4], class = 'btndwn')
),
# Download chart for remaining substabs
conditionalPanel("input.tabs_hsp !== 'table' && input.tabs_hsp !== 'maps'",
# Optional Caption
checkboxInput('chk_hsp_cpt', 'ADD CAPTION', value = FALSE ),
conditionalPanel("input.chk_hsp_cpt",
textInput('txt_hsp_cpt', '', value = plt.caption)
),
# Download Chart
downloadButton('dwn_hsp_plt', label = btndwn.text[2], class = 'btndwn')
)
)), hr(),
width = 2
),
# MAIN PANEL --------------------------------------------------------------------------------------------------------------------
mainPanel(
tabsetPanel(id = 'tabs_hsp',
tabPanel('table', icon = icon('table'),
htmlOutput('out_hsp_tbx'), withSpinner( dataTableOutput('out_hsp_tbl') )
),
tabPanel('barplot', icon = icon('bar-chart'),
htmlOutput('out_hsp_brx'), withSpinner( ggiraphOutput('out_hsp_brp') )
),
tabPanel('boxplot', icon = icon('object-align-vertical', lib = 'glyphicon'),
htmlOutput('out_hsp_bxx'), withSpinner( ggiraphOutput('out_hsp_bxp') )
),
tabPanel('heatmap', icon = icon('equalizer', lib = 'glyphicon'),
htmlOutput('out_hsp_hmx'), withSpinner( ggiraphOutput('out_hsp_hmp') )
),
tabPanel('funnelplot', icon = icon('space-shuttle'),
htmlOutput('out_hsp_scx'), withSpinner( ggiraphOutput('out_hsp_fnl') ), hr(),
fluidRow(
column(6,
# Display the centre code(s) of the selected dot(s)
textOutput('out_hsp_sel'),
# Button to reset the complete selection (dots could be unselected one by one)
actionButton('btn_hsp_fnl_rst', 'Reset selection')
),
# Everything below should be displayed ONLY IF at least one dot is selected
# Time period
column(3, uiOutput('ui_hsp_scl_flt') ),
column(3,
# If checked, display an additional line being the TOTAL UK
uiOutput('ui_hsp_scl_tuk'),
# If checked the metric is calculated on all records as a single entity, only if selection multiple dots
uiOutput('ui_hsp_scl_agg')
)
),
br(), br(),
# Display the time series
withSpinner( dygraphOutput('out_hsp_scl') ), hr(),
# Should display also the table with all the individual records related to the selected dot(s) ?
uiOutput('ui_hsp_fnl_tbl'),
# IF the previous has been checked:
# Choose which fields to display, code and day of procedure are always displayed
uiOutput('ui_hsp_sct_flt'),
# Display the table
dataTableOutput('out_hsp_sct'), hr()
),
tabPanel('maps', icon = icon('globe', lib = 'glyphicon'),
htmlOutput('out_hsp_mpx'), withSpinner( leafletOutput('out_hsp_map', width = '100%', height = 800) )
)
)
)
)
Comments
0 B
|👍
/👎
0 B
|👍
/👎