Journal of Statistical Software
11
Figure 5: Display of exercise 1 (boxplots) from myexam in Moodle (as rendered by a Firefox
browser).
[1] "exam1.pdf"
"exam2.pdf"
"exam3.pdf"
"metainfo.rda"
[5] "moodlequiz.xml" "qti12.zip"
"solution1.pdf" "solution2.pdf"
[9] "solution3.pdf"
The ZIP le can again be easily imported into an OLAT test conguration where further cus-
tomization can be performed
6
. The rst boxplots exercise from the exam generated above
is shown in OLAT in Figure6 (again as rendered by a Firefox browser). The corresponding
solutions are displayed in OLAT immediately after incorrectly completing an individual exer-
cise. The display of solutions can also be suppressed completely by setting solutionswitch
= FALSE in exams2qti12().
7
The main dierence of the generated ZIP le for QTI 1.2, compared to the Moodle XML
6
While customization of the features of the overall assessment was always possible for us, OLAT typically
did not allow for modication of the individual exercise items. We were not able to track down which part of
the QTI 1.2 XML specication causes this.
7
In our e-learning exams, we typically employ these default settings (i.e., maxattemps = 1 and
solutionswitch = TRUE). Alternatively, we give the students an unlimited number of attempts to solve an
exercise(maxattempts = Inf) but then suppress solutions completely(solutionswitch = FALSE) becauseoth-
erwise the correct solution would be displayed after the rst incorrect attempt.
Pdf move pages - re-order PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Customizing Page Order of PDF Document in C# Project
switch page order pdf; how to move pages in pdf acrobat
Pdf move pages - VB.NET PDF Page Move Library: re-order PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Sort PDF Document Pages Using VB.NET Demo Code
move pages in a pdf file; how to move pages in pdf converter professional
12
Flexible Generation of E-Learning Exams in R
Figure 6: Display of exercise 1 (boxplots) from myexam in OLAT (as rendered by a Firefox
browser).
output, is that in addition to the qti.xml le further supplementary les can be included.
Hence, supplements in all potential formats can be easily included and uploaded in one go into
OLAT.Therefore, by default, Base64 is employed only for graphics but not for other les (such
as data sets etc.) but either approach can be used optionally for all types of supplements.
The QTI 1.2 standard allows for rather ne control of the properties of the exercises (also
knownas items inQTI1.2) andthe exams (alsoknown as assessments). Hence, exams2qti12()
provides a variety of options for controlling the appearance of exam/exercises, see the manual
page ?exams2qti12 for details. Also, the underlying XML template can be adapted.
2.3. Creating the rst exam
When creating the rst \real" exam with exams, i.e., when starting to prepare course mate-
C# TIFF: How to Reorder, Rearrange & Sort TIFF Pages Using C# Code
Using this C#.NET Tiff image management library, you can easily change and move the position of any two or more Tiff file pages or make a totally new order for
change pdf page order reader; how to move pages within a pdf
C# Word - Sort Word Pages Order in C#.NET
page reorganizing library control, developers can swap or adjust the order of all or several Word document pages, or just C# DLLs: Move Word Page Position.
rearrange pages in pdf reader; pdf rearrange pages online
Journal of Statistical Software
13
rials with the help of the package, it is our experience that it works best to start (almost)
from scratch with some simple examples. The package provides a wide range of examples for
typical exercises (see Table3 in the appendix for an overview) which can serve as a starting
point and it is often useful to copy parts of these exercises to create new ones. In particular,
we recommend to keep the formatting as simple as possible for two reasons: (1) The resulting
exercises are typically more robust and work well with dierent exams2xyz() interfaces (espe-
cially both in LAT
E
Xand in HTML). (2) Some formatting issues require attention to technical
details, e.g., as discussed in Section3.
Thus, we recommend to start with exercises taking inspiration from the available examples
and only using basic L
A
T
E
Xmarkup for mathematical notation and formatting. To aid this
process, exams provides the function exams_skeleton() (or equivalently exams.skeleton())
which creates a directory with a copy of the exercises from Table3 (in the appendix) and the
required templates (e.g., for L
A
T
E
X, HTML, or XML) along with a ‘demo.R’ script illustrating
the use of the various exams2xyz() interfaces.
As an illustration, assume that we are interested in using exams2moodle() and exams2pdf()
for generating both Moodle and PDF exams (for printout). To test that the LAT
E
X-to-HTML
conversion for Moodle actually works for all exercises, we additionally want to inspect the
results of exams2html(). Hence, the code below calls exams_skeleton() specifying these
three writers. Here, we employ a temporary directory but users may set the dir argument to
something like "C:/myexam/" or "~/myexam/" etc.
R> mydir <- file.path(tempdir(), "myexam")
R> exams_skeleton(dir = mydir, absolute = TRUE,
+
writer = c("exams2html", "exams2pdf", "exams2moodle"))
R> dir(mydir)
[1] "demo.R"
"exercises" "templates"
The directory then contains the le ‘demo.R’ which can be opened in any editor for R scripts.
The script illustrates how to create various kinds of output using the exams2html(),
exams2pdf(), and exams2moodle() functions based on the exercises and templates in the
subdirectories of the same name. Absolute paths are employed in the script to refer to these
subdirectories (while thedefault absolute = FALSE wouldresult inrelative paths being used).
The function exams_skeleton() always copies all exercise les to the directory but the
‘demo.R’ script only employs one example for each exercise type, i.e., num, schoice, mchoice,
cloze, and string. To restrict this set of exercises, the type argument of exams_skeleton()
can be used (e.g., type = c("num", "schoice")). In any case, it should be easy to modify
the ‘demo.R’ script, omitting or adding exercises that are readily available in the subdirectory.
Finally, toillustrate howdierent encodings canbeused, exams_skeleton() canalsobe called
with an encoding argument, e.g., setting encoding = "UTF-8". This modies the demo.R
script as well as the HTML and LAT
E
Xtemplates accordingly. The encodings "latin1" (or
"ISO-8859-1") and"latin9" (or "ISO-8859-15") have also beentested. As usual, employing
Sweave les in a particular encoding can be very convenient for special characters (such as
accents or umlauts) but might also lead to problems if they are used in dierent locales (e.g.,
on dierent operating systems). An alternative route (employed by the authors of the exams
package) is to employ Sweave ASCII les only, using L
A
T
E
Xcommands for special characters.
C# PowerPoint - Sort PowerPoint Pages Order in C#.NET
library control, developers can swap or adjust the order of all or several PowerPoint document pages, or just change the C# DLLs: Move PowerPoint Page Position.
pdf rearrange pages; reorder pdf pages in preview
C# PDF File & Page Process Library SDK for C#.net, ASP.NET, MVC
RasterEdge XDoc.PDF allows you to easily move PDF document pages position, including sorting pages and swapping two pages. Copying and Pasting Pages.
move pages in pdf online; change page order pdf reader
14
Flexible Generation of E-Learning Exams in R
3. Design
All the new exams2xyz() interfaces for generating exams in dierent formats (with currently
xyz 2 fpdf, html, moodle, qti12g) are built by combining the modular building blocks
provided by version 2 of exams. All functions have the same goal, i.e., to write exam les in
acertain format to the hard disk. The approach is that the Sweave exercises are rst weaved
to L
A
T
E
X, read into R, potentially transformed (e.g., to HTML), and then written to suitable
output le formats on the disk. Dierent customizable driver functions (or even driver-
generating functions) for performing the weave/read/transform/write steps are available in
exams. Internally, all the exams2xyz() interfaces choose certain drivers and then call the
new function xexams() (for extensible exams) that handles all temporary les/directories
and suitably executes the drivers. In the following subsections, all these building blocks are
introduced in detail.
3.1. Extended specication of exercises
As discussed in Section2 and illustrated in Figure1, each exercise is simply an Sweave le
containing R code for data generation, question/solution environments with LAT
E
Xtext,
and metainformation about the type of exercise and the correct solution etc. This design was
introduced byGr
un and Zeileis(2009)butisslightlyextendedinthenewversiontoprovide
some more options for the generation of e-learning exams. See Table2 for an overview for a
list of exercise types and corresponding metainformation commands.
Each exercise must specify at least an \extype{} and an \exsolution{} and shouldtypically
also have a short \exname{}. There are now ve dierent extypes. Two types that have a
single question and answer:
num for questions with a numeric answer, e.g., \exsolution{1.23}.
string for questions with a (short) text answer, e.g., \exsolution{glm}.
Three types have a list of questions (or statements):
mchoice for multiple-choice questions where each element of the question/statement
can either be true or false, e.g., \exsolution{01011}.
schoice for single-choice questions where exactly one of the questions/statements is
true and all others are false, e.g., \exsolution{01000}.
cloze for a combination of questions/statements with num, string, or mchoice answers.
Thus, each element of the question has either a numeric, short text, or single/multiple-
choice answer, e.g., \exsolution{1.23|001|glm}. To specify the individual cloze
types, a clozetype has to be given, e.g., \exclozetype{num|schoice|string}.
The types schoice and cloze have been newly introduced. The purpose of the former is
mainly to allow for dierent processing of options (e.g., for assigning points to correct/wrong
results) between mchoice and schoice. The cloze type was introduced because both Moodle
and QTI 1.2 have support for it (albeit in slightly dierent ways, for details see below).
Possible evaluation strategies (with/without partial credits and/or with/without negative
C# PDF insert text Library: insert text into PDF content in C#.net
int pageIndex = 0; // Move cursor to (400F, 100F). String outputFilePath = Program.RootPath + "\\" output.pdf"; doc.Save(outputFilePath);
how to move pdf pages around; reorder pages in pdf reader
VB.NET PDF insert text library: insert text into PDF content in vb
Dim pageIndex As Integer = 0 ' Move cursor to (400F, 100F). Dim outputFilePath As String = Program.RootPath + "\\" output.pdf" doc.Save(outputFilePath).
rearrange pdf pages in reader; rearrange pdf pages reader
Journal of Statistical Software
15
Command
Description
\extype{}
Specication of the type of exercise (required): num for questions with
anumeric answer, mchoice for questions with multiple-choice answers,
schoice for questions with single-choice answers (i.e., multiple-choice
with exactly one correct solution), string for questions with a (short)
text answer, or cloze for cloze solutions (i.e., combinations of the
above).
\exname{}
Short name/description (to be used for printing within R).
\extitle{}
Pretty longer title (for Moodle).
\exsection{}
Section of the exercise (for Moodle, with slashes for subsections as in
aURL).
\exversion{}
Version of the exercise.
\exsolution{}
Correct solution (required). It must contain a numeric solution for
num, a string of zeros/ones for mchoice/schoice, or a character string
of string. For cloze a combination of these can be specied, e.g.,
\exsolution{1.23|001|glm}.
\extolerance{} Tolerance for num solutions or a vector of tolerances (expanded if nec-
essary) for cloze solutions. If unspecied the tolerance is 0.
\exclozetype{} List of types for the elements of a cloze exercise, e.g.,
\exclozetype{num|schoice|string} for the example above.
\expoints{}
Points for (fully) correct solution. Default is 1.
\exextra[]{}
Additional metainformation to be read and stored, e.g., for new
custom interfaces.
The default storage type is character, e.g.,
\exextra[myinfo]{1.23} yields a metainformation element myinfo
of "1.23".
The type can also be numeric or logical, e.g.,
\exextra[myinfo,logical]{FALSE|FALSE|TRUE}.
Table 2: Overview of metainformation commands in exercises. The commands in the rst
section allow for a general description, those in the second section for question/answer spec-
ication. Only extype and exsolution are always required (but exname is recommended
additionally for nice printing in R).
points) are discussed below for exams2moodle() and exams2qti12() and in AppendixB for
further functionality within R.
For the three types with lists of questions (mchoice, schoice, cloze), the question and
solution environments should each contain at the end an answerlist environment. In the
question this should list an \item for each question/statement and in the solution the
corresponding answers/explanations can be provided (if any). The answerlist environment
can either be written as usual \by hand" or by using the answerlist() function provided
by the exams package. For illustration, we set up a multiple-choice question with three
statements about Switzerland. First, we generate an answerlist with statements for the
question.
R> qu <- c("Zurich is the capital of Switzerland.",
+
"Italian is an official language in Switzerland.",
+
"Switzerland is part of the European Union (EU).")
R> answerlist(qu)
C# PDF Image Extract Library: Select, copy, paste PDF images in C#
Get image information, such as its location, zonal information, metadata, and so on. Able to edit, add, delete, move, and output PDF document image.
change pdf page order preview; reordering pages in pdf document
VB.NET PDF Library SDK to view, edit, convert, process PDF file
Rapidly and multiple PDF document (pages) creation and edit methods file formats; merge, append, and split PDF files; insert, delete, move, rotate, copy
pdf reorder pages online; reorder pages in pdf file
16
Flexible Generation of E-Learning Exams in R
\begin{answerlist}
\item Zurich is the capital of Switzerland.
\item Italian is an official language in Switzerland.
\item Switzerland is part of the European Union (EU).
\end{answerlist}
Then the corresponding answerlist for the solution is set up.
R> sol <- c(FALSE, TRUE, FALSE)
R> ex <- c("The capital of Switzerland is Bern.",
+
"The official languages are: German, French, Italian, Romansh.",
+
"Switzerland is part of the Schengen Area but not the EU.")
R> answerlist(ifelse(sol, "True", "False"), ex)
\begin{answerlist}
\item False. The capital of Switzerland is Bern.
\item True. The official languages are: German, French, Italian, Romansh.
\item False. Switzerland is part of the Schengen Area but not the EU.
\end{answerlist}
For more examples see the exercise les in the inst/exercises directoy of the exams source
package. There are various multiple-choice questions with and without gures and/or ver-
batim R output (e.g., anova, boxplots, cholesky, among others). The les tstat and
tstat2 illustrate how the same type of exercise can be coded as a num or schoice question,
respectively. The cloze type is employed in, e.g., boxhist or fourfold (with more  exible
formatting specically for Moodle in boxhist2 and fourfold2,respectively). See also Table3
in the appendix for an overview and AppendixC for more details on cloze exercises.
3.2. The xexams() wrapper function
To avoid recoding certain tedious tasks {such as copying/reading les andhandlingtemporary
directories { for each of the user interfaces introduced in Section2, the new exams package
provides a modular and extensible framework for building new exam-generating functions.
This framework is tied together by the xexams() function which is typically not called by
users directly but forms the basis for all new exams2xyz interfaces.
To accomplish this, xexams() also takes the arguments listed in Table 1 (except name and
template), draws exams from the exercise file list, and does all the necessary le/directory
handling. Furthermore, it takes a driver argument that needs to be a list of four functions
driver = list(sweave, read, transform, write). These are utilized as follows:
1. Weave: For eachof the selected exercise les (within all n exams) driver$sweave(file)
is run to weave the .Rnw le into a .tex le. If sweave = NULL (the default), the
standard Sweave() function is used. If sweave = list(...) is a list, e.g., list(pdf
= FALSE, png = TRUE), this is passed as arguments to Sweave().
2. Read: Each resulting .tex le is read into R using driver$read(file). By default
(read = NULL), the function read_exercise() is used (see below), resulting in a list of
character vectors with the L
A
T
E
Xcode for question/solution plus metainformation.
Journal of Statistical Software
17
list(
## of
exams
, length: n
list(
## of
exercises
, length: k
list(
## of exercise content, length: 6
question,
questionlist,
solution,
solutionlist,
metainfo,
supplements
)
)
)
Figure 7: Structure of the return value of xexams(), when used with the default read driver
read_exercises().
3. Transform: Each of these exercise-wise list objects can subsequently be transformed by
driver$transform(object) which can be leveraged for transformations from LAT
E
Xto
HTML etc. By default (transform = NULL), no transformation is applied.
4. Write: The (possibly transformed) lists of exercises, read into R for each exam ob-
ject, can be written out to one ore more les per exam in an output directory via
driver$write(object, dir, info = list(id, n)). By default (write = NULL), no
les are written.
After performing each of the driver functions, xexams() returns invisibly a nested list object
(currently unclassed) as illustrated in Figure 7. It is a list of exams (of length n), each of
which is a list of exercises (whose length depends on the length of file and nsamp), each of
which is a list (whose length/contents depends on driver$read). When used with the default
read_exercise(), each exercise is a list of length 6 containing the question/solution texts,
metainformation, and paths to supplementary les. These will be introduced in more detail
in the next section.
All of the interfaces introduced in Section2 employ the standard Sweave() function for the
weaving step (possibly with custom arguments) and the read_exercise() function for the
reading step. They mainly dier in the transformation and writing step. exams2pdf() needs
no transformation and the writer rst sets up a .tex le for each exam, calls texi2dvi(pdf
= TRUE), and then copies the resulting .pdf le to the output dir. exams2html() on the
other hand uses a T
E
X-to-HTML transformation and the writer then sets up a .html le for
each exam and copies it to the output dir. Finally, exams2moodle() and exams2qti12()
both also use a transformation to HTML but have no writer. The reason for this is that they
do not write one le per exam (i.e., with only one replication per exercise) but rather need
to produce XML les that include all dierent replications of each exercise. Hence, they take
the list returned by xexams() and process it subsequently in dierent ways. The details for
all these steps are explained in the subsequent subsections.
18
Flexible Generation of E-Learning Exams in R
3.3. The read driver: read_exercise() and read_metainfo()
The function read_exercise() reads the weaved exercises, i.e., les like that shown in Fig-
ure2. It simply extracts the text lines from the question and solution environments and
stores them in vectors of the same name. If these environments contain answerlist en-
vironments, these are extracted and stored separately in questionlist and solutionlist
vectors, respectively. Finally, the metainformation is extracted using read_metainfo() which
not only stores character vectors but also transforms them to suitable types (depending on
the extype) and performs some sanity checks. The resulting metainformation is a list with
elements essentially corresponding to the commands from Table2.
For illustration, we run xexams() to select the same three exams as used in the Moodle
and OLAT examples above. However, using the default driver specication, xexams() just
performs the weaving and reading steps (and has no transformation or writing step):
R> set.seed(1090)
R> x <- xexams(myexam, n = 3)
The resulting object is a nested list as shown in Figure7 with 3 exams of 5 exercises each
(drawn from the myexam list). Using x[[i]][[j]], the j-th exercise of the i-th exam can
be accessed. Here, we explore the rst exercise (boxplots, a multiple-choice question) from
the rst exam that is also shown in Figures5 and6. Its general question text (in LAT
E
X) is
printed below { it requires a graphic which is stored in a supplementary le in a temporary
directory.
R> writeLines(x[[1]][[1]]$question)
In Figure~\ref{fig:ch06-boxplots} the distributions of a variable
given by two samples (A und B) are represented by parallel boxplots.
Which of the following statements are correct? \emph{(Comment: The
statements are either about correct or clearly wrong.)}
\setkeys{Gin}{width=0.7\textwidth}
\begin{figure}[htb!]
\begin{center}
\includegraphics{boxplots-002}
\caption{\label{fig:ch06-boxplots} Parallel boxplots.}
\end{center}
\end{figure}
R> x[[1]][[1]]$supplements
boxplots-002.pdf
"/tmp/RtmpSoC12J/file7ff6d466d19/exam1/exercise1/boxplots-002.pdf"
attr(,"dir")
[1] "/tmp/RtmpSoC12J/file7ff6d466d19/exam1/exercise1"
The corresponding list of statements about the graphic is stored separately. It is shown below
along with the most important metainformation elements.
Journal of Statistical Software
19
R> x[[1]][[1]]$questionlist
[1] "The location of both distributions is about the same."
[2] "Both distributions contain no outliers."
[3] "The spread in sample A is clearly bigger than in B."
[4] "The skewness of both samples is similar."
[5] "Distribution A is about symmetric."
R> x[[1]][[1]]$metainfo[c("file", "type", "solution")]
$file
[1] "boxplots"
$type
[1] "mchoice"
$solution
[1] TRUE TRUE FALSE TRUE TRUE
In summary, xexams() combined with the default readers is relatively straightforward to use
in other progams (such as the exams2xyz functions). The return value is somewhat \raw" as
it is not classed and has no dedicated methods for subsetting etc. However, we refrained from
using a more elaborate structure as this function is not meant to be called by end-users while
we expected other developers to nd the current structure suciently simple to use in their
programs.
3.4. L
A
T
E
X-to-HTML transform driver generator
When embedding statistical/mathematical exercises into web pages or learning management
systems, the exercises’ LAT
E
Xtext { typically containing mathematical notation { has to be
transformed in some way so that it can be rendered by a browser. Until relatively recently,
this posed the notorious problem of how to display the mathematical formulas and often the
only good answer was to embed raster images of the formulas. However, this situation has
clearly changed (see e.g.,Vismor2012) and there are now various convenient options: e.g.,
using the mathematical markup language MathML (W3C2014;Wikipedia2014) or keeping
L
A
T
E
Xformulas in the web page and embedding some JavaScript for rendering them.
Especially the display of MathML in web pages has become very easy: Firefox long had native
support for it and for the Microsoft Internet Explorer the MathPlayer plugin (DesignScience
2013b)haslongbeenavailable.Morerecently,othermajorbrowserslikeOperaorSafarialso
added support for MathML (seeVismor2012, Section 1.2). Google Chrome brie y enabled
MathML support but disabled it again due to instabilities. Furthermore, MathJax (Design
Science 2013a),anopen-sourceJavaScriptengine,canbeusedtorenderMathML(orLAT
E
X)
formulas on a server rather than in the local browser.
Therefore, the new exams package oers functionality for automatically transforming the
LAT
E
Xexercises to HTML within Randby default employs MathML for allmathematical nota-
tion(e.g., as demonstrated in Figure4). More specically, the package provides the driver gen-
erator make_exercise_transform_html(). It returns a function suitable for plug-in into the
20
Flexible Generation of E-Learning Exams in R
transform driver in xexams() whichthen replaces theL
A
T
E
Xcode inquestion/questionlist
and solution/solutionlist with HTML code. For illustration, we set up a particular func-
tion trafo() below and apply it to the rst exercise in the rst exam within the object x
that we had considered before:
R> trafo <- make_exercise_transform_html(converter = "ttm", base64 = FALSE)
R> writeLines(trafo(x[[1]][[1]])$question)
In Figure&nbsp; the distributions of a variable
given by two samples (A und B) are represented by parallel boxplots.
Which of the following statements are correct? <em>(Comment: The
statements are either about correct or clearly wrong.)</em>
<div class="p"><!----></div>
<div class="p"><!----></div>
<a name="tth_fIg1">
</a>
<div style="text-align:center">
<img src="boxplots-002.png" alt="boxplots-002.png" />
<div style="text-align:center">Figure 1: <a name="fig:ch06-boxplots">
</a> Parallel boxplots.</div>
</div>
<div class="p"><!----></div>
It can be seenthat the resulting exercise employs HTML text, e.g., uses <em> instead of \emph
or <img> instead of \includegraphics.
8
Internally, make_exercise_transform_html() can leverage three dierent converters: ttm
(default), tth, or tex2image. The former two come from the R package tth (Hutchinson
et al. 2013) and d internally y call l the two C C functions tth h (T
E
X to HTML) and ttm (T
E
X
to HTML/MathML) taken from the TtH suite of Hutchinson (2012). The last option,
tex2image, is a function provided by the exams package itself. It proceeds by rst run-
ning texi2dvi(pdf = TRUE) from the base R package tools and subsequently converting the
resulting PDF to a raster image in a system() call to ImageMagick’s convert function (Im-
ageMagick Studio LLC 2014). Thus,forthisfunctionImageMagickisassumedtobeinstalled
and in the search path. All three converters have their benets and drawbacks:
tth is typically preferable if there is no or only very simple mathematical notation. The
resulting HTML can then be rendered in any modern browser.
ttm is preferable if there is some standard mathematical notation (e.g., fractions or
equation arrays etc.). As argued above this can still be easily displayed in suitable
browsers or by employing MathJax in the web page.
8
It may be noteworthy to that the conversion (a) assumes the graphics to be in .png format and (b) does
not resolve the gure reference at the beginning of the text correctly. For (a), we just need to make sure that
the sweave driver in xexams() has png = TRUE (and pdf = FALSE) which is accounted for in exams2html()
etc. Issue (b), however, needs to be avoided by formulating the underlying .Rnw dierently (or by tolerating
the missing number).
Documents you may be interested
Documents you may be interested