KnitR/Iteration für Aufgabenblatterstellung
Iteration für Aufgabenblätter
Eine Iteration wird bei der Erstellung von individualisierten Aufgabenblättern verwendet, um bei wiederholter Durchführung der Aufgabenblatterzeugung für jede Schüler:in eine eigenes Aufgabenblatt zu erzeugen (d.h. in einem KnitR-Prozess z.B. 32 unterschiedliche Aufgabenblätter auf der Basis von 32 Schülerdatensätzen erzeugt. Die Ausgabe soll in LibreOffice erfolgen. Daher steht im YAML-Header in odt_document. In einer FOR-Schleife über alle Klausuren wird für alle Klausurteilnehmer ein Übungsblatt erstellt. Die Übungsblätter werden durch ein \newpage-Befehl getrennt, damit jedes Übungsblatt für jede Schülerin und jeden Schüler auf einer eigenen Seite steht im LibreOffice-Dokument generiert wird.
Laden und Speichern von Daten
Die folgenden Funktionen werden für das Laden und Speichern von CSV-Dateien verwendet.
load_csv <- function(pFilename) {
retData <- read.csv(pFilename, header=TRUE, stringsAsFactors=FALSE)
### Rückgabe retData ist ein Dataframe (Tabelle)
return(retData)
}
save_csv <- function(pFilename, pData) {
write.csv(pData, pFilename, row.names = FALSE)
}
komma2punkt <- function(pWert) {
### deutsche Bezeichnung von Dezimalzahlen mit Komma ","
### durch englischen Dezimalpunkt "." ersetzen.
### "3,45" wird nach 3.45 konvertiert.
pWert <- as.character(pWert)
pWert <- gsub(",", ".", pWert)
pWert <- as.numeric(pWert)
return(pWert)
}
load_inout_csv <- function(pFilename,pInCols,pOutCols) {
data <- read.csv(pFilename, header=TRUE, stringsAsFactors=FALSE)
### Spalten für Eingabe bzw. Ausgabe in Zeichen konvertieren,
### ggf. deutsches Komma in Dezimalzahlen durch Punkt
for (i in 1:length(pInCols)) {
col4str <- unlist(data[pInCols[i]])
data[pInCols[i]] <- komma2punkt(col4str)
}
for (i in 1:length(pOutCols)) {
col4str <- unlist(data[pOutCols[i]])
data[pOutCols[i]] <- komma2punkt(col4str)
}
### Spalten mit den Bezeichnung pColNames extrahieren
data4cols <- list(
xin = data[pInCols],
yout = data[pOutCols]
)
### Rueckgabe der extrahieren numerischen Datenspalten
return(data4cols)
}
Erstellen einer R-Markdowndatei für die Übungsblätter
Beim KnitR'n dieser Datei wird eine Datei mit der Liste der Übungsblättern erstellt, die man noch weiter verarbeiten kann. Diese besteht i.d.R. aus einem einleitenden Text über die Auswertung der Klausurergebnisse gefolgt von den einzelnen Übungsblättern.
Hilfsfunktionen für die Erstellung individueller Übungen
Die folgenden Hilfsfunktionen werden für die Erstellung individueller Übungen verwendet:
- Mit der Funktion
header4knitr(pTitle,pAuthor)wird der Titel und der Autorenname für die erzeugte Datei festgelegt. - Mit der Funktion
auswertung_klausur(pTitle,pStudentData,pColNames)wird der Titel und die Daten der KlausurpStudentDataübergeben.pColNamesgibt die Spaltenbezeichnung in der Klausur an, z.B.c("aufgabe1","aufgabe2","aufgabe3"). - Mit der Funktion
uebungsblatt_erstellen(pData4Student)wird ein einzelnes Übungsblatt für eine Person erstellt.pData4Studentist der Datensatz für eine einzelne Person mit den individuellen Informationen für die Übungsblatterstellung.
header4knitr <- function (pTitle,pAuthor) {
if (!is.character(pTitle)) {
stop("1. Parameter muss den Titel der individuellen Aufgabenblätter enthalten")
}
if (!is.character(pAuthor)) {
stop("2. Parameter muss den Namen der/des Autorin/Autors enthalten")
}
# R-Markdown Header
vFormat <- "pdf"
out4odt <- "---\n"
out4odt <- paste(out4odt, "title: "",pTitle,""\n",sep="")
out4odt <- paste(out4odt, "author: "",pAuthor,""\n",sep="")
out4odt <- paste(out4odt, "date: "`r Sys.Date()`"\n",sep="")
out4odt <- paste(out4odt, "output: "",vFormat,"_document"\n",sep="")
out4odt <- paste(out4odt, "---\n\n",sep="")
return (out4odt)
}
Auswertung der Klausur
Die folgende Funktion wertet die Klausur aus.
auswertung_klausur <- function(pData,pColNames) {
### pColNames ist z.B. c("aufgabe1","aufgabe2","aufgabe3")
for (i in 1:length(pColNames)) {
col4str <- unlist(pData[pColNames[i]])
pData[pColNames[i]] <- komma2punkt(col4str)
}
### pColNames ist z.B. c("aufgabe1","aufgabe2","aufgabe3")
for (i in 1:length(pColNames)) {
col4str <- unlist(pData[pColNames[i]])
pData[pColNames[i]] <- komma2punkt(col4str)
}
### Spaltensummen berechnen
summe <- pData[pColNames[i]]
for (i in 2:length(pColNames)) {
col4str <- unlist(pData[pColNames[i]])
summe <- summe + pData[pColNames[i]]
}
pData$summe <- summe
return(pData)
}
Deckblatt Klausurauswertung
Diese Klausurinformationen erscheinen als Deckblatt der Klausurauswertung.
auswertung_deckblatt <- function(pTitle,pData,pColNames) {
### Anzahl der Uebungen aus pStudentData ermitteln
anzahl <- nrow(pData)
summe <- pData[["summe"]]
summemax <- max(summe)
summemin <- min(summe)
out4ret <- ""
out4ret <- paste(out4ret, "\n## Auswertung - ",pTitle,"\n",sep="")
out4ret <- paste(out4ret, "\nEs werden Übungsblätter für ",anzahl," Personen erstellt.\n" ,sep="")
out4ret <- paste(out4ret, "\nMaximale Anzahl der Punkte in der Klausur war ",summemax," Punkte." ,sep="")
out4ret <- paste(out4ret, "\nMimimale Anzahl der Punkte in der Klausur war ",summemin," Punkte." ,sep="")
out4ret <- paste(out4ret, "\n\nFolgende Spalten wurden für die Punktesumme verwendet: ",paste(pColNames,collapse=", "),sep="")
#out4rmd <- readLines("tpl/auswertung4knit.Rmd")
## Rueckgabe der Klausurauswertung
return(out4ret)
}
Einzelnes Übungsblatt erzeugen
Die folgende Funktion übernimmt die Erzeugung eines einzelnen Übungsblattes.
uebung_erstellen <- function(pTitle,pData1) {
### pData1 ist der Datensatz für eine Person
uebblatt <- paste("\n### ",pTitle,"\nÜbungsblatt für ",pData1$name,"\n",sep="")
### Rueckgabe des erstellten Übungsblattes
return(uebblatt)
}
FOR-Schleife über alle Klausuren
In einer FOR-Schleife über alle Klausuren wird für jeden Klausurteilnehmer ein Übungsblatt erstellt. Die Übungsblätter werden durch ein \newpage-Befehl getrennt, damit jedes Übungsblatt für jede Schüler:in auf eine eigenen Seite steht. Die Ausgabe wird selbst wieder in eine KnitR-Datei geschrieben, damit man diese ggf. noch mit individuellen Änderungen versehen kann.
# Laden der Klausurdaten
studentdata <- load_csv("data/klausur.csv")
# Definiere die Anzahl der Klausuren
# über die Anzahl der Datenreihen in studentdata
anzahl <- nrow(studentdata)
# FOR-Schleife über alle Klausuren
titel4ueb <- "Übungen Integralrechnung"
## Dateikopf berech
output <- header4knitr(titel4ueb,"Max Mustermann")
### Spalten mit Punkten für Aufgaben
col4aufgaben <- c("aufgabe1","aufgabe2","aufgabe3")
### Klausur auswerten - z.B. Punktesumme
studentdata <- auswertung_klausur(studentdata,col4aufgaben)
### Auswertung der Klausur
auswert <- auswertung_deckblatt(titel4ueb,studentdata,col4aufgaben)
output <- paste(output, auswert ,sep="")
for (i in 1:anzahl) {
# Erstelle ein neues Übungsblatt
print(paste("Klausur ",i," - Name: ",studentdata[i,"name"],sep=" "))
data4student <- studentdata[i, ]
uebungsblatt <- uebung_erstellen(titel4ueb,data4student)
# Füge das Übungsblatt zur Ausgabe hinzu und trennen die Seiten mit \newpage
output <- paste(output, "\n\n \\newpage \n\n", uebungsblatt )
}
## Dateiname für die erzeugte Liste individueller Uebungen
## Dateiname der Ausgabedatei: "uebungsaufgaben_knitr.Rmd"
filename4out <- "uebungsaufgaben_knitr.Rmd"
writeLines(output,filename4out)
Ausgabe in LibreOffice
Wenn die Ausgabe in LibreOffice erfolgen soll, muss man in dem YAML-Header die PDF-Ausgabe pdf_document durch odt_document ersetzen.
---
title: "Übungen Integralrechnung"
author: "Name der Lehrer:in"
date: "`r Sys.Date()`"
output: "odt_document"
---
Quellenangaben