UI.R
library(shiny)
library(ggplot2)
library(xtable)
library(plotly)
shinyUI(pageWithSidebar(
# Header:
headerPanel("Data explorer"),
# Input in sidepanel:
sidebarPanel(
# Upload data:
fileInput("file", "Upload any CSV format file:"),
htmlOutput("Y"),
htmlOutput("X"),
htmlOutput("group"),
htmlOutput("group2")
),
# Main:
mainPanel(
navbarPage("",
tabPanel("Data", dataTableOutput("table")),
navbarMenu("Uni",
tabPanel("Histogram",sliderInput("breaks","Breaks:",min=5,max=30,value=10),plotlyOutput("hist")),
tabPanel("Boxplot with mean shown in red", plotlyOutput("box2"))),
navbarMenu("Regression",
tabPanel("Linear plot",plotlyOutput("lplot")),
tabPanel("Quadratic plot", plotlyOutput("qplot")),
tabPanel("Regression summary",htmlOutput("sumtable"),htmlOutput("sumtext"),verbatimTextOutput("sum")),
tabPanel("Regression anova", htmlOutput("antable"),verbatimTextOutput("anova")),
#tabPanel("Description", htmlOutput("txt3")),
tabPanel("Regression Diagnostics", plotOutput("dplot")),
tabPanel("Quadratic summary", verbatimTextOutput("quadsum")),
tabPanel("Quadratic anova",verbatimTextOutput("quadanova"))),
navbarMenu("Non parametric",
tabPanel("Spline plot", plotlyOutput("splot")),
tabPanel("Non parametric (rank) plot", plotlyOutput("rplot")),
tabPanel("Spearman's rank correlation",verbatimTextOutput("cor"))),
navbarMenu("GLM",
tabPanel("Poisson plot for counts", plotlyOutput("poisplot")),
tabPanel("Negbin plot for counts", plotlyOutput("nbplot")),
tabPanel("Binomial plot for ones and zeros", plotlyOutput("binplot")),
tabPanel("Poisson summary", verbatimTextOutput("poissum")),
tabPanel("Negbin summary", verbatimTextOutput("nbsum")),
tabPanel("Poisson anova",verbatimTextOutput("poisanova")),
tabPanel("Negbin anova",verbatimTextOutput("nbanova"))),
navbarMenu("ANOVA",
tabPanel("Boxplot", plotlyOutput("boxplot")),
tabPanel("Confidence intervals", plotlyOutput("ciplot")),
tabPanel("ANOVA", verbatimTextOutput("ANOVA")),
tabPanel("Tukey pairwise", verbatimTextOutput("tukey"),plotOutput("tukeyplot"))),
navbarMenu("Grouped",
tabPanel("Linear plots", plotlyOutput("lplot2")),
tabPanel("Spline plots", plotlyOutput("splot2")),
tabPanel("Box plots", plotlyOutput("boxplot2")),
tabPanel("Confidence intervals", plotlyOutput("ciplot2")))
)
)
))
Server code
library(shiny)
library(ggplot2)
library(xtable)
library(plotly)
library(MASS)
library(Hmisc)
load("marinverts.rob")
wd <- getwd()
setwd("..")
datadir <- getwd()
datadir<-paste(datadir,"/data/",sep="")
setwd(wd)
datadir
shinyServer(function(input, output) {
# load data -------------------------------------------------------------------
Dataload <- reactive({
if (is.null(input$file)) {
# User has not uploaded a file yet
return(marinverts)
}
Dataset <- as.data.frame(read.csv(input$file$datapath))
out<-paste("data/",input$file$name,sep="")
write.csv(Dataset,file=out,row.names = FALSE)
return(Dataset)
})
Dataset<-reactive(Dataload())
# Show data table ---------------------------------------------------------
output$table <- renderDataTable(Dataset())
# setup variables -----------------------------------------------------------------------
varnames<-reactive({
d<-Dataset()
names(d)[sapply(d,is.numeric)]
})
factornames<-reactive({
d<-Dataset()
names(d)[sapply(d,is.factor)]
})
output$X <- renderUI({
selectInput("X", "Independent numerical variable (X axis)", varnames())
})
output$Y <- renderUI({
selectInput("Y", "Dependent numerical variable (Y axis)", varnames(),selected=varnames()[2])
})
output$group <- renderUI({
selectInput("group", "Grouping variable (factor)", factornames(),selected=factornames()[1])
})
output$group2 <- renderUI({
selectInput("group2", "Second grouping variable (for conditional boxplots)", factornames(),selected=factornames()[2])
})
# initiate plots ----------------------------------------------------------
ggx<-reactive({
x<-input$Y
d<-Dataset()
tx<-sprintf("g0<-ggplot(data=d,aes(x=%s))",x)
eval(parse(text=tx))
return(g0)
})
ggy<-reactive({
x<-input$Y
d<-Dataset()
tx<-sprintf("g0<-ggplot(data=d,aes(y=%s,x=''))",x)
eval(parse(text=tx))
return(g0)
})
ggstart<-reactive({
x<-input$X
y<-input$Y
d<-Dataset()
tx<-sprintf("g0<-ggplot(data=d,aes(x=%s,y=%s))",x,y)
eval(parse(text=tx))
return(g0)
})
ggbstart<-reactive({
x<-input$group
y<-input$Y
d<-Dataset()
tx<-sprintf("g0<-ggplot(data=d,aes(x=%s,y=%s))",x,y)
eval(parse(text=tx))
return(g0)
})
ggcstart<-reactive({
x<-input$X
y<-input$Y
group<-input$group
d<-Dataset()
tx<-sprintf("g0<-ggplot(data=d,aes(x=%s,y=%s)) + facet_wrap(~%s)",x,y,group)
eval(parse(text=tx))
return(g0)
})
ggcbstart<-reactive({
x<-input$group
y<-input$Y
group<-input$group2
d<-Dataset()
tx<-sprintf("g0<-ggplot(data=d,aes(x=%s,y=%s)) + facet_wrap(~%s)",x,y,group)
eval(parse(text=tx))
return(g0)
})
# Form the plots --------------------------------------------------------------
output$hist <- renderPlotly({
g0<-ggx()
g1<-g0+geom_histogram(bins=input$breaks,fill="grey",col="black") +theme_classic()
ggplotly(g1)
})
output$box1 <- renderPlotly({
g0<-ggy()
g1<-g0+geom_boxplot() +theme_bw() + coord_flip()
ggplotly(g1)
})
output$box2 <- renderPlotly({
g0<-ggy()
g0<-g0 + stat_summary(fun.y=mean,geom="point",col="red")
g1<-g0+geom_boxplot() +theme_bw() + coord_flip()
ggplotly(g1)
})
# linearplots --------------------------------------------------------------
output$lplot <- renderPlotly({
g0<-ggstart()
g1<-g0+geom_point() + geom_smooth(method=lm)+theme_bw()
ggplotly(g1)
})
# quadratic plot ------------------------------------------------------------
output$qplot <- renderPlotly({
g0<-ggstart()
g1<-g0+geom_point() + geom_smooth(method="lm",formula=y~x+I(x^2), se=TRUE) +theme_bw()
ggplotly(g1)
})
# spline plot -------------------------------------------------------------
output$splot <- renderPlotly({
g0<-ggstart()
g1<-g0+geom_point() + geom_smooth() +theme_bw()
ggplotly(g1)
})
# glmplots -------------------------------------------------------------
output$nbplot <- renderPlotly({
g0<-ggstart()
g1<-g0+geom_point() +geom_smooth(method="glm.nb", se=TRUE) +theme_bw()
ggplotly(g1)
})
output$binplot <- renderPlotly({
g0<-ggstart()
g1<-g0+geom_point()+stat_smooth(method="glm",method.args=list(family="binomial"))
g1<-g1 +theme_bw()
ggplotly(g1)
})
output$poisplot <- renderPlotly({
g0<-ggstart()
g1<-g0+geom_point() +theme_bw()
g1<-g1+ stat_smooth(method="glm",method.args=list( family="poisson"), se=TRUE)
ggplotly(g1)
})
# boxplot -------------------------------------------------------------
output$boxplot <- renderPlotly({
g0<- ggbstart()
g1<-g0+geom_boxplot() +theme_bw()
ggplotly(g1)
})
# confidence interval plot -------------------------------------------------------------
output$ciplot <- renderPlotly({
g0<- ggbstart()
g1<-g0+stat_summary(fun.data=mean_cl_normal,geom="errorbar")
g1<-g1+theme_bw()
g1<-g1+stat_summary(fun.y=mean,geom="point")
ggplotly(g1)
})
# conditional plots --------------------------------------------------------------
output$lplot2 <- renderPlotly({
g0<-ggcstart()
g1<-g0+geom_point() + geom_smooth(method=lm)+theme_bw()
ggplotly(g1)
})
output$splot2 <- renderPlotly({
g0<-ggcstart()
g1<-g0+geom_point() + geom_smooth()+theme_bw()
ggplotly(g1)
})
output$boxplot2 <- renderPlotly({
g0<- ggcbstart()
g1<-g0+geom_boxplot() +theme_bw()
ggplotly(g1)
})
output$ciplot2 <- renderPlotly({
g0<- ggcbstart()
g1<-g0+stat_summary(fun.data=mean_cl_normal,geom="errorbar")
g1<-g1+theme_bw()
g1<-g1+stat_summary(fun.y=mean,geom="point")
ggplotly(g1)
})
# Regression diagnostics -------------------------------------------------------------
output$dplot <- renderPlot({
mod<-linearmodel()
par(mfcol=c(2,2))
plot(mod)
})
# rank regression ---------------------------------------------------------
output$rplot <- renderPlotly({
x<-input$X
y<-input$Y
d<-Dataset()
tx<-sprintf("d$rank_%s<-rank(d$%s)",x,x)
eval(parse(text=tx))
tx<-sprintf("d$rank_%s<-rank(d$%s)",y,y)
eval(parse(text=tx))
tx<-sprintf("outp<-cor.test(d$%s,d$%s,method='spearman')",y,x)
eval(parse(text=tx))
output$cor <- renderPrint(outp)
tx<-sprintf("g0<-ggplot(data=d,aes(x=rank_%s,y=rank_%s))",x,y)
eval(parse(text=tx))
g1<-g0+geom_point() +theme_bw() + geom_smooth(method=lm)
ggplotly(g1)
})
# build models ------------------------------------------------------------
# linear model ------------------------------------------------------------
linearmodel<-reactive({
x<-input$X
y<-input$Y
d<-Dataset()
tx<-sprintf("mod<-lm(data=d,%s~%s)",y,x)
eval(parse(text=tx))
return(mod)
})
# aov model ---------------------------------------------------------------
aovmodel<-reactive({
x<-input$group
y<-input$Y
d<-Dataset()
tx<-sprintf("mod<-aov(data=d,%s~%s)",y,x)
eval(parse(text=tx))
return(mod)
})
# quadratic model ---------------------------------------------------------
quadmodel<-reactive({
x<-input$X
y<-input$Y
d<-Dataset()
tx<-sprintf("mod<-lm(data=d,%s~%s+I(%s^2))",y,x,x)
eval(parse(text=tx))
return(mod)
})
# poisson model -----------------------------------------------------------------
poissonmodel<-reactive({
x<-input$X
y<-input$Y
d<-Dataset()
tx<-sprintf("mod<-glm(data=d,%s~%s,family=poisson)",y,x)
eval(parse(text=tx))
return(mod)
})
# neg bin model-----------------------------------------------------------------
nbmodel<-reactive({
x<-input$X
y<-input$Y
d<-Dataset()
tx<-sprintf("mod<-glm.nb(data=d,%s~%s)",y,x)
eval(parse(text=tx))
return(mod)
})
# Rendering R output directly -----------------------------------------------------------------
output$anova<-renderPrint(anova(linearmodel()))
output$ANOVA<-renderPrint(summary(aovmodel()))
output$tukey<-renderPrint(TukeyHSD(aovmodel()))
output$tukeyplot<-renderPlot(plot(TukeyHSD(aovmodel())))
output$quadsum<-renderPrint(
{
mod<-quadmodel()
summary(mod)
})
output$quadanova<-renderPrint(
{
mod<-quadmodel()
anova(mod)
})
output$nbsum<-renderPrint(
{
mod<-nbmodel()
summary(mod)
})
output$nbanova<-renderPrint(
{
mod<-nbmodel()
anova(mod)
})
output$poissum<-renderPrint(
{
mod<-poissonmodel()
summary(mod)
})
output$poisanova<-renderPrint(
{
mod<-poissonmodel()
anova(mod)
})
# R output as HTML -----------------------------------------------------------------
output$sumtable <- renderText({
mod<-linearmodel()
a<-summary(mod)
output$sum<-renderPrint(a)
print(xtable(a),type="html")
} )
output$antable <- renderText({
mod<-linearmodel()
a<-anova(mod)
print(xtable(a),type="html")
} )
output$sumtext <- renderText({
x<-input$X
y<-input$Y
mod<-linearmodel()
a<-summary(mod)
int<-round(coef(mod)[1],4)
slope<-round(coef(mod)[2],4)
rsq<-round(a$r.squared,3)
sprintf("The regression line is %s = %s + %s %s with an r squared value of %s",y,int,slope,x,rsq)
} )
output$load_file <- renderUI({
selectInput("load_file", "Load saved file", dir(path="data/"))
})
})