Das R-Paket shiny habe ich bisher nur als deploy-Hilfe für Maps benutzt. Meine erste wirkliche shiny-app im Datentäter-Design macht auch noch nichts weltbewegendes: Sie berechnet lediglich, wie viele Tage, Stunden, Minuten und Sekunden man noch warten muss, bis man endlich/leider xy-Jahre alt wird.

Dahinter steckt ein simpler R-Code, der sich in zwei Teile gliedert: Im User Interface-Teil werden die Farben und die Aufteilung der App bestimmt, im Server-Part läuft die Berechnung ab.

Hochgeladen ist die app wieder über den kostenlosen shiny-server, was die Ladezeit in die Länge zieht und die Erreichbarkeit einschränkt. Man kann shiny-apps auch über seinen eigenen Server hosten, allerdings habe ich mein sehr kompliziertes Passwort nicht mit nach Zürich genommen und habe nun keinen Serverzugriff.

Hier also meine app zum ausprobieren und darunter der Code zum selber machen.

P.S. Der frame ist noch nicht responsive.


Code

# Pakete im Skript nur laden, nicht installieren!
library(shiny)
library(lubridate)

# user interface
ui <- shinyUI(
  fluidPage(
# Die Seite ist in mehrere Panels unterteilt
# Im header Panel kann man zB die Überschrift einfügen, ich mache das hier mit einem Bild,
# das die Überschrift bereits enthält
    headerPanel(tags$img(src='http://datentaeter.de/wp-content/uploads/2016/03/versuch2.png'),
                list(tags$head(tags$style(".span12 {background-color: #09aaae; }"))
                )
    ),
    sidebarPanel(style = "background-color: #196366;",
                 HTML('<p style="color:white; font-size: 13pt"> 
                       <strong>Wann wurdest du geboren?</strong> </p>' ),
                 selectInput("a1",label=HTML('<p style="color:white; font-size: 10pt"> Tag </p>' ), 
                             choices=(c(1:31)), selected = 26),
                 selectInput("a2",label=HTML('<p style="color:white; font-size: 10pt"> Monat </p>' ), 
                             choices=(c(1:12)), selected = 11),
                 selectInput("a3",label=HTML('<p style="color:white; font-size: 10pt"> Jahr </p>' ), 
                             choices=(c(1940:year(Sys.time()))), selected = 1992)
    ),
    mainPanel(list(tags$head(tags$style("body {background-color: #09aaae; }"))),
              tags$img(src = "http://datentaeter.de/wp-content/uploads/2016/03/bild.png" , 
                       style = "z-index: -5; position: fixed;"
              ),
              # output, der an den server-teil weitergegeben wird
              uiOutput("b1", style = "color: #196366; font-size:150%")
    )
  ))

# server-teil
server <- shinyServer(function(input, output) {
  daten <- reactive({
    Geburtsdatum <- paste0(input$a1,".", input$a2, ".", input$a3)
    Uhrzeit <- "00:00:01"
    Geb <- paste(Geburtsdatum, Uhrzeit)
    geburt <- strptime(c(Geb), format = "%d.%m.%Y %H:%M:%S", tz = "CET")
    geburtstag <- geburt
    year(geburtstag) <- year(Sys.time())
    gebu <- difftime(geburtstag, Sys.time(), units = "days")
    if(gebu < 0){year(geburtstag) <- year(Sys.time())+1}
    gebu <- difftime(geburtstag, Sys.time(), units = "days")
    Alter <- ceiling((Sys.time() - geburt)/365.25)
    aufrunden <- function(Wert){
      trunc(Wert)
    }
    decimalpl <- function(Wert){
      Wert-trunc(Wert)
    }
    list(a = (aufrunden(gebu)), 
         b = (aufrunden(decimalpl(gebu)*24)), 
         c = (aufrunden(decimalpl(decimalpl(gebu)*24)*60)), 
         d = (aufrunden(decimalpl(decimalpl(decimalpl(gebu)*24)*60)*60)), 
         e = (paste(Alter,".", sep="")))
  })
  output$b1 <- renderUI({
    strong(paste("Noch", daten()$a, "Tage,",
                 daten()$b, "Stunden,",
                 daten()$c, "Minuten, und",
                 daten()$d, "Sekunden bis zu deinem", 
                 daten()$e, "Geburtstag!"))
  })
})

# jetzt noch beide teile als app zusammenführen
shinyApp(ui = ui, server = server)