--- a +++ b/uieasyroc.R @@ -0,0 +1,1126 @@ +shinyUI(pageWithSidebar( + + titlePanel("easyROC: a web-tool for ROC curve analysis (ver. 1.1)"), + + sidebarPanel( + # Sol panelde nelerin yer alacağı bu bölümde belirleniyor. + # Tab panellerden veya sol panel içindeki çeşitli radyo butonlar + # checkbox'lar gibi seçimlerden sonra panelde nelerin değişeceği de + # ayrıca bir conditionalPanel() bloğu ile burada tanımlanabiliyor. + + conditionalPanel(condition="input.tabs1=='Introduction'", + HTML('<p><img src="multi.png" width=400 height=400></p>'), + tags$head(includeScript("google-analytics.js")) + + ), + + conditionalPanel(condition="input.tabs1=='Data upload'", + h4("Input data"), + #radioButtons("dataInput", "", list("Load example data"=1, "Upload a file"=2, "Paste your data"=3), selected=1), + radioButtons("dataInput", "", list("Load example data"=1, "Upload a file"=2), selected=1), + + selectizeInput("statusVar", "Name of the status variable", choices = NULL, multiple = FALSE), + textInput("valueStatus", "Value of the status:", ""), + HTML('<br>'), + + conditionalPanel(condition="input.dataInput=='1'", + h5("Load example data:"), + radioButtons("sampleData", "", list("Mayo data (n=312, p=4)"=1, "PBC data set (n=418, p=20)"=2), selected=1), + HTML('<p>n: number of observations</p>'), + HTML('<p>p: number of variables</p>') + ), + + conditionalPanel(condition="input.dataInput=='2'", + h5("Upload a delimited text file (max. 10MB): "), + #HTML('<i class="fa fa-beer fa-lg"></i>'), + fileInput("upload", "", multiple = FALSE), + radioButtons("fileSepDF", "Delimiter:", list("Comma"=1, "Tab"=2, "Semicolon"=3, "Space"=4),selected=2), + + conditionalPanel(condition="input.fileSepDF!='1'", + checkboxInput(inputId = "decimal", label = "Use comma as decimal", value = FALSE) + ), + + HTML('<br>'), + HTML('<p>You can upload your data as separated by comma, tab, semicolon or space.</p>'), + HTML('<p><b>Note</b>: First row must be header.</p>') + ), + + conditionalPanel(condition="input.dataInput=='3'", + h5("Paste or enter your data below:"), + tags$textarea(id="myData", rows=10, cols=5, ""), + actionButton('clearText_button','Clear data'), + HTML('<br>'), + HTML('<br>'), + + radioButtons("fileSepP", "Separator:", list("Comma"=1,"Tab"=2,"Semicolon"=3), selected=2), + HTML('<p>You can paste or manually enter your data as separated by comma, tab or semicolon.</p>'), + HTML('<p>Note: First row must be header.</p>') + ) + ), + + conditionalPanel(condition="input.tabs1=='ROC curve'", + + selectizeInput("markerInput", "Select markers (*)", choices = NULL, multiple = TRUE), + checkboxInput("lowhigh", "Higher values indicate disease", TRUE), + + HTML('<br>'), + + conditionalPanel(condition = "input.navbarROCcurve == 'Multiple Comparisons'", + selectInput(inputId = "MultipleCompMethod", label = "Multiple Comparison Method", selected = "bonferroni", + choices = c("Bonferroni" = "bonferroni", "False discovery rate" = "fdr", "None" = "none") + ), + HTML('<br>') + ), + + + helpText("(*) Multiple markers are allowed."), + HTML('<br>'), + + + checkboxInput(inputId = "advanced", label = "Advanced options", value = FALSE), + + conditionalPanel(condition = "input.advanced", + radioButtons(inputId = "StdErr", label = "1. Select a method for SE estimation", + choices = list("Mann-Whitney"="MW", "DeLong(1988)[+]"="DeLong", "Under Null Hyp."="Null", "Binomial"="Binomial"), selected = "DeLong"), + + radioButtons(inputId = "ConfInt", label = "2. Select a method for Conf. Interval", + choices = list("Mann-Whitney"="MW", "DeLong(1988)[+]"="DeLong", "Under Null Hyp."="Null", "Binomial Exact"="Exact"), selected = "DeLong"), + numericInput(inputId = "alpha", label = "Type I error", value = 0.05, min = 0, max = 1, step = 0.01), + HTML('<br>'), + HTML('<br>'), + helpText("[+]: Default options."), + HTML('<br>') + ), + + checkboxInput(inputId = "ROCplotOpts", label = "Plot options", value = FALSE), + + + + conditionalPanel(condition = "input.ROCplotOpts", + fluidRow(column(5,sliderInput("myheight", "Plot height:", value=400, min=200, max=1200)), + column(2), + column(5,sliderInput("mywidth", "Plot width:", value=400, min=200, max=1200 )) + ), + + HTML('<br>'), + + fluidRow( + column(10, selectizeInput("fontfamilyRC", "Font family", + choices = c("Times New Roman" = "serif", "Arial" = "sans", + "Corier New" = "mono"), selected = "sans")) + ), + + HTML('<br>'), + + selectizeInput("subGrpsRC", "", choices = c("Edit x-axis" = "xAxis", "Edit y-axis" = "yAxis", + "Other options" = "others"), selected = "xAxis"), + + conditionalPanel(condition = "input.subGrpsRC == 'others'", + fluidRow( + column(5, textInput("mainRC", "Graph title", "ROC Curve")), + column(1), + column(5, selectizeInput("font.mainRC", "Title font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "2")) + ), + + fluidRow( + column(5, textInput("col.mainRC", "Title color", "black")), + column(1), + column(5, numericInput("cex.mainRC", "Title size", min=0.1, max=5, value = 1.2, step = 0.1)) + ), + + fluidRow( + column(5, textInput("ROCcolRC", "ROC line color", "black,red")), + column(1), + column(5, selectizeInput("ROCltyRC", "ROC line type", + choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", + "\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", + "\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", + "\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", + "\U2500 \U2500 \U2500 \U2500 \U2500" = "5", + "\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), + selected = "1")) + ), + + textInput(inputId = "legend.namesRC", label = "Legend names", value = "") + ), + + conditionalPanel(condition = "input.subGrpsRC == 'xAxis'", + h5('X-axis options:'), + + ## X axis label options + fluidRow( + column(5, textInput("xlabRC", "Axis label", "1-Specificity")), + column(1), + column(5, selectizeInput("xfont.labRC", "Label font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("xcol.labRC", "Label color", "black")), + column(1), + column(5, numericInput("xcex.labRC", "Label size", min=0.1, max=5, value = 1, step = 0.1)) + ), + + ## X axis annotation options + fluidRow( + column(5, textInput("xcol.axisRC", "Annotation color", "black")), + column(1), + column(5, numericInput("xcex.axisRC", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) + ) + + #fluidRow( + # column(5, textInput("xcol11", "Axis color", "black")), + # column(1), + # column(5, textInput("xcol.ticks11", "Tickmarks color", "black")) + #), + ), + + conditionalPanel(condition = "input.subGrpsRC == 'yAxis'", + h5('Y-axis options:'), + + ## Y axis label options + fluidRow( + column(5, textInput("ylabRC", "Axis label", "Sensitivity")), + column(1), + column(5, selectizeInput("yfont.labRC", "Label font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("ycol.labRC", "Label color", "black")), + column(1), + column(5, numericInput("ycex.labRC", "Label size", min=0.1, max=5, value = 1, step = 0.1)) + ), + + ## Y axis annotation options + fluidRow( + column(5, textInput("ycol.axisRC", "Annotation color", "black")), + column(1), + column(5, numericInput("ycex.axisRC", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) + ) + ) + + ), + + conditionalPanel(condition = "input.navbarROCcurve == 'Partial AUC'", + + checkboxInput(inputId = "partialAUC", label = "Partial AUC", value = TRUE), + + conditionalPanel(condition = "input.partialAUC", + + fluidRow( + column(5, numericInput("pointA", "Value 1", min=0, max=1, value = 0.5, step = 0.1)), + column(1), + column(5, numericInput("pointB", "Value 2", min=0, max=1, value = 1, step = 0.1)) + ), + + selectizeInput("sensSpec", "Select a measure", choices = c("Sensitivity", "Specificity"), multiple = FALSE, selected = "Sensitivity") + + ) + ) + + ), + + + + + + conditionalPanel(condition="input.tabs1=='Cut points'", + h5("1. Select a marker"), + selectizeInput("cutoffMarker", "", choices = NULL, multiple = FALSE), + HTML('<br>'), + h5("2. Select a method for optimal cut-off (*)"), + selectizeInput("cutOffMethods", "", choices = c("Youden", "CB", "MCT", "MinValueSp", "MinValueSe", "ValueSe", "ValueSp", "MinValueSpSe", + "MaxSp", "MaxSe", "MaxSpSe", "MaxProdSpSe", "ROC01", "SpEqualSe", "MaxEfficiency", + "Minimax", "MaxDOR", "MaxKappa", "MinValueNPV", "MinValuePPV", "ValueNPV", "ValuePPV", + "MinValueNPVPPV", "PROC01", "NPVEqualPPV", "MaxNPVPPV", "MaxSumNPVPPV", "MaxProdNPVPPV", + "ValueDLR.Negative", "ValueDLR.Positive", "MinPvalue", "ObservedPrev", "MeanPrev", + "PrevalenceMatching"), multiple = FALSE), + #HTML('<br>'), + + conditionalPanel(condition="input.cutOffMethods=='Youden'", + HTML('<p><b>Youden:</b> Youden index</p>'), + HTML('<br>'), + numericInput(inputId = "CFP_Youden", label = "Cost of a False Positive", value = 1, min = 0, max = 9999999), + numericInput(inputId = "CFN_Youden", label = "Cost of a False Negative", value = 1, min = 0, max = 9999999), + checkboxInput(inputId = "generalized_Youden", label = "Generalized Youden Index", value = FALSE), + checkboxInput(inputId = "costs_benefits_Youden", label = "Cost-benefit based Youden Index", value = FALSE) + ), + + conditionalPanel(condition="input.cutOffMethods=='CB'", + HTML('<p><b>CB:</b> cost-benefit method</p>'), + HTML('<br>'), + numericInput(inputId = "costs_ratio", label = "Cost ratio", value = 1, min = 0, max = 99999999) + ), + + conditionalPanel(condition="input.cutOffMethods=='MCT'", + HTML('<p><b>MCT:</b> minimizes misclassification cost term</p>'), + HTML('<br>'), + numericInput(inputId = "CFP_MCT", label = "Cost of a False Positive", value = 1, min = 0, max = 9999999), + numericInput(inputId = "CFN_MCT", label = "Cost of a False Negative", value = 1, min = 0, max = 9999999) + ), + + conditionalPanel(condition="input.cutOffMethods=='MinValueSp'", + HTML('<p><b>MinValueSp:</b> a minimum value set for specificity</p>'), + HTML('<br>'), + numericInput(inputId = "valueSp_MVSp", label = "Value of Specificity", value = 0.85, min = 0, max = 1, step = 0.01) + ), + + conditionalPanel(condition="input.cutOffMethods=='MinValueSe'", + HTML('<p><b>MinValueSe:</b> a minimum value set for sensitivity</p>'), + HTML('<br>'), + numericInput(inputId = "valueSe_MVSe", label = "Value of Sensitivity", value = 0.85, min = 0, max = 1, step = 0.01) + ), + + conditionalPanel(condition="input.cutOffMethods=='ValueSe'", + HTML('<p><b>ValueSe:</b> a value set for sensitivity</p>'), + HTML('<br>'), + numericInput(inputId = "valueSe_VSe", label = "Value of Sensitivity", value = 0.85, min = 0, max = 1, step = 0.01) + ), + + conditionalPanel(condition="input.cutOffMethods=='ValueSp'", + HTML('<p><b>ValueSp:</b> a value set for specificity</p>'), + HTML('<br>'), + numericInput(inputId = "valueSp_VSp", label = "Value of Specificity", value = 0.85, min = 0, max = 1, step = 0.01) + ), + + conditionalPanel(condition="input.cutOffMethods=='MinValueSpSe'", + HTML('<p><b>MinValueSpSe:</b> a minimum value set for specificity and sensitivity</p>'), + HTML('<br>'), + numericInput(inputId = "valueSe_MVSpSe", label = "Value of Sensitivity", value = 0.85, min = 0, max = 1, step = 0.01), + numericInput(inputId = "valueSp_MVSpSe", label = "Value of Specificity", value = 0.85, min = 0, max = 1, step = 0.01), + checkboxInput(inputId = "maxSp_MVSpSe", label = "Maximum specificity", value = TRUE) + ), + + conditionalPanel(condition="input.cutOffMethods=='MaxSp'", + HTML('<p><b>MaxSp:</b> maximizes specificity</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='MaxSe'", + HTML('<p><b>MaxSe:</b> maximizes sensitivity</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='MaxSpSe'", + HTML('<p><b>MaxSpSe:</b> maximizes sensitivity and specificity simultaneously</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='MaxProdSpSe'", + HTML('<p><b>MaxProdSpSe:</b> maximizes the product of sensitivity and specificity or accuracy area</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='ROC01'", + HTML('<p><b>ROC01:</b> minimizes distance between ROC plot and point (0,1)</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='SpEqualSe'", + HTML('<p><b>SpEqualSe:</b> sensitivity = specificity</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='MaxEfficiency'", + HTML('<p><b>MaxEfficiency:</b> maximizes efficiency or accuracy, similar to minimize error rate </p>'), + HTML('<br>'), + checkboxInput(inputId = "costs_benefits_Efficiency", label = "Cost-benefit based Efficiency", value = FALSE), + checkboxInput(inputId = "standard_deviation_accuracy", label = "Standart deviation accuracy", value = FALSE) + ), + + conditionalPanel(condition="input.cutOffMethods=='Minimax'", + HTML('<p><b>Minimax:</b> minimizes the most frequent error</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='MaxDOR'", + HTML('<p><b>MaxDOR:</b> maximizes diagnostic odds ratio</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='MaxKappa'", + HTML('<p><b>MaxKappa:</b> maximizes kappa index</p>'), + HTML('<br>'), + numericInput(inputId = "CFP_MK", label = "Cost of a False Positive", value = 1, min = 0, max = 9999999), + numericInput(inputId = "CFN_MK", label = "Cost of a False Negative", value = 1, min = 0, max = 9999999), + checkboxInput(inputId = "weighted_Kappa", label = "Weighted Kappa", value = FALSE) + ), + + conditionalPanel(condition="input.cutOffMethods=='MinValueNPV'", + HTML('<p><b>MinValueNPV:</b> a minimum value set for negative predictive value</p>'), + HTML('<br>'), + numericInput(inputId = "valueNPV_MVNPV", label = "Value of NPV", value = 0.85, min = 0, max = 1, step = 0.01) + ), + + conditionalPanel(condition="input.cutOffMethods=='MinValuePPV'", + HTML('<p><b>MinValuePPV:</b> a minimum value set for positive predictive value</p>'), + HTML('<br>'), + numericInput(inputId = "valuePPV_MVPPV", label = "Value of PPV", value = 0.85, min = 0, max = 1, step = 0.01) + ), + + conditionalPanel(condition="input.cutOffMethods=='ValueNPV'", + HTML('<p><b>ValueNPV:</b> a value set for negative predictive value</p>'), + HTML('<br>'), + numericInput(inputId = "valueNPV_VNPV", label = "Value of NPV", value = 0.85, min = 0, max = 1, step = 0.01) + ), + + conditionalPanel(condition="input.cutOffMethods=='ValuePPV'", + HTML('<p><b>ValuePPV:</b> a value set for positive predictive value</p>'), + HTML('<br>'), + numericInput(inputId = "valuePPV_VPPV", label = "Value of PPV", value = 0.85, min = 0, max = 1, step = 0.01) + ), + + conditionalPanel(condition="input.cutOffMethods=='MinValueNPVPPV'", + HTML('<p><b>MinValueNPVPPV:</b> a minimum value set for predictive values</p>'), + HTML('<br>'), + numericInput(inputId = "valuePPV_MVNPVPPV", label = "Value of PPV", value = 0.85, min = 0, max = 1, step = 0.01), + numericInput(inputId = "valueNPV_MVNPVPPV", label = "Value of NPV", value = 0.85, min = 0, max = 1, step = 0.01), + checkboxInput(inputId = "maxNPV_MVNPVPPV", label = "Maximum NPV", value = TRUE) + ), + + conditionalPanel(condition="input.cutOffMethods=='PROC01'", + HTML('<p><b>PROC01:</b> minimizes distance between PROC plot and point (0,1)</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='NPVEqualPPV'", + HTML('<p><b>NPVEqualPPV:</b> negative predictive value = positive predictive value</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='MaxNPVPPV'", + HTML('<p><b>MaxNPVPPV:</b> maximizes positive predictive value and negative predictive value simultaneously</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='MaxSumNPVPPV'", + HTML('<p><b>MaxSumNPVPPV:</b> maximizes the sum of the predictive values</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='MaxProdNPVPPV'", + HTML('<p><b>MaxProdNPVPPV:</b> maximizes the product of predictive values</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='ValueDLR.Negative'", + HTML('<p><b>ValueDLR.Negative:</b> a value set for negative diagnostic likelihood ratio</p>'), + HTML('<br>'), + numericInput(inputId = "valueDLR_Negative", label = "Value of Negative DLR", value = 0.5, min = 0, max = 999999) + ), + + conditionalPanel(condition="input.cutOffMethods=='ValueDLR.Positive'", + HTML('<p><b>ValueDLR.Positive:</b> a value set for positive diagnostic likelihood ratio</p>'), + HTML('<br>'), + numericInput(inputId = "valueDLR_Positive", label = "Value of Positive DLR", value = 2, min = 0, max = 999999) + ), + + conditionalPanel(condition="input.cutOffMethods=='MinPvalue'", + HTML('<p><b>MinPvalue:</b> minimizes p-value associated with the statistical Chi-squared test which measures the association between the marker and the binary result obtained on using the cutpoint</p>'), + HTML('<br>'), + selectInput(inputId = "adjusted_pvalue", label = "Adjustment method for p-value", + choices = c("Miller and Siegmund" = "PADJMS", "Altman_5" = "PALT5", "Altman_10" = "PALT10"), + multiple = FALSE, selected = "PADJMS") + ), + + conditionalPanel(condition="input.cutOffMethods=='ObservedPrev'", + HTML('<p><b>ObservedPrev:</b> the closest value to observed prevalence</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='MeanPrev'", + HTML('<p><b>MeanPrev:</b> the closest value to the mean of the diagnostic test values</p>') + ), + + conditionalPanel(condition="input.cutOffMethods=='PrevalenceMatching'", + HTML('<p><b>PrevalenceMatching:</b> the value for which predicted prevalence is practically equal to observed prevalence</p>') + ), + + HTML('<br>'), + HTML('<p>(*) See <a href="http://cran.r-project.org/web/packages/OptimalCutpoints/index.html" target="_blank"> OptimalCutpoints</a> package from R</p>'), + HTML('<br>'), + + checkboxInput("showPlots", "Include plots.", FALSE), + + conditionalPanel(condition="input.showPlots", + fluidRow( + column(1), + column(5, sliderInput("myheightCutoff", "Plot height:", value=600, min=400, max=1400)), + column(1), + column(5, sliderInput("mywidthCutoff", "Plot width:", value=800, min=400, max=1400 )) + ), + + HTML('<br>'), + checkboxInput("cutoffPlotsOpts", "More plot options (See Manual)", FALSE), + HTML('<br>') + ), + + conditionalPanel(condition="input.cutoffPlotsOpts", + fluidRow( + column(10, selectizeInput("fontfamily", "Font family", + choices = c("Times New Roman" = "serif", "Arial" = "sans", + "Corier New" = "mono"), selected = "sans")) + ), + + radioButtons("selectedGraph", "", list("Top Left \U2003 \U2003" = 1, "Top Right \U2003 \U2003" = 2, + "Bottom Left \U2002\U2008" = 3, "Bottom Right" = 4), selected=1), + + HTML('<br>'), + + selectizeInput("subGrps", "", choices = NULL, selected = NULL), + + ## First graph options (11) + conditionalPanel(condition = "input.selectedGraph == '1'", + + conditionalPanel(condition = "input.subGrps == 'others'", + fluidRow( + column(5, textInput("main11", "Graph title", "ROC Curve")), + column(1), + column(5, selectizeInput("font.main11", "Title font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "2")) + ), + + fluidRow( + column(5, textInput("col.main11", "Title color", "black")), + column(1), + column(5, numericInput("cex.main11", "Title size", min=0.1, max=5, value = 1.2, step = 0.1)) + ), + + fluidRow( + column(5, textInput("ROCcol11", "ROC line color", "black")), + column(1), + column(5, selectizeInput("ROClty11", "ROC line type", + choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", + "\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", + "\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", + "\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", + "\U2500 \U2500 \U2500 \U2500 \U2500" = "5", + "\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), + selected = "1")) + ) + ), + + conditionalPanel(condition = "input.subGrps == 'xAxis'", + h5('X-axis options:'), + + ## X axis label options + fluidRow( + column(5, textInput("xlab11", "Axis label", "1-Specificity")), + column(1), + column(5, selectizeInput("xfont.lab11", "Label font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("xcol.lab11", "Label color", "black")), + column(1), + column(5, numericInput("xcex.lab11", "Label size", min=0.1, max=5, value = 1, step = 0.1)) + ), + + ## X axis annotation options + fluidRow( + column(5, textInput("xcol.axis11", "Annotation color", "black")), + column(1), + column(5, numericInput("xcex.axis11", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) + ) + + #fluidRow( + # column(5, textInput("xcol11", "Axis color", "black")), + # column(1), + # column(5, textInput("xcol.ticks11", "Tickmarks color", "black")) + #), + ), + + conditionalPanel(condition = "input.subGrps == 'yAxis'", + h5('Y-axis options:'), + + ## Y axis label options + fluidRow( + column(5, textInput("ylab11", "Axis label", "Sensitivity")), + column(1), + column(5, selectizeInput("yfont.lab11", "Label font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("ycol.lab11", "Label color", "black")), + column(1), + column(5, numericInput("ycex.lab11", "Label size", min=0.1, max=5, value = 1, step = 0.1)) + ), + + ## Y axis annotation options + fluidRow( + column(5, textInput("ycol.axis11", "Annotation color", "black")), + column(1), + column(5, numericInput("ycex.axis11", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) + ) + ) + ), + + ## Second graph options (12) + conditionalPanel(condition = "input.selectedGraph == '2'", + + conditionalPanel(condition = "input.subGrps == 'others'", + fluidRow( + column(5, textInput("main12", "Graph title", "Sens. & Spec. Curve")), + column(1), + column(5, selectizeInput("font.main12", "Title font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "2")) + ), + + fluidRow( + column(5, textInput("col.main12", "Title color", "black")), + column(1), + column(5, numericInput("cex.main12", "Title size", min=0.1, max=5, value = 1.2, step = 0.1)) + ), + + fluidRow( + column(5, textInput("specCol", "Spec. line color", "blue")), + column(1), + column(5, selectizeInput("specType", "Spec. line type", + choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", + "\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", + "\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", + "\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", + "\U2500 \U2500 \U2500 \U2500 \U2500" = "5", + "\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("sensCol", "Sens. line color", "red")), + column(1), + column(5, selectizeInput("sensType", "Sens. line type", + choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", + "\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", + "\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", + "\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", + "\U2500 \U2500 \U2500 \U2500 \U2500" = "5", + "\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), + selected = "1")) + ) + ), + + conditionalPanel(condition = "input.subGrps == 'Legend'", + fluidRow( + column(5, selectizeInput("legendPos12", "Position", choices = c("Top right" = "topright", "Top left" = "topleft", "Bottom right" = "bottomright", "Bottom left" = "bottomleft", "xy coord." = "xy"), + selected = "topright")), + column(1), + column(2, + conditionalPanel(condition = "input.legendPos12 == 'xy'", + numericInput("legendXpos12", "x", value = 0, step = 0.1) + ) + ), + column(1), + column(2, + conditionalPanel(condition = "input.legendPos12 == 'xy'", + numericInput("legendYpos12", "y", value = 0, step = 0.02) + ) + ) + ), + + fluidRow( + column(7, textInput("legendNames12", "Leg. labels (comma sep.)", "Sens.,Spec.")), + column(1), + column(3, numericInput("cex.legend12", "Leg. size", min = 0.5, max = 5, step = 0.1, value = 1)) + ), + + fluidRow( + column(5, textInput("legendTitle12", "Title", "")), + column(1), + column(5, textInput("col.legendTitle12", "Title color", "black")) + ), + + checkboxInput("borderless12", label = "Remove borders.", value = FALSE) + ), + + conditionalPanel(condition = "input.subGrps == 'xAxis'", + h5('X-axis options:'), + + ## X axis label options + fluidRow( + column(5, textInput("xlab12", "Axis label", "Marker Name")), + column(1), + column(5, selectizeInput("xfont.lab12", "Label font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("xcol.lab12", "Label color", "black")), + column(1), + column(5, numericInput("xcex.lab12", "Label size", min=0.1, max=5, value = 1, step = 0.1)) + ), + + ## X axis annotation options + fluidRow( + column(5, textInput("xcol.axis12", "Annotation color", "black")), + column(1), + column(5, numericInput("xcex.axis12", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) + ) + ), + + conditionalPanel(condition = "input.subGrps == 'yAxis'", + h5('Y-axis options:'), + + ## Y axis label options + fluidRow( + column(5, textInput("ylab12", "Axis label", "Value")), + column(1), + column(5, selectizeInput("yfont.lab12", "Label font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("ycol.lab12", "Label color", "black")), + column(1), + column(5, numericInput("ycex.lab12", "Label size", min=0.1, max=5, value = 1, step = 0.1)) + ), + + ## Y axis annotation options + fluidRow( + column(5, textInput("ycol.axis12", "Annotation color", "black")), + column(1), + column(5, numericInput("ycex.axis12", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) + ) + ) + ), + + ## Third graph options (21) + conditionalPanel(condition = "input.selectedGraph == '3'", + + conditionalPanel(condition = "input.subGrps == 'others'", + fluidRow( + column(5, textInput("main21", "Graph title", "Distribution Graph")), + column(1), + column(5, selectizeInput("font.main21", "Title font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "2")) + ), + + fluidRow( + column(5, textInput("col.main21", "Title color", "black")), + column(1), + column(5, numericInput("cex.main21", "Title size", min=0.1, max=5, value = 1.2, step = 0.1)) + ), + + fluidRow( + column(6, textInput("lineColD", "Line color (Diseased)", "red")), + column(1), + column(5, selectizeInput("lineTypeD", "Line type", + choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", + "\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", + "\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", + "\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", + "\U2500 \U2500 \U2500 \U2500 \U2500" = "5", + "\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), + selected = "1")) + ), + + fluidRow( + column(6, textInput("lineColH", "Line color (Healthy)", "blue")), + column(1), + column(5, selectizeInput("lineTypeH", "Line type", + choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", + "\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", + "\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", + "\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", + "\U2500 \U2500 \U2500 \U2500 \U2500" = "5", + "\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), + selected = "1")) + ) + ), + + conditionalPanel(condition = "input.subGrps == 'Legend'", + fluidRow( + column(5, selectizeInput("legendPos21", "Position", choices = c("Top right" = "topright", "Top left" = "topleft", "Bottom right" = "bottomright", "Bottom left" = "bottomleft", "xy coord." = "xy"), + selected = "topright")), + column(1), + column(2, + conditionalPanel(condition = "input.legendPos21 == 'xy'", + numericInput("legendXpos21", "x", value = 0, step = 0.1) + ) + ), + column(1), + column(2, + conditionalPanel(condition = "input.legendPos21 == 'xy'", + numericInput("legendYpos21", "y", value = 0, step = 0.1) + ) + ) + ), + + fluidRow( + column(7, textInput("legendNames21", "Leg. labels (comma sep.)", "Diseased,Healthy")), + column(1), + column(3, numericInput("cex.legend21", "Leg. Size", min = 0.5, max = 5, step = 0.1, value = 1)) + ), + + fluidRow( + column(5, textInput("legendTitle21", "Title", "")), + column(1), + column(5, textInput("col.legendTitle21", "Title color", "black")) + ), + + checkboxInput("borderless21", label = "Remove borders.", value = FALSE) + ), + + conditionalPanel(condition = "input.subGrps == 'xAxis'", + h5('X-axis options:'), + + ## X axis label options + fluidRow( + column(5, textInput("xlab21", "Axis label", "Marker Name")), + column(1), + column(5, selectizeInput("xfont.lab21", "Label font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("xcol.lab21", "Label color", "black")), + column(1), + column(5, numericInput("xcex.lab21", "Label size", min=0.1, max=5, value = 1, step = 0.1)) + ), + + ## X axis annotation options + fluidRow( + column(5, textInput("xcol.axis21", "Annotation color", "black")), + column(1), + column(5, numericInput("xcex.axis21", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) + ) + ), + + conditionalPanel(condition = "input.subGrps == 'yAxis'", + h5('Y-axis options:'), + + ## Y axis label options + fluidRow( + column(5, textInput("ylab21", "Axis label", "Density")), + column(1), + column(5, selectizeInput("yfont.lab21", "Label font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("ycol.lab21", "Label color", "black")), + column(1), + column(5, numericInput("ycex.lab21", "Label size", min=0.1, max=5, value = 1, step = 0.1)) + ), + + ## Y axis annotation options + fluidRow( + column(5, textInput("ycol.axis21", "Annotation color", "black")), + column(1), + column(5, numericInput("ycex.axis21", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) + ) + ) + ), + + ## Fourth graph options (22) + conditionalPanel(condition = "input.selectedGraph == '4'", + conditionalPanel(condition = "input.subGrps == 'others'", + fluidRow( + column(5, textInput("main22", "Graph title", "Distribution Graph")), + column(1), + column(5, selectizeInput("font.main22", "Title font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "2")) + ), + + fluidRow( + column(5, textInput("col.main22", "Title color", "black")), + column(1), + column(5, numericInput("cex.main22", "Title size", min=0.1, max=5, value = 1.2, step = 0.1)) + ), + + numericInput("jitterAmount", "Amount of jittering", min=0.01, max = 0.5, value = 0.05, step = 0.01), + + ## pch options for Healthy and Diseased subjects + fluidRow( + column(8, textInput("colPoints", "Point colors (comma sep.)", "black,black")), + column(1), + column(2, numericInput("pchPoints", "Type", min = 0, max = 25, step = 1, value = 1)) + ), + + fluidRow( + column(3, numericInput("pchSize", "Point size", min = 0.1, max = 5, step = 0.1, value = 1)), + column(1), + column(7, + conditionalPanel(condition = "input.pchPoints > 20", + textInput("pchFill", "Fill points with color" ,"white,white") + ) + ) + ) + ), + + conditionalPanel(condition = "input.subGrps == 'xAxis'", + h5('X-axis options:'), + + ## X axis label options + fluidRow( + column(5, textInput("xlab22", "Axis label", "Disease Status")), + column(1), + column(5, selectizeInput("xfont.lab22", "Label font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("xcol.lab22", "Label color", "black")), + column(1), + column(5, numericInput("xcex.lab22", "Label size", min=0.1, max=5, value = 1, step = 0.1)) + ), + + ## X axis annotation options + fluidRow( + column(12, textInput("xlabels22", "Annotation names (comma seperated)", "Healthy,Diseased")) + ), + + fluidRow( + column(5, textInput("xcol.axis22", "Annotation color", "black")), + column(1), + column(5, numericInput("xcex.axis22", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) + ) + ), + + conditionalPanel(condition = "input.subGrps == 'yAxis'", + h5('Y-axis options:'), + + ## Y axis label options + fluidRow( + column(5, textInput("ylab22", "Axis label", "Marker Name")), + column(1), + column(5, selectizeInput("yfont.lab22", "Label font", choices = c("Regular" = "1", "Bold" = "2", + "Italic" = "3", "Bold Italic" = "4"), + selected = "1")) + ), + + fluidRow( + column(5, textInput("ycol.lab22", "Label color", "black")), + column(1), + column(5, numericInput("ycex.lab22", "Label size", min=0.1, max=5, value = 1, step = 0.1)) + ), + + ## Y axis annotation options + fluidRow( + column(5, textInput("ycol.axis22", "Annotation color", "black")), + column(1), + column(5, numericInput("ycex.axis22", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) + ) + ) + ) + ) + ), + + +conditionalPanel(condition="input.tabs1=='Sample size'", + +h5("Choose one of the following methods (*):"), +HTML('<br>'), + + +checkboxInput("singleTest", "Single diagnostic test", FALSE), + +conditionalPanel(condition="input.singleTest", + +numericInput(inputId = "alpha1", label = "Type I error", value = 0.05, min = 0, max = 1, step = 0.01), +numericInput(inputId = "power1", label = "Power", value = 0.80, min = 0, max = 1, step = 0.1), +numericInput(inputId = "auc", label = "Area under the ROC curve", value = 0.60, min = 0.5, max = 1, step = 0.1), +numericInput(inputId = "ratio", label = "Allocation ratio", value = 1, min = 0, step = 0.1) + +), + +HTML('<br>'), + +checkboxInput("twoTests", "Comparison of two diagnostic tests", FALSE), + +conditionalPanel(condition="input.twoTests", + +numericInput(inputId = "alpha2", label = "Type I error", value = 0.05, min = 0, max = 1, step = 0.01), +numericInput(inputId = "power2", label = "Power", value = 0.80, min = 0, max = 1, step = 0.1), +numericInput(inputId = "auc01", label = "AUC for 1st test under null hypothesis", value = 0.80, min = 0.5, max = 1, step = 0.1), +numericInput(inputId = "auc02", label = "AUC for 2nd test under null hypothesis", value = 0.80, min = 0.5, max = 1, step = 0.1), +numericInput(inputId = "auc11", label = "AUC for 1st test under alternative hypothesis", value = 0.90, min = 0.5, max = 1, step = 0.1), +numericInput(inputId = "auc12", label = "AUC for 2nd test under alternative hypothesis", value = 0.70, min = 0.5, max = 1, step = 0.1), +numericInput(inputId = "ratio2", label = "Allocation ratio", value = 1, min = 0, step = 0.1) + +), +HTML('<br>'), + + +checkboxInput("StandardVsNew", "Noninferiority of a new test to a standard test", FALSE), + + +conditionalPanel(condition="input.StandardVsNew", + +numericInput(inputId = "alpha3", label = "Type I error", value = 0.05, min = 0, max = 1, step = 0.01), +numericInput(inputId = "power3", label = "Power", value = 0.80, min = 0, max = 1, step = 0.1), +numericInput(inputId = "aucs", label = "AUC for standard test", value = 0.80, min = 0.5, max = 1, step = 0.1), +numericInput(inputId = "aucn", label = "AUC for new test", value = 0.80, min = 0.5, max = 1, step = 0.1), +numericInput(inputId = "sd", label = "Smallest difference", value = 0.1, step = 0.1), +numericInput(inputId = "ratio3", label = "Allocation ratio", value = 1, min = 0, step = 0.1) + +), + +HTML('<br>'), +HTML('<p>(*) See <a href="http://66.199.228.237/boundary/complex_decision_making_and_ethics/ROC_Analysis.pdf" target="_blank"> Obuchowski, 2005</a> for further details.</p>'), +HTML('<br>') + + +), + + + conditionalPanel(condition="input.tabs1=='Manual'", + HTML('<p align="center"><img src="manual.png" width=200 height=200></p>') + ), + + conditionalPanel(condition="input.tabs1=='Authors & News'", + HTML('<p align="center"> <a href="https://www.hacettepe.edu.tr/english/" target="_blank"><img src="hulogo.JPEG" width=150 height=150></a> </p>') + ) + ), + + + mainPanel( + # Tab panelinden herhangi bir sekme seçildiği zaman ana bölmede (Ekranın orta kısmı) + # nelerin görüneceği bu kısımda tanımlanıyor. Belirli koşullar tanımlanmak istenir ise + # ayrıca bir conditionalPanel() bloğu burada tanımlanabilir. + tabsetPanel( + tabPanel(title="Introduction", + h5("The easiest way to perform ROC analysis!"), + HTML('<p> A receiver operating characteristics (ROC) curve is a graphical approach which + assess the performance of a binary classifier system. The ROC curve analysis is widely + used in medicine, radiology, biometrics and various application of machine learning. </p>'), + HTML('<p align="justify"> Here we developed an easy way to carry out ROC analysis. + This application creates ROC curves, calculates area under the curve (AUC) + values and confidence intervals for the AUC values, and performs multiple comparisons + for ROC curves in a user-friendly, up-to-date and comprehensive way. Moreover, + easyROC computes and compares partial AUCs. It can also perform sample size calculation.</p>'), + + HTML('<p> An important feature of this application is to determine cut-off values especially + for diagnostic tests. For this task, we made use of + <a href="http://cran.r-project.org/web/packages/OptimalCutpoints/index.html" target="_blank">OptimalCutpoints</a> package (Lopez-Raton et al, 2014) of R [1].</p>'), + +#HTML('<br>'), + + HTML('<p><div align="center"><table cellpadding="0" cellspacing="0"><tr><td><img src="ROCplot.png" width="300" height="300" border="10000"></td><td><img src="CutOff_Plots.png" width="400" height="400" border="70"></td></tr></table></div></p>'), + +# HTML('<br>'), + + + h6("[1] Monica Lopez-Raton, Maria Xose Rodriguez-Alvarez, Carmen Cadarso Suarez, Francisco Gude Sampedro (2014). OptimalCutpoints: An R Package for Selecting Optimal Cutpoints in Diagnostic Tests. Journal of Statistical Software, 61(8), 1-36.") + ), + + tabPanel("Data upload", + navbarPage(title = '', + tabPanel('Data', dataTableOutput('RawData')) + ) + ), + + tabPanel("ROC curve", + downloadButton("downloadROCStats", "Download ROC statistics as txt-file"), + downloadButton("downloadROCData", "Download ROC coordinates as txt-file"), + downloadButton("downloadROCPlot", "Download plot as pdf-file"), + + h4(textOutput(outputId = "section1")), + navbarPage(id = "navbarROCcurve", + title = '', + tabPanel('Statistics', dataTableOutput('ROCstatistics')), + tabPanel('ROC Coordinates', dataTableOutput('ROCcoordinates')), + tabPanel('Multiple Comparisons', dataTableOutput('ROCcomparisons')), + tabPanel('Partial AUC', dataTableOutput('resultPAuc')) + + + + ), + + conditionalPanel(condition = "input.navbarROCcurve != 'ROC Coordinates'", + textOutput(outputId = "CIreminderLine1"), + h6(textOutput(outputId = "CIreminderLine2")) + ), + + HTML('<br>'), + h4(textOutput(outputId = "section2")), + plotOutput("ROCplot") + + + +#verbatimTextOutput("resultPAuc") + ), + + tabPanel("Cut points", + downloadButton("downloadCutOffresults", "Download results as txt-file"), + downloadButton("downloadCutOffPlotPDF", "Download plots as pdf-file"), + verbatimTextOutput("cutPoints"), + + ## İçeriği sayfada ortalamak için kullanılan HTML kodu. + HTML('<div align="center">'), + plotOutput("cutPointsPlot"), + HTML('</div>') + ), + +tabPanel(title="Sample size", + +downloadButton("downloadSampleSizeResults", "Download results as txt-file"), +verbatimTextOutput("SampleSizeForRoc") + + +), + + tabPanel(title="Manual", + h5("Detailed manual will be released soon...") + ), + + tabPanel("Authors & News", + h4("Authors"), + HTML('<p><a href="http://www.biostatistics.hacettepe.edu.tr/cv/Dincer_Goksuluk_CV_Eng.pdf" target="_blank"> <b>Dincer Goksuluk</b></a><p>'), + HTML('<p>Hacettepe University Faculty of Medicine <a href="http://www.biostatistics.hacettepe.edu.tr" target="_blank"> Department of Biostatistics</a><p>'), + HTML('<p><a href="mailto:dincer.goksuluk@hacettepe.edu.tr" target="_blank">dincer.goksuluk@hacettepe.edu.tr</a><p>'), + HTML('<p><a href="http://yunus.hacettepe.edu.tr/~selcuk.korkmaz/" target="_blank"> <b>Selcuk Korkmaz</b></a><p>'), + HTML('<p>Hacettepe University Faculty of Medicine <a href="http://www.biostatistics.hacettepe.edu.tr" target="_blank"> Department of Biostatistics</a><p>'), + HTML('<p><a href="mailto:selcuk.korkmaz@hacettepe.edu.tr" target="_blank">selcuk.korkmaz@hacettepe.edu.tr</a><p>'), + HTML('<p><a href="http://www.biostatistics.hacettepe.edu.tr/cv/Gokmen_Zararsiz_CV_Eng.pdf" target="_blank"> <b>Gokmen Zararsiz</b></a><p>'), + HTML('<p>Hacettepe University Faculty of Medicine <a href="http://www.biostatistics.hacettepe.edu.tr" target="_blank"> Department of Biostatistics</a><p>'), + HTML('<p><a href="mailto:gokmen.zararsiz@hacettepe.edu.tr" target="_blank">gokmen.zararsiz@hacettepe.edu.tr</a><p>'), + HTML('<br>'), + h4("News"), + HTML('<br>'), + HTML('<p><b> Version 1.1 (June 23, 2015) </b><p>'), + HTML('<p> (1) Partial AUC feature has been added.<p>'), + HTML('<p> (2) Sample size calculation tab has been added.<p>'), + HTML('<p> (3) Minor improvements and bug fixes.<p>'), + + HTML('<br>'), + HTML('<p><b> Version 1.0 (March 19, 2015)</b><p>'), + HTML('<p> (1) Initial version has been released.<p>'), + HTML('<br>'), + + + h5("Other Tools"), + + HTML('<p><a href="http://www.biosoft.hacettepe.edu.tr/MLViS/" target="_blank"> <b>MLViS: a machine learning-based virtual screening tool</b></a><p>'), + HTML('<p><a href="http://www.biosoft.hacettepe.edu.tr/MVN/" target="_blank"> <b>MVN: a web-tool for assessing multivariate normality </b></a><p>'), + HTML('<p><a href="http://www.biosoft.hacettepe.edu.tr/DDNAA/" target="_blank"> <b>DDNAA: Decision support system for differential diagnosis of nontraumatic acute abdomen </b></a><p>'), + HTML('<br>'), + + h6("Please feel free to send us bugs and feature requests.") + ), + + #tabPanel("News", + # h4("New Features") + #), + id="tabs1" + ), + + tags$head(tags$style(type="text/css", "label.radio { display: inline-block; }", ".radio input[type=\"radio\"] { float: none; }"), + tags$style(type="text/css", "select { max-width: 200px; }"), + tags$style(type="text/css", "textarea { max-width: 185px; }"), + tags$style(type="text/css", ".jslider { max-width: 200px; }"), + tags$style(type='text/css', ".well { max-width: 330px; }"), + tags$style(type='text/css', ".span4 { max-width: 330px; }")), + + tags$head( + tags$link(rel = "shortcut icon", href = "favicon-2.ico")) + + ) +)) + + + +