Initial setup with lecture example
This commit is contained in:
165
lecture/Meine-Mietspiegel-App/App-Mietspiegel/app.r
Normal file
165
lecture/Meine-Mietspiegel-App/App-Mietspiegel/app.r
Normal file
@@ -0,0 +1,165 @@
|
||||
|
||||
|
||||
|
||||
################
|
||||
# Im folgenden Abschnitt wird das User Interface (UI) definiert
|
||||
ui <- fluidPage(
|
||||
|
||||
# Titel der App
|
||||
titlePanel("Münchner Mietspiegel"),
|
||||
|
||||
# Layout für die Eingaben in die App und die Ausgaben
|
||||
sidebarLayout(
|
||||
|
||||
# Die Definition der Eingabefelder auf der linken Seite
|
||||
sidebarPanel(
|
||||
|
||||
# Eine Überschrift mit Linie darunter
|
||||
h3("Wohnung:",align="left"),
|
||||
hr(style="height: 1px; background: black"),
|
||||
|
||||
# Ein Slider für die Fläche der Wohnung
|
||||
# der Slider geht hier von 30 (min) bis 100 (max),
|
||||
# die Voreinstellung ist 75 (value)
|
||||
sliderInput(inputId = "flaeche",
|
||||
label = "Groesse in qm:",
|
||||
min = 30,
|
||||
max = 100,
|
||||
value = 75
|
||||
),
|
||||
|
||||
# Das Baujahr als numerische Eingabe
|
||||
# die Werte gehen von 1950 (min) bis 2000 (max) in Einerschritten (step)
|
||||
# die Voreinstellung ist 1981 (value)
|
||||
numericInput(inputId="bjahr",
|
||||
label="Baujahr:",
|
||||
value = 1981,
|
||||
min=1950,max=2000,step=1
|
||||
),
|
||||
|
||||
# Die Lage als Auswahlliste
|
||||
# die Auswahlmöglichkeiten sind "normale Lage", "gute Lage" und "beste Lage",
|
||||
# die entsprechende Zuordnung mit Zahlen 1, 2 und 3 sind wie im Datensatz,
|
||||
# die Voreinstellung ist 1 (selected) - also eine "normale Lage"
|
||||
selectInput("lage",label="Lage:",
|
||||
choices = list("normale Lage" = 1, "gute Lage" = 2,
|
||||
"beste Lage" = 3), selected = 1
|
||||
),
|
||||
|
||||
# eine Überschrift für die weiteren Ausstattungsmerkmale
|
||||
h5(strong("Ausstattung:"),align="left"),
|
||||
|
||||
# die weiteren drei Ausstattungsmerkmale (kueche, bad, zh) mit
|
||||
# Boxen zum Anklicken
|
||||
# die Voreinstellung ist jeweils FALSE (value), das heißt, es ist als
|
||||
# Voreinstellung keine Box angeklickt
|
||||
checkboxInput(inputId="luxuskueche", label="Luxusküche", value = FALSE),
|
||||
checkboxInput(inputId="luxusbad", label="Luxusbad", value = FALSE),
|
||||
checkboxInput(inputId="zentralheizung", label="mit Zentralheizung", value = FALSE),
|
||||
|
||||
),
|
||||
|
||||
# der Hauptbereich der Nutzeroberfläche für die Ausgabe der Ergebnisse
|
||||
mainPanel(
|
||||
|
||||
# Ausgabe des Histogramms
|
||||
plotOutput(outputId = "Verteilung"),
|
||||
|
||||
# Ausgabe der Prognose
|
||||
textOutput("Prognose"),
|
||||
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
############
|
||||
|
||||
|
||||
server <- function(input, output) {
|
||||
|
||||
# Innerhalb dieser Funktion werden die Bilder für die Ausgabe
|
||||
# erzeugt und die Ergebnisse berechnet
|
||||
|
||||
# Folgende Funktion berechnet die Prognose für die eingegeben Werte
|
||||
prognose <- reactive({
|
||||
|
||||
# Speichere die Daten der Einflussvariablen in ein Objekt X
|
||||
X <- Daten[,c("flaeche","bjahr","bad","kueche","lage","zh")]
|
||||
|
||||
# Ersetze die erste Zeile in X nun mit den neuen, eingegebenen Werten
|
||||
|
||||
# zunächst die Werte für flaeche und bjahr
|
||||
X[1,"flaeche"] <- input$flaeche
|
||||
X[1,"bjahr"] <- input$bjahr
|
||||
# der angegebene Wert für lage muss zusätzlich noch in factor umgewandelt werden
|
||||
X[1,"lage"] <- as.factor(input$lage)
|
||||
|
||||
# die Eingaben TRUE/FALSE für die Ausstattungsmerkmale kueche, bad und zh
|
||||
# werden jeweils in 0/1-Variablen umgewandelt (mit ifelse) und in
|
||||
# den Datentyp factor umgewandelt (mit as.factor);
|
||||
# die Werte werden in die erste Zeile von X eingetragen
|
||||
X[1,"kueche"] <- as.factor(ifelse(input$luxuskueche == FALSE, 0, 1))
|
||||
X[1,"bad"] <- as.factor(ifelse(input$luxusbad == FALSE, 0, 1))
|
||||
X[1,"zh"] <- as.factor(ifelse(input$zentralheizung == FALSE, 0, 1))
|
||||
|
||||
# Berechne die Prognosen für X
|
||||
# die Prognose der neuen, eingegebenen Werte stehen im ersten Eintrag des Prognosevektors
|
||||
prognosevektor <- predict(model,X)
|
||||
prog <- prognosevektor[1]
|
||||
|
||||
# der Prognosewert wird noch auf 2 Stellen hinter dem Komma (digits=2) gerundet.
|
||||
prog <- round(prog,digits=2)
|
||||
|
||||
# der errechnete Wert soll als Ergebnis der Funktion zurückgegeben werden
|
||||
prog
|
||||
})
|
||||
|
||||
# diese Funktion erzeugt das Histogramm und speichert es als Ausgabebild
|
||||
# mit dem Namen output$Verteilung
|
||||
output$Verteilung <- renderPlot({
|
||||
|
||||
# die errechnete Prognose aus der oben geschriebenen Funktion prognose()
|
||||
prog <- prognose()
|
||||
|
||||
# Speichere die Daten der Einflussvariablen in ein Objekt X
|
||||
# und die Daten der Zielvariable in y.
|
||||
# Berechne dann die Abweichungen zwischen den Prognosen und den realen Werten
|
||||
X <- Daten[,c("flaeche","bjahr","bad","kueche","lage","zh")]
|
||||
y <- Daten[,"mieteqm"]
|
||||
abweichungen <- y-predict(model,X)
|
||||
|
||||
# Zeichne jetzt im Histogram die Prognose mit den Abweichungen;
|
||||
# dies visualisiert die bandbreite der Mieten für diese Wohnung
|
||||
hist(prog+abweichungen, col = "blue", main = "Verteilung der Quadratmetermieten",xlim=c(0,15))
|
||||
|
||||
})
|
||||
|
||||
# Definition einer Textausgabe mit dem namen output$Prognose
|
||||
# In dieser Textausgabe soll der in der Funktion prognose()
|
||||
# errechnete Prognosewert ausgegeben werden
|
||||
output$Prognose <- renderText({
|
||||
|
||||
# der Wert der Prognose aus der Funktion prognose()
|
||||
prog <- prognose()
|
||||
|
||||
# die Ausgabe ist eine Kombination (mit dem Befehl 'paste') von Text
|
||||
# und des errechneten Prognosewerts prog
|
||||
Ausgabe <- paste("Durchschnittliche Miete: ", prog," Euro")
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Aufruf der App-Funktionen
|
||||
###############
|
||||
|
||||
shinyApp(ui = ui, server = server)
|
||||
|
||||
###############
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user