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 Klausur pStudentData übergeben. pColNames gibt 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. pData4Student ist 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


Siehe auch