Una applicazione sperimentale con shiny

shiny è un package con il quale creare applicazioni web da R.
Allo scopo di rendere la conoscenza di dati epidemiologici più facile per gli utenti
nella mia azienda sanitaria (ASP di Palermo) abbiamo pensato di sperimentare
la creazione di una applicazione WEB interattiva sfruttando lo spazio messo a disposizione sul sito
shinyapps.io.
Un primo frutto è questa app consultabile su :

epidemiologia-asppalermo.shinyapps.io/shinyprova

Il problema di shiny è che, secondo me, è poco documentato, e che per un uso, anche routinario ,
necessita di conoscenze almeno di HTML ( i cui problemi di gestione sono, poi, ben occultati).

Il Codice utilizzato è il seguente:

(N.B. : il codice è molto sporco, talora approssimativo, me ne scuso, ma è efficace; critiche e suggerimenti, al solito, sarebbero apprezzatissimi).

per il file ui.R:

#ui.R
load(“tabcod”)
shinyUI(fixedPage(
#tags$p(tags$style(“p {color: red}”,type=”text/css”) ) ,
titlePanel(” Mortalita’ nei distretti della provincia di Palermo”),
fixedRow(
column(4,
wellPanel(
tags$head(tags$style(” body {background-color: #ADD8E6; }”,media=”screen”, type=”text/css”)),
helpText(“Selezionate una patologia ed un sesso , cliccando sui pulsanti sottostanti, per creare una mappa e la tabella dati correlata;
ovvero selezionate un distretto ed un sesso per visualizzare una tabella con i dati di tutte le patologie”),
br(),
radioButtons(“var3″, “scegli:”,
c(“Tutte le patologie di un distretto” = “UN”,
“Una patologia di tutti i distretti” = “TT”),
selected=”TT”),
conditionalPanel(condition=”output.showPanel==’si’”,
selectInput(“var4″,
label = “Scegliete una distretto “,
choices = c(“Palermo”,”Bagheria”,”Carini”,”Cefalu”,”Corleone”,”Lercara”,”Misilmeri”,”Partinico”,”Petralia”,”Termini”),
selected=”Palermo”)),
conditionalPanel(condition=”output.showPanel==’no’”,
selectInput(“var”,
label = “Scegliete una patologia “,
choices = c(“”,tabcod),
selected=”Diabete mellito”)),
selectInput(“var2″,
label = “Scegliete il sesso”,
choices=c(“m”,”f”),
selected=”m”)
)),
column(8,
mainPanel(
tabsetPanel(id=”tab”,
tabPanel(“Distretti”,
conditionalPanel(condition=”output.showPanel==’no’”,
plotOutput(‘map’,”800px”,”800px”),
br(),
dataTableOutput(‘obie’)),
conditionalPanel(condition=”output.showPanel==’si’”,
tags$h3(tags$style(“h3 {color: blue;}”,media=”screen”,type=”text/css” )),
h3( textOutput(“text”)),
dataTableOutput(“obie2″)),
value=1),
tabPanel(“Comuni”,value=2),
tabPanel(“Altro”,value=3)
)),
# tags$head(tags$style(” table {color: red;background-color: white; }”,media=”screen”, type=”text/css”)),
# tags$head(tags$style(HTML(“table {border-color: green;}”),ype=”tet/css”))
tags$head(tags$style(“table,th,td {border:1px solid black; color: red;background-color: white;width: 1000px}”,media=”screen”,type=”text/css” ))
))
))

Per il file server.R

library(sp)
library(plyr)
source(“mappa.R”)
load(“distretti_pa3″)
shinyServer(
function(input, output) {
output$dist<-renderText({paste(“Distretto di “,as.character(input$var4))})
output$showPanel <- renderText({
out <- 1
if (input$tab==1&input$var3==’UN’ ) { out <-”si”}
else { out <-”no”}
return(out)
})
dsi<-reactive({switch(input$var2,”m”=”m_eta_0_100_distretto_20102013.csv”,
“f”=”f_eta_0_100_distretto_20102013.csv”)})
tab<-reactive({data.frame(read.table(dsi(),header=TRUE,sep=”;”))})
tab2<-reactive(rename(tab(),c(“L2L”=”Patologia”)))
tab3<-reactive(rename(tab2(),c(“adr”=”Tasso.Stand”)))
tab4<-reactive({subset(tab3(),Patologia==input$var)})
L2L<-reactive({as.character(tab4()$Patologia) })
b<-reactive({as.numeric(tab4()$Tasso.Stand) })
output$pato<-renderText({as.character(tab4()$Tasso.Stand)[1] })
ISTAT<-reactive({as.numeric(tab4()$ISTAT) })
output$map <- renderPlot({
mappa(L2L=L2L(),b=b(),ISTAT=ISTAT(),ses=input$var2,pat=input$var)})
output$anno<-renderText({as.character(tab4()$Anno)[1]})
output$text<-renderText({paste(“Distretto di “,as.character(input$var4),”, Anni “,
as.character(tab4()$Anno)[1],”, “,ifelse(input$var2==”m”,”UOMINI”,”DONNE”))})
output$obie <- renderDataTable(tab4()[,1:8], options = list(
iDisplayLength = 10))
tab5<-reactive({subset(tab3(),Residenza==paste(“Dist. di “,as.character(input$var4),sep=”"))})
output$obie2 <- renderDataTable(tab5()[,c(1,4:8)])
outputOptions(output,”showPanel”,suspendWhenHidden=FALSE)
outputOptions(output,”dist”,suspendWhenHidden=FALSE)
outputOptions(output,”obie”,suspendWhenHidden=FALSE)
outputOptions(output,”obie2″,suspendWhenHidden=FALSE)
outputOptions(output,”anno”,suspendWhenHidden=FALSE)
})

per il file mappa.R

mappa<-function(L2L,b,ISTAT,pat,ses){ load(“distretti_pa3″) load(“coord”) area=”distretto” da=0 a=100 da=da/5+3 a=ifelse(a>84,20,((a+1)/5)+2)
ai=c(2003,2005,2009,2003)
as=c(2006,2010,2014,2014)
kk=3 #quale periodo
file=file
b=b
if(sum(b)>0){
b1=b[b>0]
aa=0
aa[1]=min(as.numeric(b1))-min(as.numeric(b1))/1000
aa[2]<-(mean(as.numeric(b1))+min(as.numeric(b1)))/2
aa[3]<-mean(as.numeric(b1))
aa[4]<-(mean(as.numeric(b1))+max(as.numeric(b1)))/2
aa[5]<-max(as.numeric(b1))
livelli=0
for(k in 1:4){
livelli[k]=paste(“(“,round(aa[k],2),”,”,round(aa[k+1],2),”)”,sep=”")
}
col4=try(as.numeric(cut(as.numeric(b),breaks=(c(0,aa[1:5])),include.lowest=TRUE)),silent=TRUE)
br=quantile(as.numeric(b1),probs=seq(0,1,.20))
br[1]=br[1]-br[1]/1000
col3=try(as.numeric(cut(as.numeric(b),breaks=c(0,br),include.lowest=TRUE,labels=FALSE)),silent=TRUE)
if(class(col4)==”try-error”&class(col3)==”try-error”){
if(min(b1)==max(b1)){
col=ifelse(b==0,1,2)
livelli=paste(“( “,round(aa[1],2),” )”,sep=”")
col2=c(“white”,”yellow”)
}
}else{
if(any(is.na(col3))){
if(!any(is.na(col4))){
col=col4
livelli=livelli
testo=”Distribuzione dei tassi standardizzati sulla popolazione europea (per 100.000 ab.)”
col2=c(“white”,”yellow”,”lightgreen”,”dark blue”,”red”)
}else{
col=col3
livelli=levels(cut(b,breaks=c(br)))
col2=c(“white”,”yellow”,”lightgreen”,”lightblue4″,”dark blue”,”red”)
testo=”Quintili della distribuzione dei tassi standardizzati sulla popolazione europea (per 100.000 ab.)”
}
}else{
col=col3
livelli=levels(cut(b,breaks=c(br)))
col2=c(“white”,”yellow”,”lightgreen”,”lightblue4″,”dark blue”,”red”)

testo=”Quintili della distribuzione dei tassi standardizzati sulla popolazione europea (per 100.000 ab.)”
} }
temp98<-data.frame(distretto=ISTAT-900)
c<-match(distretti_pa3@data$distretto,temp98$distretto)
distretti_pa3@data$col<-col2

[col

]
colt<-ifelse(col2

[col

]%in%c("lightblue4","dark blue"),"white","black")
plot(distretti_pa3,col=distretti_pa3@data$col)
text(coord

,coord

,distretti_pa3@data$label

,col=colt

,cex=1.5,)
mtext(side=3,text=paste("Mortalità nei distretti della provincia di Palermo,","anno 20010-2013",sep=""),line=1)
mtext(side=3,text=paste(ifelse(ses=="m","Uomini, ","Donne, "),as.character(pat),", tutte le eta",sep=""),line=0)
mtext(side=3,text=testo,line=-1)
legend(x=c(40,470),y=c(87,95),legend=c("Nessun Decesso",livelli),cex=.9,fill=c(col2),horiz=TRUE,x.intersp=.05,y.intersp=.5,bty="n",xpd=TRUE)
} }

tabcod è un vettore
distretti_pa3 è un oggetto :
class(distretti_pa3)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"

se a qualcuno interessa me ne può chiedere l'invio scrivendo: epidemiologia@asppalermo.org

i files m_eta_0_100_distretto_20102013.csv e f_eta_0_100_distretto_20102013.csv

li trovate su :

http://epidemiologia.asppalermo.org/2004-2013/m_eta_0_100_distretto_20102013.csv

http://epidemiologia.asppalermo.org/2004-2013/f_eta_0_100_distretto_20102013.csv