`Meta-analysis app` <- div(icon("cloudsmith", lib = "font-awesome"),
'Meta-analysis', span(tags$sub('V.1.0')),
style = 'display:inline-block;vertical-align:center;color:skyblue')
ui <-
# auth0::auth0_ui(
navbarPage(title = `Meta-analysis app`,
# useShinyjs(),
windowTitle = 'Meta-analysis app',
inverse = T,
# logoutButton(),
# Home ----
tabPanel('Home', icon = icon("home", lib = "glyphicon"),
h1(tags$b(tags$em('Meta-analysis app'))),
h3('Conduct meta-analysis and create high quality visualisation plots'),
hr(),
{sidebarLayout(
# sidebar panel ----
{
sidebarPanel(
width = 3,
h3(tags$b('About')),
tags$blockquote(p(style="text-align;",
"The", strong(tags$em("Meta-analysis app & MAAS package")), "allow you to conduct metaanalysis for different summary measures like pooled mean, odds ratio (OR), correlation (COR), proportion (Prop), weighted or standardized mean diference (WMD, SMD).")),
tags$b(hr()),
h3(tags$b('Found a bug?')),
tags$blockquote(h4('Please',a(href = 'mailto:ibrahim_hassan12@yahoo.com', 'email me')))
)
},
# main panel ----
{mainPanel(
fluidRow(
column(8,
h3(tags$b('Quick start')),
tags$ul(
h4(tags$li('To ensure that this app works as expected, the uploaded datasets must follow a certain format.')),
h4(tags$li('First import Data and get it cleaned in "Data cleaning" tab.')),
h4(tags$li('Then, go to the tab corresponding to your effect size of interest!'))),#br(),),
h3(tags$b('Notes')),
tags$ul(
h4(tags$li('If you go to the wrong tab it will get an', span(tags$b('Error!'),style= 'color:red'))),
h4(tags$li('If you have no data you can still explore with the', span(tags$b('predefined datasets!'),style= 'color:blue')))),
br(),
h4(tags$b('Excel example datasets/templates')),
div(style="display: inline-block;vertical-align:center;width:130px;height:40px",
downloadButton('exMEAN','Mean dataset')),
div(style="display: inline-block;vertical-align:center;width:130px;height:40px",
downloadButton('exSMD','SMD dataset')),
div(style="display: inline-block;vertical-align:center;width:130px;height:40px",
downloadButton('exOR','OR dataset')), br(),
div(style="display: inline-block;vertical-align:center;width:168px;height:40px",
downloadButton('exCOR','Correlation dataset')),
div(style="display: inline-block;vertical-align:center;width:168px;height:40px",
downloadButton('exProp','Proportion dataset')),
),
column(4)
)
)}
)},
),
# tab panel 1: loading data ----
tabPanel('Load data',icon = icon("table", lib = "font-awesome"),#useShinyjs(),
{
sidebarLayout(
# Sidebar panel for inputs 2----
sidebarPanel(shinyFeedback::useShinyFeedback(),
style='width:6000;overflow-x: scroll;height:590px;overflow-y: scroll;',
#width:800;overflow-x: scroll;
# Input: Select a file ---
fileInput(
"file1", "Choose file (csv/ xlsx/ xls)", multiple = FALSE,
accept = c("text/csv","text/comma-separated-values,text/plain",".csv",'.xlsx','.xls')),
# edit column names:
# textAreaInput('cols', 'List of column names',height = "100px", NULL),
# Horizontal line ---
tags$hr(),
# Input: Checkbox if file has header ---
#checkboxInput("header", strong("Header"), TRUE),
# Input: Checkbox if file has header ---
checkboxInput("Colname", strong("Column name"), TRUE),
# Skip
#numericInput(inputId = 'Skip',strong('Skip'),0),
div(
style="display: inline-block;vertical-align:top; width: 90px;",
numericInput(inputId = 'Skip',strong('Skip'),0),
textOutput("positiveskip")
),
# sheet number:
#numericInput(inputId = 'sheet', 'Sheet( xlsx/xls only)', 1),
div(
style="display: inline-block;vertical-align:top; width: 140px;",
numericInput(inputId = 'sheet',label = 'Sheet( xlsx/xls only)', 1),
textOutput("positivesheet")
),
# Number of rows
div(style="display: inline-block;vertical-align:top; width: 123px;",
numericInput('nmax', 'Number of rows', 30)),
# Input: Select number of rows to display ---
div(
style="display: inline-block;vertical-align:top; width: 170px;",
radioButtons("disp", "Display", inline = T,
choices = c(Head = "head",
All = "all"),
selected = "head")
),
# Delete rows
selectInput('delr','Delecte rows',selected = '', choices = c(1:100), multiple = T),
# Delete columns
selectInput('delc','Delete columns',selected = '', choices = c(1:100), multiple = T),
# Delete rows number:
# div(style="display: inline-block;vertical-align:top;width:366px;height: 58px;",
# textInput(inputId = 'delr','Delete rows','', placeholder = '1,2,3')),
#helpText('In the form of:', strong('1,2,3,...etc')),
# Delete Colum number:
# div(style="display: inline-block;vertical-align:top;width:366px;height: 58px;",
# textInput(inputId = 'delc','Delete columns','', placeholder='1,2,3')),
# helpText('In the form of:', strong('1,2,3,...etc')),
# Input: Select separator ---
radioButtons("sep", "Separator", inline = T,
choices = c(Comma = ",",
Semicolon = ";",
Tab = "\t"),
selected = ","),
# Input: Select quotes ---
radioButtons("quote", "Quote", inline = T,
choices = c(None = "",
'Double Quote ( " )' = '"',
"Single Quote ( ' )" = "'"),
selected = '"'),
# Horizontal line ---
tags$hr()
),
# Main panel for displaying outputs ----
mainPanel(
#h3('Tables'),
style='width:800;overflow-x: scroll;height:590px;overflow-y: scroll;',
# Output: Data file ---
tabsetPanel(
type = "pills",
tabPanel('Data cleaning',
tableOutput('cleaneddata')
),
tabPanel("Mean",
navbarPage("Components",
tabPanel("Data table",tableOutput("Meant")),
tabPanel("Summary",verbatimTextOutput("Meansummarydata"))
)
),
tabPanel("MD/SMD",
navbarPage("Components",
tabPanel("Data table",tableOutput("SMDt")),
tabPanel("Summary",verbatimTextOutput("SMDsummarydata"))
)
),
tabPanel("Correlation",
navbarPage("Components",
tabPanel("Data table",tableOutput("CORt")),
tabPanel("Summary",verbatimTextOutput("CORsummarydata"))
)
),
tabPanel("Proportion",
navbarPage("Components",
tabPanel("Data table",tableOutput("Propt")),
tabPanel("Summary",verbatimTextOutput("Propsummarydata"))
)
),
tabPanel("OR",
navbarPage("Components",
tabPanel("Data table",tableOutput("ORt")),
tabPanel("Summary",verbatimTextOutput("ORsummarydata"))
)
)
)
)
)
}
),
# tab panel 2: Results ----
tabPanel('Results', icon = icon("chart-bar", lib = "font-awesome"),type = 'pills',
{
tabsetPanel( type = 'pills',
# Mean panel ----
tabPanel('Mean',
{sidebarLayout(
# Sidebar panel ----
{
sidebarPanel(
#style = "position:fixed;width:inherit;height:550px;overflow-y: scroll;",
style = 'width:6000;overflow-x: scroll;height:550px;overflow-y: scroll;',
# Meta-analysis options: ----
h4(tags$b('Model options')),
# Summary measure:
radioButtons('MEANsm', 'Summary measure', selected = 'MRAW',
choices = c('MRAW', 'MLN'), inline = TRUE),
h5(tags$b('Model type')),
div(style="display: inline-block;vertical-align:top;width:130px",
checkboxInput('Meanrandom', 'Random model', T)),
div(style="display: inline-block;vertical-align:top;",
checkboxInput('Meanfixed', 'Fixed model', F)),
# Method tau:
{
selectInput(
inputId = 'MEANmethodtau', selected = 'DL',
label = span('Method of between-study variance τ',tags$sup('2'),'and its square root τ.'),
choices = c(
`DerSimonian-Laird estimator (DL)`= "DL",
`Paule-Mandel estimator (PM)` = "PM",
`Restricted maximum-likelihood estimator (REML)` = "REML",
`Maximum-likelihood estimator (ML)`="ML",
`Hunter-Schmidt estimator (HS)` = "HS",
`Sidik-Jonkman estimator (SJ)` = "SJ",
`Hedges estimator (HE)` ="HE",
`Empirical Bayes estimator (EB)`="EB"))
},
checkboxInput('MEANbackTfor', 'Backtransform (work with MLN)', TRUE),
selectInput('MEANsubgroup', 'Subgroup analysis by:', selected = NULL,
choices = c('')),
hr(),
# Forest plot options ----
h4(tags$b('Forest plot')),
selectInput('MEANsortvar', 'Sort by:', selected = 'NULL',
choices = c(`Not sorted`='NULL',"n","mean", "sd","TE","seTE" )),
# forest plot labels:
textInput('MEANtitleforest', 'Title', 'Forest plot'),
# Title offset vertical:
div(style="display: inline-block;vertical-align:top; width: 177px;",
sliderInput('MEANVtitleoffset', 'Vertical Title offset', 0.95, min = 0.6, max = 1)),
# Title offset horizontal:
div(style="display: inline-block;vertical-align:top; width: 177px;",
sliderInput('MEANHtitleoffset', 'Horizontal Title offset', 0.5, min = 0, max = 1)),
# Mean colgap:
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('MEANcolgap', 'Colgap limit', 1 , step = 0.2)),
# X-axis limit:
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('minMEANxlim', 'min x-axis', 0)),
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('maxMEANxlim', 'max x-axis', 100)),
helpText('Colgap: in mm or cm or inch'),
# left columns:
selectInput('MEANlftclm', 'Columns on the Left', multiple = T,
selected = c('studlab', 'n', 'mean', 'sd'),
choices = c('studlab', 'n', 'mean', 'sd',
"effect","ci", "w.random", 'pval')),
# left labs:
textInput('MEANlftlabl', 'Labels on the Left',
c("Study, N, Mean, SD")),
# Right columns:
selectInput('MEANrghtclm', 'Columns on the Right', multiple = T,
selected = c("effect","ci", "w.random"),
choices = c('studlab', 'n', 'mean', 'sd',
"effect","ci", "w.random", 'pval')),
# Right labs:
textInput('MEANrghtlabl', 'Labels on the Right',
c("")),
helpText('If you changed the left columns you change the labels as well'),
# left labs:
# textInput('MEANlftlabl', 'Labels on the left',c("Study, N, Mean, SD")),
# textInput('MEANlftclm', 'Columns on the left',c("studlab, n, mean, sd")),
# helpText('If you changed the left columns you change the labels as well'),
# modify your plot colors:
h5(tags$b('Colors')),
div(style="display:inline-block;vertical-align:top;width:125px;",
colourInput('MEANcolFStud', 'Study color',value = 'grey')),
div(style="width: 125px;",
colourInput('MEANcolFdiamond', 'Diamond color', "deepskyblue2")),
div(style="display:inline-block;vertical-align:top;width:125px;",
colourInput('MEANcolFpred', 'Prediction interval', 'red')),
sliderInput(inputId = 'MEANH', 'Forest plot Height', 700, min = 0 ,max = 2000),
sliderInput(inputId = 'MEANW', 'Forest plot Width', 800, min = 600 , max = 1400),
sliderInput(inputId = 'MEANRes', 'Forest plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadMEANforestplot", "Download Forest plot"),
# Horizontal line ---
tags$hr(),
# Funnel plot options ----
h4(tags$b('Funnel plot')),
textInput('MEANfunneltitle','Title','Funnel plot'),
# Xlim funnel
# div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
# numericInput('minMEANxlimp', 'min x-axis', min(numeric()))),
# div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
# numericInput('maxMEANxlimp', 'max x-axis', max(numeric()))),
# Study size
div(style="display: inline-block;vertical-align:top;width: 90px;",
numericInput('MEANfunnelcex','Study size',2, step = 0.2)),
# colors
div(style="display: inline-block;vertical-align:top; width: 110px;",
colourpicker::colourInput('MEANfunnelstudy','Study color','grey15')),
div(style="display: inline-block;vertical-align:top; width: 120px;",
colourpicker::colourInput('MEANfunnelbg','Background color','gray94')),
sliderInput(inputId = 'MEANHp', 'Funnel plot Height', 500, min = 400 ,max = 1000),
sliderInput(inputId = 'MEANWp', 'Funnel plot Width', 600, min = 400 ,max = 1000),
sliderInput(inputId = 'MEANResp', 'Funnel plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadMEANfunnelplot", "Download Funnel plot"),
tags$hr(),
# Drapery plot ----
h4(tags$b('Drapery plot')),
textInput('MEANDraperytitle','Title','Drapery plot'),
# Xlim drapery
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('minMEANxlimd', 'min x-axis', -5)),
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('maxMEANxlimd', 'max x-axis', 150)),
sliderInput(inputId = 'MEANHd', 'Drapery plot Height', 525, min = 400 ,max = 1000),
sliderInput(inputId = 'MEANWd', 'Drapery plot Width', 850, min = 400 ,max = 1000),
sliderInput(inputId = 'MEANResd', 'Drapery plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadMEANDraperyplot", "Download Drapery plot")
)},
# main panel ----
{ mainPanel(
tabsetPanel(
tabPanel('Model summary',
verbatimTextOutput('Mean.model')
),
tabPanel('Forest plot',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
uiOutput('MEANforestplot')),
tabPanel("Drapery plot",uiOutput('MEANdraperyplot')),
tabPanel('Funnel plot',
uiOutput('MEANfunnelplot'),
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;'
),
tabPanel('Publication bias tests',
# h5(tags$b('Publication bias (Egger test)')),
# verbatimTextOutput('MEANpubBias')
h3('Egger\'s test'),
uiOutput("Meanbias")
),
tabPanel('Trim and fill',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
checkboxInput('MEANTF','Trim & fill analysis',FALSE),
conditionalPanel(
condition = 'input.MEANTF == true',
checkboxGroupInput('MEANtrimfill', 'Please choose panel options',
inline = T, selected = '',
choices = c("Model","Forest","Funnel","Drapery"))),
conditionalPanel(
condition= c("input.MEANtrimfill.includes('Model')"),
verbatimTextOutput('MEANtrimfillmodel')
),
conditionalPanel(
condition="input.MEANtrimfill.includes('Forest')",
plotOutput('MEANtrimfillforest')
),
conditionalPanel(
condition="input.MEANtrimfill.includes('Funnel')",
plotOutput('MEANtrimfillfunnel')
),
conditionalPanel(
condition="input.MEANtrimfill.includes('Drapery')",
plotOutput('MEANtrimfilldrapery')
)
)
)
)
}
)
}
),
# MD/SMD panel ----
tabPanel('MD/SMD',
{
sidebarLayout(
# sidebar panel ----
{
sidebarPanel(
#style = "position:fixed;width:inherit;height:550px;overflow-y: scroll;",
style = 'width:6000;overflow-x: scroll;height:550px;overflow-y: scroll;',
# Meta-analysis options ----
h4(tags$b('Model options')),
# Summary measure:
radioButtons('SMDsm', 'Summary measure', selected = 'SMD',
choices = c('SMD', 'MD'), inline = TRUE),
h5(tags$b('Model type')),
div(style="display: inline-block;vertical-align:top;width:130px",
checkboxInput('SMDrandom', 'Random model', T)),
div(style="display: inline-block;vertical-align:top;",
checkboxInput('SMDfixed', 'Fixed model', F)),
# Mehod tau
{
selectInput(
inputId = 'SMDmethodtau', selected = 'DL',
label = span('Method of between-study variance τ',tags$sup('2'),'and its square root τ.'),
choices = c(
`DerSimonian-Laird estimator (DL)`= "DL",
`Paule-Mandel estimator (PM)` = "PM",
`Restricted maximum-likelihood estimator (REML)` = "REML",
`Maximum-likelihood estimator (ML)`="ML",
`Hunter-Schmidt estimator (HS)` = "HS",
`Sidik-Jonkman estimator (SJ)` = "SJ",
`Hedges estimator (HE)` ="HE",
`Empirical Bayes estimator (EB)`="EB"))
},
# Method of SMD calculation:
{
selectInput('SMDmethodsmd', 'Method of SMD (If SMD is selected)', selected = 'Hedges',choices = c('Hedges','Glass','Cohen'))},
selectInput('SMDsubgroup', 'Subgroup analysis by:', selected = NULL,
choices = c('')),
tags$hr(),
# Forest plot options ----
h4(tags$b('Forest plot')),
selectInput('SMDsortvar', 'Sort by:', selected = 'NULL',
choices = c(`Not sorted`='NULL',"TE","seTE",
`Weight (random)`='w.random',
`Weight (fixed)`='w.fixed')),
textInput('SMDtitleforest', 'Title', 'Forest plot'),
# Title offset vertical:
div(style="display: inline-block;vertical-align:top; width: 177px;",
sliderInput('SMDVtitleoffset', 'Vertical Title offset', 0.95, min = 0.6, max = 1)),
# Title offset horizontal:
div(style="display: inline-block;vertical-align:top; width: 177px;",
sliderInput('SMDHtitleoffset', 'Horizontal Title offset', 0.5, min = 0, max = 1)),
# intervention group
div(style="display: inline-block;vertical-align:top; width: 178px;",
textInput('SMDintervention', 'Intervention label', 'Intervention')),
# control group
div(style="display: inline-block;vertical-align:top; width: 177px;",
textInput('SMDcontrol', 'Control label', 'Control ')),
# left columns:
selectInput('SMDlftclm', 'Columns on the Left', multiple = T,
selected = c('studlab', 'n.e', 'mean.e', 'sd.e', 'n.c', 'mean.c', 'sd.c'),
choices = c('studlab', 'n.e', 'mean.e', 'sd.e', 'n.c', 'mean.c', 'sd.c',
"effect","ci", "w.random")),
# left labs:
textInput('SMDlftlabl', 'Labels on the Left',
c("Study, N, Mean, SD, N, Mean, SD")),
# Right columns:
selectInput('SMDrghtclm', 'Columns on the Right', multiple = T,
selected = c("effect","ci", "w.random"),
choices = c('studlab', 'n.e', 'mean.e', 'sd.e', 'n.c', 'mean.c', 'sd.c',
"effect","ci", "w.random", 'pval')),
# Right labs:
textInput('SMDrghtlabl', 'Labels on the Right',
c("")),
helpText('If you changed the left columns you change the labels as well'),
# modify your Forest plot colors:
h5(tags$b('Colors')),
div(style="display: inline-block;vertical-align:top; width:125px;",
colourpicker::colourInput('SMDcolFStud', 'Study color', value = 'grey')),
div(style="width:125px;",
colourpicker::colourInput('SMDcolFdiamond', 'Diamond color', value = "deepskyblue2")),
div(style="display: inline-block;vertical-align:top; width:125px;",
colourpicker::colourInput('SMDcolFpred', 'Prediction interval',value = 'red')),
sliderInput(inputId = 'SMDH', 'Forest plot Height', 700, min = 0 ,max = 2000),
sliderInput(inputId = 'SMDW', 'Forest plot Width', 800, min = 0 , max = 2000),
sliderInput(inputId = 'SMDRes', 'Forest plot resolution', 92, min = 0 ,max = 200),
downloadButton("downloadSMDforestplot", "Download Forest plot"),
# Horizontal line ---
tags$hr(),
# Funnel plot options ----
h4(tags$b('Funnel plot')),
textInput('SMDfunneltitle','Title','Funnel plot'),
# # Xlim forest
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('minSMDxlimp', 'min x-axis', -2)),
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('maxSMDxlimp', 'max x-axis', 2)),
# Study size
div(style="display: inline-block;vertical-align:top;height:65px; width: 90px;",
numericInput('SMDfunnelcex','Study size',2, step = 0.2)),
div(style="display: inline-block;vertical-align:top; width: 110px;",
colourpicker::colourInput('SMDfunnelstudy','Study color','grey15')),
div(style="display: inline-block;vertical-align:top; width: 120px;",
colourpicker::colourInput('SMDfunnelbg','Background color','gray94')),
sliderInput(inputId = 'SMDHp', 'Funnel plot Height', 500, min = 400 ,max = 1000),
sliderInput(inputId = 'SMDWp', 'Funnel plot Width', 600, min = 400 ,max = 1000),
sliderInput(inputId = 'SMDResp', 'Funnel plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadSMDfunnelplot", "Download Funnel plot"),
tags$hr(),
# Drapery plot ----
h4(tags$b('Drapery plot')),
textInput('SMDDraperytitle','Title','Drapery plot'),
# Xlim drapery
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('minSMDxlimd', 'min x-axis', -4, step = 0.1)),
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('maxSMDxlimd', 'max x-axis', 4, step = 0.1)),
sliderInput(inputId = 'SMDHd', 'Drapery plot Height', 525, min = 400 ,max = 1000),
sliderInput(inputId = 'SMDWd', 'Drapery plot Width', 850, min = 400 ,max = 1000),
sliderInput(inputId = 'SMDResd', 'Drapery plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadSMDDraperyplot", "Download Drapery plot"),
)},
# main panel ----
{
mainPanel(
tabsetPanel(
tabPanel('Model summary',
verbatimTextOutput('SMD.model')),
tabPanel('Forest plot',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
uiOutput('SMDforestplot')),
tabPanel("Drapery plot",uiOutput('SMDdraperyplot')),
tabPanel('Funnel plot',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
uiOutput('SMDfunnelplot'),
),
tabPanel('Publication bias tests',
# h5(tags$b('Publication bias (Egger test)')),
# verbatimTextOutput('SMDpubBias')
h3('Egger\'s test'),
uiOutput("SMDbias")
),
tabPanel('Trim and fill',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
checkboxInput('SMDTF','Trim & fill analysis',FALSE),
conditionalPanel(
condition = 'input.SMDTF == true',
checkboxGroupInput('SMDtrimfill', 'Please choose panel options',
inline = T, selected = '',
choices = c("Model","Forest","Funnel","Drapery"))),
conditionalPanel(
condition= c("input.SMDtrimfill.includes('Model')"),
verbatimTextOutput('SMDtrimfillmodel')
),
conditionalPanel(
condition="input.SMDtrimfill.includes('Forest')",
plotOutput('SMDtrimfillforest')
),
conditionalPanel(
condition="input.SMDtrimfill.includes('Funnel')",
plotOutput('SMDtrimfillfunnel')
),
conditionalPanel(
condition="input.SMDtrimfill.includes('Drapery')",
plotOutput('SMDtrimfilldrapery')
)
)
)
)
}
)
}
),
# Proportion panel ----
tabPanel('Proportion',
{sidebarLayout(
# Sidebar panel ----
{sidebarPanel(
#style = "position:fixed;width:inherit;height:550px;overflow-y: scroll;",
style = 'width:6000;overflow-x: scroll;height:550px;overflow-y: scroll;',
# Model options ----
h4(tags$b('Model options')),
radioButtons('Propsm', 'Summary measure', selected = 'PRAW',
choices = c("PRAW","PLN", "PAS", "PFT","PLOGIT"), inline = TRUE),
h5(tags$b('Model type')),
div(style="display: inline-block;vertical-align:top;width:130px",
checkboxInput('Proprandom', 'Random model', T)),
div(style="display: inline-block;vertical-align:top;",
checkboxInput('Propfixed', 'Fixed model', F)),
selectInput(
inputId = 'Propmethodtau', selected = 'DL',
label = span('Method of between-study variance τ',tags$sup('2'),'and its square root τ.'),
choices = c(
`DerSimonian-Laird estimator (DL)`= "DL",
`Paule-Mandel estimator (PM)` = "PM",
`Restricted maximum-likelihood estimator (REML)` = "REML",
`Maximum-likelihood estimator (ML)`="ML",
`Hunter-Schmidt estimator (HS)` = "HS",
`Sidik-Jonkman estimator (SJ)` = "SJ",
`Hedges estimator (HE)` ="HE",
`Empirical Bayes estimator (EB)`="EB")),
selectInput('Propsubgroup', 'Subgroup analysis by:', selected = NULL,
choices = c('')),
#h1('Results'),
checkboxInput('PropbackTfor', 'Backtransform (work with other than PRAW)', TRUE),
# Horizontal line ----
tags$hr(),
# forest plot labels ----
h4(tags$b('Forest plot')),
selectInput('Propsortvar', 'Sort by:', selected = 'NULL',
choices = c(`Not sorted`='NULL',"TE","seTE",
`Weight (random)`='w.random',
`Weight (fixed)`='w.fixed')),
textInput('Proptitleforest', 'Title', 'Forest plot'),
textInput('Propsmlabforest','Summary lable','Proportion'),
# Title offset vertical:
div(style="display: inline-block;vertical-align:top; width: 177px;",
sliderInput('PropVtitleoffset', 'Vertical Title offset', 0.95, min = 0.6, max = 1)),
# Title offset horizontal:
div(style="display: inline-block;vertical-align:top; width: 177px;",
sliderInput('PropHtitleoffset', 'Horizontal Title offset', 0.5, min = 0, max = 1)),
# Prop colgap:
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('Propcolgap', 'Colgap limit', 1 , step = 0.2)),
# Xlim limits
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('minPropxlim', 'min x-axis', 0, step = 0.1)),
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('maxPropxlim', 'max x-axis', 1, step = 0.1)),
helpText('Colgap: in mm or cm or inch'),
# left labs:
# textInput('Proplftlabl', 'Labels on the left',c("Study, N, Prop, SD, N, Prop, SD")),
# textInput('MEANlftclm', 'Columns on the left',
# c("Study, n.e, mean.e, sd.e, n.c, mean.c, sd.c")),
# helpText('If you changed the left columns you change the labels as well'),
# left columns:
selectInput('Proplftclm', 'Columns on the Left', multiple = T,
selected = c("studlab", "event", "n"),
choices = c("studlab", "event", "n",
"effect", "ci", "w.random", "w.fixed", "pval")),
# left labs:
textInput('Proplftlabl', 'Labels on the Left',
c("Study, Events, Total")),
# Right columns:
selectInput('Proprghtclm', 'Columns on the Right', multiple = T,
selected = c("effect","ci", "w.random"),
choices = c("studlab", "event", "n",
"effect", "ci", "w.random", "w.fixed", 'pval')),
# Right labs:
textInput('Proprghtlabl', 'Labels on the Right',
c("")),
helpText('If you changed the left columns you change the labels as well'),
# modify your plot colors:
h5(tags$b('Colors')),
div(style="display: inline-block;vertical-align:top; width: 125px;",
colourpicker::colourInput('PropcolFStud', 'Study color', 'grey')),
div(style="width: 125px;",
colourpicker::colourInput('PropcolFdiamond', 'Diamond color', "deepskyblue2")),
div(style="display: inline-block;vertical-align:top; width: 125px;",
colourpicker::colourInput('PropcolFpred', 'Prediction interval', 'red')),
sliderInput(inputId = 'PropH', 'Forest plot Height', 700, min = 0 ,max = 2000),
sliderInput(inputId = 'PropW', 'Forest plot Width', 800, min = 0 , max = 2000),
sliderInput(inputId = 'PropRes', 'Forest plot resolution', 92, min = 0 ,max = 200),
downloadButton("downloadPropforestplot", "Download Forest plot"),
# Horizontal line ----
tags$hr(),
# Funnel plot options ----
h4(tags$b('Funnel plot')),
textInput('Propfunneltitle','Title','Funnel plot'),
# Xlim forest
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('minPropxlimp', 'min x-axis', value = -0.5, step = 0.1)),
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('maxPropxlimp', 'max x-axis', value = 1.5, step = 0.1)),
# Study size
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('Propfunnelcex','Study size',2, step = 0.2)),
div(style="display: inline-block;vertical-align:top; width: 150px;",
colourpicker::colourInput('Propfunnelstudy','Study color','grey15')),
div(style="display: inline-block;vertical-align:top; width: 150px;",
colourpicker::colourInput('Propfunnelbg','Background color','gray94')),
sliderInput(inputId = 'PropHp', 'Funnel plot Height', 500, min = 400 ,max = 1000),
sliderInput(inputId = 'PropWp', 'Funnel plot Width', 600, min = 400 ,max = 1000),
sliderInput(inputId = 'PropResp', 'Funnel plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadPropfunnelplot", "Download Funnel plot"),
tags$hr(),
# Drapery plot ----
h4(tags$b('Drapery plot')),
textInput('PropDraperytitle','Title','Drapery plot'),
# Xlim drapery
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('minPropxlimd', 'min x-axis', 0, step = 0.1)),
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('maxPropxlimd', 'max x-axis', 1, step = 0.1)),
sliderInput(inputId = 'PropHd', 'Drapery plot Height', 525, min = 400 ,max = 1000),
sliderInput(inputId = 'PropWd', 'Drapery plot Width', 850, min = 400 ,max = 1000),
sliderInput(inputId = 'PropResd', 'Drapery plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadPropDraperyplot", "Download Drapery plot"),
)},
# main panel ----
{ mainPanel(
tabsetPanel(
tabPanel('Model summary',verbatimTextOutput('Prop.model')),
tabPanel('Forest plot',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
uiOutput('Propforestplot')),
tabPanel("Drapery plot",uiOutput('Propdraperyplot')),
tabPanel('Funnel plot', uiOutput('Propfunnelplot'),
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
),
tabPanel('Publication bias tests',
# h5(tags$b('Publication bias (Egger test)')),
# verbatimTextOutput('ProppubBias')
h3('Egger\'s test'),
uiOutput("Propbias")
),
tabPanel('Trim and fill',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
checkboxInput('PropTF','Trim & fill analysis',FALSE),
conditionalPanel(
condition = 'input.PropTF == true',
checkboxGroupInput('Proptrimfill', 'Please choose panel options',
inline = T, selected = '',
choices = c("Model","Forest","Funnel","Drapery"))),
conditionalPanel(
condition= c("input.Proptrimfill.includes('Model')"),
verbatimTextOutput('Proptrimfillmodel')
),
conditionalPanel(
condition="input.Proptrimfill.includes('Forest')",
plotOutput('Proptrimfillforest')
),
conditionalPanel(
condition="input.Proptrimfill.includes('Funnel')",
plotOutput('Proptrimfillfunnel')
),
conditionalPanel(
condition="input.Proptrimfill.includes('Drapery')",
plotOutput('Proptrimfilldrapery')
)
)
)
)}
)
}
),
# Correlation panel ----
tabPanel('Correlation',
{sidebarLayout(
# Sidebar panel ----
{sidebarPanel(
#style = "position:fixed;width:inherit;height:550px;overflow-y: scroll;",
style = 'width:6000;overflow-x: scroll;height:550px;overflow-y: scroll;',
# Model options ----
h4(tags$b('Model options')),
radioButtons('CORsm', 'Measure', selected = 'COR',
choices = c('COR', 'ZCOR'), inline = TRUE),
h5(tags$b('Model type')),
div(style="display: inline-block;vertical-align:top;width:130px",
checkboxInput('CORrandom', 'Random model', T)),
div(style="display: inline-block;vertical-align:top;",
checkboxInput('CORfixed', 'Fixed model', F)),
selectInput(
inputId = 'CORmethodtau', selected = 'DL',
label = span('Method of between-study variance τ',tags$sup('2'),'and its square root τ.'),
choices = c(
`DerSimonian-Laird estimator (DL)`= "DL",
`Paule-Mandel estimator (PM)` = "PM",
`Restricted maximum-likelihood estimator (REML)` = "REML",
`Maximum-likelihood estimator (ML)`="ML",
`Hunter-Schmidt estimator (HS)` = "HS",
`Sidik-Jonkman estimator (SJ)` = "SJ",
`Hedges estimator (HE)` ="HE",
`Empirical Bayes estimator (EB)`="EB")),
selectInput('CORsubgroup', 'Subgroup analysis by:', selected = NULL,
choices = c('')),
#h1('Results'),
checkboxInput('CORbackTfor', 'Backtransform (work with ZCOR)', TRUE),
# Forest plot options ----
h4(tags$b('Forest plot')),
selectInput('CORsortvar', 'Sort by:', selected = 'NULL',
choices = c(`Not sorted`='NULL',"TE","seTE",
`Weight (random)`='w.random',
`Weight (fixed)`='w.fixed')),
textInput('CORtitleforest', 'Title', 'Forest plot'),
# Title offset vertical:
div(style="display: inline-block;vertical-align:top; width: 177px;",
sliderInput('CORVtitleoffset', 'Vertical Title offset', 0.95, min = 0.6, max = 1)),
# Title offset horizontal:
div(style="display: inline-block;vertical-align:top; width: 177px;",
sliderInput('CORHtitleoffset', 'Horizontal Title offset', 0.5, min = 0, max = 1)),
# COR colgap:
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('CORcolgap', 'Colgap limit', 1 , step = 0.2)),
# Xlim forest
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('minCORxlim', 'min x-axis', 0)),
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('maxCORxlim', 'max x-axis', 1)),
helpText('Colgap: in mm or cm or inch'),
# left labs:
# textInput('MEANlftlabl', 'Labels on the left',c("Study, N, Mean, SD, N, Mean, SD")),
# textInput('MEANlftclm', 'Columns on the left',
# c("Study, n.e, mean.e, sd.e, n.c, mean.c, sd.c")),
# helpText('If you changed the left columns you change the labels as well'),
# left columns:
selectInput('CORlftclm', 'Columns on the Left', multiple = T,
selected = c('studlab', 'n'),
choices = c('studlab', 'n', "effect","ci", "w.random",'w.fixed', 'pval')),
# left labs:
textInput('CORlftlabl', 'Labels on the Left',
c("Study, N")),
# Right columns:
selectInput('CORrghtclm', 'Columns on the Right', multiple = T,
selected = c("effect","ci", "w.random"),
choices = c('studlab', 'n', "effect","ci", "w.random",'w.fixed', 'pval')),
# Right labs:
textInput('CORrghtlabl', 'Labels on the Right',
c("")),
helpText('If you changed the left columns you change the labels as well'),
# modify your plot colors:
h5(tags$b('Colors')),
div(style="display: inline-block;vertical-align:top; width: 125px;",
colourpicker::colourInput('CORcolFStud', 'Study color', 'grey')),
div(style="width: 125px;",
colourpicker::colourInput('CORcolFdiamond', 'Diamond color', "deepskyblue2")),
div(style="display: inline-block;vertical-align:top; width: 125px;",
colourpicker::colourInput('CORcolFpred', 'Prediction interval', 'red')),
sliderInput(inputId = 'CORH', 'Forest plot Height', 700, min = 0 ,max = 2000),
sliderInput(inputId = 'CORW', 'Forest plot Width', 800, min = 0 , max = 2000),
sliderInput(inputId = 'CORRes', 'Forest plot resolution', 92, min = 0 ,max = 200),
downloadButton("downloadCORforestplot", "Download Forest plot"),
# Horizontal line ---
tags$hr(),
# Funnel plot options ----
h4(tags$b('Funnel plot')),
textInput('CORfunneltitle','Title','Funnel plot'),
# Xlim forest
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('minCORxlimp', 'min x-axis', -1)),
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('maxCORxlimp', 'max x-axis', 1)),
# Study size
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('CORfunnelcex','Study size',2, step = 0.2)),
div(style="display: inline-block;vertical-align:top; width: 150px;",
colourpicker::colourInput('CORfunnelstudy','Study color','grey15')),
div(style="display: inline-block;vertical-align:top; width: 150px;",
colourpicker::colourInput('CORfunnelbg','Background color','gray94')),
sliderInput(inputId = 'CORHp', 'Funnel plot Height', 500, min = 400 ,max = 1000),
sliderInput(inputId = 'CORWp', 'Funnel plot Width', 600, min = 400 ,max = 1000),
sliderInput(inputId = 'CORResp', 'Funnel plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadCORfunnelplot", "Download Funnel plot"),
tags$hr(),
# Drapery plot ----
h4(tags$b('Drapery plot')),
textInput('CORDraperytitle','Title','Drapery plot'),
# Xlim drapery
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('minCORxlimd', 'min x-axis', -1, step = 0.1)),
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('maxCORxlimd', 'max x-axis', 1, step = 0.1)),
sliderInput(inputId = 'CORHd', 'Drapery plot Height', 525, min = 400 ,max = 1000),
sliderInput(inputId = 'CORWd', 'Drapery plot Width', 850, min = 400 ,max = 1000),
sliderInput(inputId = 'CORResd', 'Drapery plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadCORDraperyplot", "Download Drapery plot"),
)},
# main panel ----
mainPanel(
tabsetPanel(
tabPanel('Model summary',verbatimTextOutput('COR.model')),
tabPanel('Forest plot',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
uiOutput('CORforestplot')),
tabPanel("Drapery plot",uiOutput('CORdraperyplot')),
tabPanel('Funnel plot', uiOutput('CORfunnelplot'),
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;'
),
tabPanel('Publication bias tests',
# h5(tags$b('Publication bias (Egger test)')),
# verbatimTextOutput('CORpubBias')
h3('Egger\'s test'),
uiOutput("CORbias")
),
tabPanel('Trim and fill',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
checkboxInput('CORTF','Trim & fill analysis',FALSE),
conditionalPanel(
condition = 'input.CORTF == true',
checkboxGroupInput('CORtrimfill', 'Please choose panel options',
inline = T, selected = '',
choices = c("Model","Forest","Funnel","Drapery"))),
conditionalPanel(
condition= c("input.CORtrimfill.includes('Model')"),
verbatimTextOutput('CORtrimfillmodel')
),
conditionalPanel(
condition="input.CORtrimfill.includes('Forest')",
plotOutput('CORtrimfillforest')
),
conditionalPanel(
condition="input.CORtrimfill.includes('Funnel')",
plotOutput('CORtrimfillfunnel')
),
conditionalPanel(
condition="input.CORtrimfill.includes('Drapery')",
plotOutput('CORtrimfilldrapery')
)
)
)
)
)
}
),
# OR panel ----
tabPanel('OR',
{
sidebarLayout(
# Sidebar panel ----
{sidebarPanel(
#style = "position:fixed;width:inherit;height:550px;overflow-y: scroll;",
style = 'width:6000;overflow-x: scroll;height:550px;overflow-y: scroll;',
# Model options ----
h4(tags$b('Model options')),
h5(tags$b('Model type')),
div(style="display: inline-block;vertical-align:top;width:130px",
checkboxInput('ORrandom', 'Random model', T)),
div(style="display: inline-block;vertical-align:top;",
checkboxInput('ORfixed', 'Fixed model', F)),
selectInput(
inputId = 'ORmethodtau', selected = 'DL',
label = span('Method of between-study variance τ',tags$sup('2'),'and its square root τ.'),
choices = c(
`DerSimonian-Laird estimator (DL)`= "DL",
`Paule-Mandel estimator (PM)` = "PM",
`Restricted maximum-likelihood estimator (REML)` = "REML",
`Maximum-likelihood estimator (ML)`="ML",
`Hunter-Schmidt estimator (HS)` = "HS",
`Sidik-Jonkman estimator (SJ)` = "SJ",
`Hedges estimator (HE)` ="HE",
`Empirical Bayes estimator (EB)`="EB")),
selectInput('ORsubgroup', 'Subgroup analysis by:', selected = NULL,
choices = c('')),
hr(),
#h1('Results'),
#checkboxInput('ORbackTfor', 'Backtransform (work with ZOR)', TRUE),
# Forest plot options ----
h4(tags$b('Forest plot')),
selectInput('ORsortvar', 'Sort by:', selected = 'NULL',
choices = c(`Not sorted`='NULL',"TE","seTE",
`Weight (random)`='w.random',
`Weight (fixed)`='w.fixed')),
textInput('ORtitleforest', 'Title', 'Forest plot'),
# Title offset vertical:
div(style="display: inline-block;vertical-align:top; width: 177px;",
sliderInput('ORVtitleoffset', 'Vertical Title offset', 0.95, min = 0.6, max = 1)),
# Title offset horizontal:
div(style="display: inline-block;vertical-align:top; width: 177px;",
sliderInput('ORHtitleoffset', 'Horizontal Title offset', 0.5, min = 0, max = 1)),
# OR colgap:
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('ORcolgap', 'Colgap limit', 1 , step = 0.2)),
# Xlim forest
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('minORxlim', 'min x-axis', 0)),
div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
numericInput('maxORxlim', 'max x-axis', 1)),
# div(style="display: inline-block;vertical-align:top;height:55px; width: 110px;",
# numericInput('ORrefline', 'Ref. line', 1)),
helpText(tags$b('Colgap:') ,
'space between forest plot and column left to it in mm or cm or inch'),
br(),
# left labs:
# textInput('MEANlftlabl', 'Labels on the left',c("Study, N, Mean, SD, N, Mean, SD")),
# textInput('MEANlftclm', 'Columns on the left',
# c("Study, n.e, mean.e, sd.e, n.c, mean.c, sd.c")),
# helpText('If you changed the left columns you change the labels as well'),
# left columns:
selectInput('ORlftclm', 'Columns on the Left', multiple = T,
selected = c('studlab', "event.e", "n.e", "event.c", "n.c"),
choices = c("studlab", "event.e", "n.e", "event.c", "n.c",
"effect", "ci", "w.fixed", "w.random", 'pval')),
# left labs:
textInput('ORlftlabl', 'Labels on the Left',
c("Study, Events, Total, Events, Total")),
# Right columns:
selectInput('ORrghtclm', 'Columns on the Right', multiple = T,
selected = c("effect","ci", "w.random"),
choices = c('studlab', "event.e", "n.e", "event.c", "n.c",
"effect", "ci", "w.fixed", "w.random", 'pval')),
# Right labs:
textInput('ORrghtlabl', 'Labels on the Right',
c("OR, 95%-CI, Weight")),
helpText('If you changed the left columns you change the labels as well'),
# modify your plot colors:
h5(tags$b('Colors')),
div(style="display: inline-block;vertical-align:top; width: 125px;",
colourpicker::colourInput('ORcolFStud', 'Study color', 'grey')),
div(style="width: 125px;",
colourpicker::colourInput('ORcolFdiamond', 'Diamond color', "deepskyblue2")),
div(style="display: inline-block;vertical-align:top; width: 125px;",
colourpicker::colourInput('ORcolFpred', 'Prediction interval', 'red')),
sliderInput(inputId = 'ORH', 'Forest plot Height', 700, min = 0 ,max = 2000),
sliderInput(inputId = 'ORW', 'Forest plot Width', 800, min = 0 , max = 2000),
sliderInput(inputId = 'ORRes', 'Forest plot resolution', 92, min = 0 ,max = 200),
downloadButton("downloadORforestplot", "Download Forest plot"),
# Horizontal line ---
tags$hr(),
# Funnel plot options ----
h4(tags$b('Funnel plot')),
textInput('ORtitlefunnel','Title','Funnel plot'),
# Xlim forest
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('minORxlimp', 'min x-axis', -2)),
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('maxORxlimp', 'max x-axis', 2)),
# Study size
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('ORfunnelcex','Study size',2, step = 0.2)),
div(style="display: inline-block;vertical-align:top; width: 150px;",
colourpicker::colourInput('ORfunnelstudy','Study color','grey15')),
div(style="display: inline-block;vertical-align:top; width: 150px;",
colourpicker::colourInput('ORfunnelbg','Background color','gray94')),
sliderInput(inputId = 'ORHp', 'Funnel plot Height', 500, min = 400 ,max = 1000),
sliderInput(inputId = 'ORWp', 'Funnel plot Width', 600, min = 400 ,max = 1000),
sliderInput(inputId = 'ORResp', 'Funnel plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadORfunnelplot", "Download Funnel plot"),
tags$hr(),
# Drapery plot ----
h4(tags$b('Drapery plot')),
textInput('ORDraperytitle','Title','Drapery plot'),
# Xlim drapery
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('minORxlimd', 'min x-axis', 0.1, step = 0.1)),
div(style="display: inline-block;vertical-align:top;height:65px; width: 110px;",
numericInput('maxORxlimd', 'max x-axis', 2, step = 0.1)),
sliderInput(inputId = 'ORHd', 'Drapery plot Height', 525, min = 400 ,max = 1000),
sliderInput(inputId = 'ORWd', 'Drapery plot Width', 850, min = 400 ,max = 1000),
sliderInput(inputId = 'ORResd', 'Drapery plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadORDraperyplot", "Download Drapery plot"),
)},
# main panel ----
{mainPanel(
tabsetPanel(
tabPanel('Model summary', verbatimTextOutput('OR.model')),
tabPanel('Forest plot',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
uiOutput('ORforestplot')),
tabPanel("Drapery plot",uiOutput('ORdraperyplot')),
tabPanel('Funnel plot', uiOutput('ORfunnelplot'),
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
),
tabPanel('Publication bias tests',
# h5(tags$b('Publication bias (Egger test)')),
# verbatimTextOutput('ORpubBias')
h3('Egger\'s test'),
uiOutput("ORbias")
),
tabPanel('Trim and fill',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
checkboxInput('ORTF','Trim & fill analysis',FALSE),
conditionalPanel(
condition = 'input.ORTF == true',
checkboxGroupInput('ORtrimfill', 'Please choose panel options',
inline = T, selected = '',
choices = c("Model","Forest","Funnel","Drapery"))),
conditionalPanel(
condition= c("input.ORtrimfill.includes('Model')"),
verbatimTextOutput('ORtrimfillmodel')
),
conditionalPanel(
condition="input.ORtrimfill.includes('Forest')",
plotOutput('ORtrimfillforest')
),
conditionalPanel(
condition="input.ORtrimfill.includes('Funnel')",
plotOutput('ORtrimfillfunnel')
),
conditionalPanel(
condition="input.ORtrimfill.includes('Drapery')",
plotOutput('ORtrimfilldrapery')
)
)
)
)}
)
}
)
)
}
),
# tab panel 3: Advanced ----
tabPanel(
title = 'Advanced', icon = icon("cogs", lib = "font-awesome"),
{
tabsetPanel(
type = "pills",
tabPanel("Mean",
{
sidebarLayout(
# Side bar panel ----
sidebarPanel(
# Meta-regression ----
radioButtons('Meanmodtype','Select model check', selected = '+',
choices = c('Standard' = '+','interaction' = '*')),
selectInput('MEANregfactor','Choose factors for metaregression', multiple = T,
selected = NULL, choices = c('') ),
# Pcurve analysis ----
h4(tags$b('Pcurve analysis')),
style='width:800;overflow-x: scroll;height:550px;overflow-y: scroll;',
# checkboxInput('MEANpcurve_EE','Effect estimation', FALSE),
sliderInput(inputId = 'MEANHc', 'Pcurve plot Height', 500, min = 400 ,max = 1000),
sliderInput(inputId = 'MEANWc', 'Pcurve plot Width', 830, min = 400 ,max = 1000),
sliderInput(inputId = 'MEANResc', 'Pcurve plot resolution', 100, min = 0 ,max = 200),
downloadButton("downloadMEANpcurveplot", "Download Pcurve plot")
),
# Main panel ----
mainPanel(
#style='width:895px;overflow-x: scroll;height:550px;',# #overflow-y: scroll;
#style='width:800;overflow-x: scroll;height:550px;overflow-y: scroll;',
{
tabsetPanel(
type = "tabs",
tabPanel("Meta-regression", verbatimTextOutput('Mean.regmodel')),
tabPanel("P-hacking/ P-curve",uiOutput('MEANpcurve')),
tabPanel("Basic outlier detection",
Style='width:1000;overflow-x: scroll;height:528px;overflow-y: scroll;',
verbatimTextOutput('MEANbasicO')
),
tabPanel('Influence Analysis',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
checkboxGroupInput(
'MEANoutlier', 'Please choose panel options', inline = T, selected = '',
choices = c("Summary","Baujat Plot","Influence Diagnostics",
"Leave-One-Out Meta-Analysis")
),
conditionalPanel(
condition= c("input.MEANoutlier.includes('Summary')"),
verbatimTextOutput('MEANsens_sum')
),
conditionalPanel(
condition="input.MEANoutlier.includes('Baujat Plot')",
uiOutput('MEANsens_Bplot')
),
conditionalPanel(
condition="input.MEANoutlier.includes('Influence Diagnostics')",
uiOutput('MEANsens_InfluenceCharacteristics')
),
conditionalPanel(
condition="input.MEANoutlier.includes('Leave-One-Out Meta-Analysis')",
uiOutput('MEANsens_ForestI2'),
uiOutput('MEANsens_ForestEffectsize')
)
),
tabPanel("GOSH analysis",
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
actionButton('doMEANgosh','Start GOSH analysis'),
checkboxGroupInput(
'MEANgosh', 'Please choose panel options', inline = T, selected = '',
choices = c("GOSH plot","GOSH diagnostics","GOSH diagnostics plots")
),
conditionalPanel(
condition= c("input.MEANgosh.includes('GOSH plot')"),
uiOutput('MEANgosh_plot')
),
conditionalPanel(
condition="input.MEANgosh.includes('GOSH diagnostics')",
verbatimTextOutput('MEANgosh_sum')
),
conditionalPanel(
condition="input.MEANgosh.includes('GOSH diagnostics plots')",
uiOutput('MEANgoshdiag_plot')
)
)
)
}
)
)
}
),
tabPanel("MD/SMD",
{
sidebarLayout(
sidebarPanel(
# Meta-regression ----
radioButtons('SMDmodtype','Select model check', selected = '+',
choices = c('Standard' = '+','interaction' = '*')),
selectInput('SMDregfactor','Choose factors for metaregression', multiple = T,
selected = NULL, choices = c('') ),
# Pcurve analysis ----
h4(tags$b('Pcurve analysis')),
style='width:800;overflow-x: scroll;height:550px;overflow-y: scroll;',
# checkboxInput('MEANpcurve_EE','Effect estimation', FALSE),
sliderInput(inputId = 'SMDHc', 'Pcurve plot Height', 500, min = 400 ,max = 1000),
sliderInput(inputId = 'SMDWc', 'Pcurve plot Width', 830, min = 400 ,max = 1000),
sliderInput(inputId = 'SMDResc', 'Pcurve plot resolution', 100, min = 0 ,max = 200),
actionButton('doSMDgosh','GOSH'),
downloadButton("downloadSMDpcurveplot", "Download Pcurve plot")
),
mainPanel(
#style='width:895px;overflow-x: scroll;height:550px;',# #overflow-y: scroll;
#style='width:800;overflow-x: scroll;height:590px;overflow-y: scroll;',
{
tabsetPanel(
type = "tabs",
tabPanel("Meta-regression",verbatimTextOutput('SMD.regmodel')),
tabPanel("P-hacking/ P-curve", uiOutput('SMDpcurve')),
tabPanel("Basic outlier detection",
Style='width:1000;overflow-x: scroll;height:528px;overflow-y: scroll;',
verbatimTextOutput('SMDbasicO')
),
tabPanel('Influence Analysis',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
checkboxGroupInput(
'SMDoutlier', 'Please choose panel options', inline = T, selected = '',
choices = c("Summary","Baujat Plot","Influence Diagnostics",
"Leave-One-Out Meta-Analysis")
),
conditionalPanel(
condition= c("input.SMDoutlier.includes('Summary')"),
verbatimTextOutput('SMDsens_sum')
),
conditionalPanel(
condition="input.SMDoutlier.includes('Baujat Plot')",
uiOutput('SMDsens_Bplot')
),
conditionalPanel(
condition="input.SMDoutlier.includes('Influence Diagnostics')",
uiOutput('SMDsens_InfluenceCharacteristics')
),
conditionalPanel(
condition="input.SMDoutlier.includes('Leave-One-Out Meta-Analysis')",
uiOutput('SMDsens_ForestI2'),
uiOutput('SMDsens_ForestEffectsize')
)
),
tabPanel("GOSH analysis",
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
actionButton('doSMDgosh','Start GOSH analysis'),
checkboxGroupInput(
'SMDgosh', 'Please choose panel options', inline = T, selected = '',
choices = c("GOSH plot","GOSH diagnostics","GOSH diagnostics plots")
),
conditionalPanel(
condition= c("input.SMDgosh.includes('GOSH plot')"),
uiOutput('SMDgosh_plot')
),
conditionalPanel(
condition="input.SMDgosh.includes('GOSH diagnostics')",
verbatimTextOutput('SMDgosh_sum')
),
conditionalPanel(
condition="input.SMDgosh.includes('GOSH diagnostics plots')",
uiOutput('SMDgoshdiag_plot')
)
)
)
}
)
)
}
),
tabPanel("Proportion",
{
sidebarLayout(
sidebarPanel(
# Meta-regression ----
radioButtons('Propmodtype','Select model check', selected = '+',
choices = c('Standard' = '+','interaction' = '*')),
selectInput('Propregfactor','Choose factors for metaregression', multiple = T,
selected = NULL, choices = c('') ),
# Pcurve analysis ----
h4(tags$b('Pcurve analysis')),
style='width:800;overflow-x: scroll;height:550px;overflow-y: scroll;',
# checkboxInput('MEANpcurve_EE','Effect estimation', FALSE),
sliderInput(inputId = 'PropHc', 'Pcurve plot Height', 500, min = 400 ,max = 1000),
sliderInput(inputId = 'PropWc', 'Pcurve plot Width', 830, min = 400 ,max = 1000),
sliderInput(inputId = 'PropResc', 'Pcurve plot resolution', 100, min = 0 ,max = 200),
actionButton('doPropgosh','GOSH'),
downloadButton("downloadProppcurveplot", "Download Pcurve plot")
),
mainPanel(
#style='width:895px;overflow-x: scroll;height:550px;',# #overflow-y: scroll;
#style='width:800;overflow-x: scroll;height:590px;overflow-y: scroll;',
{
tabsetPanel(
type = "tabs",
tabPanel("Meta-regression",verbatimTextOutput('Prop.regmodel')),
tabPanel("P-hacking/ P-curve", uiOutput('Proppcurve')),
tabPanel("Basic outlier detection",
Style='width:1000;overflow-x: scroll;height:528px;overflow-y: scroll;',
verbatimTextOutput('PropbasicO')
),
tabPanel('Influence Analysis',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
checkboxGroupInput(
'Propoutlier', 'Please choose panel options', inline = T, selected = '',
choices = c("Summary","Baujat Plot","Influence Diagnostics",
"Leave-One-Out Meta-Analysis")
),
conditionalPanel(
condition= c("input.Propoutlier.includes('Summary')"),
verbatimTextOutput('Propsens_sum')
),
conditionalPanel(
condition="input.Propoutlier.includes('Baujat Plot')",
uiOutput('Propsens_Bplot')
),
conditionalPanel(
condition="input.Propoutlier.includes('Influence Diagnostics')",
uiOutput('Propsens_InfluenceCharacteristics')
),
conditionalPanel(
condition="input.Propoutlier.includes('Leave-One-Out Meta-Analysis')",
uiOutput('Propsens_ForestI2'),
uiOutput('Propsens_ForestEffectsize')
)
),
tabPanel("GOSH analysis",
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
actionButton('doPropgosh','Start GOSH analysis'),
checkboxGroupInput(
'Propgosh', 'Please choose panel options', inline = T, selected = '',
choices = c("GOSH plot","GOSH diagnostics","GOSH diagnostics plots")
),
conditionalPanel(
condition= c("input.Propgosh.includes('GOSH plot')"),
uiOutput('Propgosh_plot')
),
conditionalPanel(
condition="input.Propgosh.includes('GOSH diagnostics')",
verbatimTextOutput('Propgosh_sum')
),
conditionalPanel(
condition="input.Propgosh.includes('GOSH diagnostics plots')",
uiOutput('Propgoshdiag_plot')
)
)
)
}
)
)
}
),
tabPanel("Correlation",
{
sidebarLayout(
sidebarPanel(
# Meta-regression ----
radioButtons('CORmodtype','Select model check', selected = '+',
choices = c('Standard' = '+','interaction' = '*')),
selectInput('CORregfactor','Choose factors for metaregression', multiple = T,
selected = NULL, choices = c('') ),
# Pcurve analysis ----
h4(tags$b('Pcurve analysis')),
style='width:800;overflow-x: scroll;height:550px;overflow-y: scroll;',
# checkboxInput('MEANpcurve_EE','Effect estimation', FALSE),
sliderInput(inputId = 'CORHc', 'Pcurve plot Height', 500, min = 400 ,max = 1000),
sliderInput(inputId = 'CORWc', 'Pcurve plot Width', 830, min = 400 ,max = 1000),
sliderInput(inputId = 'CORResc', 'Pcurve plot resolution', 100, min = 0 ,max = 200),
actionButton('doCORgosh','GOSH'),
downloadButton("downloadCORpcurveplot", "Download Pcurve plot")
),
mainPanel(
#style='width:895px;overflow-x: scroll;height:550px;',# #overflow-y: scroll;
#style='width:800;overflow-x: scroll;height:590px;overflow-y: scroll;',
{
tabsetPanel(
type = "tabs",
tabPanel("Meta-regression",verbatimTextOutput('COR.regmodel')),
tabPanel("P-hacking/ P-curve", uiOutput('CORpcurve')),
tabPanel("Basic outlier detection",
Style='width:1000;overflow-x: scroll;height:528px;overflow-y: scroll;',
verbatimTextOutput('CORbasicO')
),
tabPanel('Influence Analysis',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
checkboxGroupInput(
'CORoutlier', 'Please choose panel options', inline = T, selected = '',
choices = c("Summary","Baujat Plot","Influence Diagnostics",
"Leave-One-Out Meta-Analysis")
),
conditionalPanel(
condition= c("input.CORoutlier.includes('Summary')"),
verbatimTextOutput('CORsens_sum')
),
conditionalPanel(
condition="input.CORoutlier.includes('Baujat Plot')",
uiOutput('CORsens_Bplot')
),
conditionalPanel(
condition="input.CORoutlier.includes('Influence Diagnostics')",
uiOutput('CORsens_InfluenceCharacteristics')
),
conditionalPanel(
condition="input.CORoutlier.includes('Leave-One-Out Meta-Analysis')",
uiOutput('CORsens_ForestI2'),
uiOutput('CORsens_ForestEffectsize')
)
),
tabPanel("GOSH analysis",
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
actionButton('doCORgosh','Start GOSH analysis'),
checkboxGroupInput(
'CORgosh', 'Please choose panel options', inline = T, selected = '',
choices = c("GOSH plot","GOSH diagnostics","GOSH diagnostics plots")
),
conditionalPanel(
condition= c("input.CORgosh.includes('GOSH plot')"),
uiOutput('CORgosh_plot')
),
conditionalPanel(
condition="input.CORgosh.includes('GOSH diagnostics')",
verbatimTextOutput('CORgosh_sum')
),
conditionalPanel(
condition="input.CORgosh.includes('GOSH diagnostics plots')",
uiOutput('CORgoshdiag_plot')
)
)
)
}
)
)
}
),
tabPanel("OR",
{
sidebarLayout(
sidebarPanel(
# Meta-regression ----
radioButtons('ORmodtype','Select model check', selected = '+',
choices = c('Standard' = '+','interaction' = '*')),
selectInput('ORregfactor','Choose factors for metaregression', multiple = T,
selected = NULL, choices = c('') ),
# Pcurve analysis ----
h4(tags$b('Pcurve analysis')),
style='width:800;overflow-x: scroll;height:550px;overflow-y: scroll;',
# checkboxInput('MEANpcurve_EE','Effect estimation', FALSE),
sliderInput(inputId = 'ORHc', 'Pcurve plot Height', 500, min = 400 ,max = 1000),
sliderInput(inputId = 'ORWc', 'Pcurve plot Width', 830, min = 400 ,max = 1000),
sliderInput(inputId = 'ORResc', 'Pcurve plot resolution', 100, min = 0 ,max = 200),
actionButton('doORgosh','GOSH'),
downloadButton("downloadORpcurveplot", "Download Pcurve plot")
),
mainPanel(
#style='width:895px;overflow-x: scroll;height:550px;',# #overflow-y: scroll;
#style='width:800;overflow-x: scroll;height:590px;overflow-y: scroll;',
{
tabsetPanel(
type = "tabs",
tabPanel("Meta-regression",verbatimTextOutput('OR.regmodel')),
tabPanel("P-hacking/ P-curve", uiOutput('ORpcurve')),
tabPanel("Basic outlier detection",
Style='width:1000;overflow-x: scroll;height:528px;overflow-y: scroll;',
verbatimTextOutput('ORbasicO')
),
tabPanel('Influence Analysis',
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
checkboxGroupInput(
'ORoutlier', 'Please choose panel options', inline = T, selected = '',
choices = c("Summary","Baujat Plot","Influence Diagnostics",
"Leave-One-Out Meta-Analysis")
),
conditionalPanel(
condition= c("input.ORoutlier.includes('Summary')"),
verbatimTextOutput('ORsens_sum')
),
conditionalPanel(
condition="input.ORoutlier.includes('Baujat Plot')",
uiOutput('ORsens_Bplot')
),
conditionalPanel(
condition="input.ORoutlier.includes('Influence Diagnostics')",
uiOutput('ORsens_InfluenceCharacteristics')
),
conditionalPanel(
condition="input.ORoutlier.includes('Leave-One-Out Meta-Analysis')",
uiOutput('ORsens_ForestI2'),
uiOutput('ORsens_ForestEffectsize')
)
),
tabPanel("GOSH analysis",
Style='width:800;overflow-x: scroll;height:528px;overflow-y: scroll;',
actionButton('doORgosh','Start GOSH analysis'),
checkboxGroupInput(
'ORgosh', 'Please choose panel options', inline = T, selected = '',
choices = c("GOSH plot","GOSH diagnostics","GOSH diagnostics plots")
),
conditionalPanel(
condition= c("input.ORgosh.includes('GOSH plot')"),
uiOutput('ORgosh_plot')
),
conditionalPanel(
condition="input.ORgosh.includes('GOSH diagnostics')",
verbatimTextOutput('ORgosh_sum')
),
conditionalPanel(
condition="input.ORgosh.includes('GOSH diagnostics plots')",
uiOutput('ORgoshdiag_plot')
)
)
)
}
)
)
}
)
)
}
),
# tab panel 4: About ----
tabPanel(
title = 'About', icon = icon("dot-circle-o", lib = "font-awesome"),
h1(tags$b(tags$em("Welcome to our meta-analysis app!"))),
hr(),
h3(tags$strong("Additional information")),
h4(tags$strong('About the tool:')),
h4('This tool is a Web app created to facilitate conducting meta-analysis for researchers with no programming background.'),br(),
h4(tags$strong('About the Author:')),
div(style="display: inline-block;vertical-align:top;",
img(width='120px',heigh='120px', src= "Author.png",)),
div(style="display: inline-block;vertical-align:top; width:350px;",
h4('I am',strong('Ibrahim H. Elkhidir'), 'a physician and a certified data scientist,'),
h4('University of khartoum faculty of medicine.'),
h4(span(strong('Email: ')),a('ibrahim_hassan12@yahoo.com', href='mailto:ibrahim_hassan12@yahoo.com'))),
hr(),
h3(tags$strong("Funding statement")),
h4('No funding'),
hr(),
h3(tags$strong('Acknowledgements')),
h4('All thanks to',code("Almighty 'Allah'"),'. Then i want to thanks my mother(',code('Sana Ibrahim'),') and father(',code('Hassan Eldaw'),') to continueously supporting the project',
'till completion.',br(),'I want to thanks my beloved ones',
tags$ul(
tags$li(code('Kahil H. Elkhidir')),
tags$li(code('Awam H. Elkhidir')),
tags$li(code('Dareen H. Elkhidir')),
tags$li(code('Dorar H. Elkhidir')))
# ,br(),'Then i want to express gratitude to:',
# tags$ul(
# tags$li(code('Osman O. Ali')),
# tags$li(code('Mohammed Nimmir')),
# tags$li(code('Mohammed S. Muneer')))
),
hr(),
#h3(tags$strong('References and citations'))
),
# What's new ----
tabPanel("What's new",
column(width = 6,offset = 1,
htmlOutput('whatsnew')
# includeHTML('version.html')
# h4(tags$b('Version 1.0')),
# h4('In this release, the app will be able to do meta-analysis including the basic methods(basic pooling of summary measures, subgroup analysis, forest, drapery, funnel plots.)'),
# br(),
# h4('It will also allow you to run advanced methods like trim and fill, meta-regression, sensetivity analysis, p-hacking or pcurve estimation, as well as GOSH plot.'),
# br(),br(),
# h4(strong('note',style='color:red'), 'the GOSH analysis is computationaly exhausting so if you run on slow machine the app will get stuck, and in that case you need just to reload the page.')
)
),
# Support me ----
tabPanel("Support",
column(width = 4, br(),
tags$blockquote(
p(style="text-align;", br(),br(),br(),"This project wasn't easy to implement, but thanks for the closest ones to lend me support that i was able to complete it!.",br(),br() ,"Supporting this project will make me able to add new features and addons in the future updates! The support links are available here."))
),
column(width = 4, align = 'center',
div(style = "height:300px",
h1(tags$b('Support the project')), br(),
h3(tags$b('Bank of khartoum (BOK)'), style = 'color:#C72020'),
h4('Account transfer',code('2239099')),
h4('Name:',code('Ibrahim hassan eldaw elkhider')),
h4('Card transfer',code('6392560026126678')),
br(),
h3(tags$b('Omdurman National Bank (Ocash)'), style = 'color:green'),
h4('Account transfer',code('0582705')),
h4('Card transfer',code('6278680005000698219'))),
br(), br(),
h3(tags$b('Patreon'), style = 'color:orange'),
h4(tags$a('Support the project on patreon!',href= 'https://www.patreon.com/join/ibrahimelkhidir'))
)
),
# tab panel 5: More ----
navbarMenu(
"More", #icon = icon("caret-down", lib = "font-awesome"),
tabPanel(
title = 'Upcoming', icon = icon("clock", lib = "font-awesome"),
{
sidebarLayout(
sidebarPanel(
h1(tags$b('More and more to come!')),br(),
p(h3('If you have any comments or any features you would like to be added in this app,
please don\'t hesitate and contact us at our email',br(),br(),
span(a("ibrahim_hassan12@yahoo.com", href = "ibrahim_hassan12@yahoo.com"))))
),
mainPanel(titlePanel(strong('Good luck!'))))
}
)
),
tabPanel(
fab_button(
actionButton(
icon = icon("sign-out-alt", lib = "font-awesome"),
inputId = "logout",
label = 'Sign out',
tooltip = "Logout"
)
)
)
# *********** the end ************ ---------
)
# )
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.