Search code examples
dynamicmoodler-exams

Exams Package - Setting up a quiz for moodle with multiple exercises


I am trying to set up a simple exercise for moodle with the aid of the exams package. It seems that I miss something and the file that I import to Moodle does not include all the items that are supposed to be included. The code appears below. I would appreciate any hint that could help me resolve this problem. The code is as follows:

    <<echo=FALSE, results=hide>>=
    id     <- seq(1:220)
    age    <- round(runif(220, 18, 60), 2)
    weight <- round(runif(220, 45,100), 2)
    gender <- sample(c("male", "female"), 220, replace=T)
    mydata <- data.frame(cbind(id, gender, age, weight))
    mydata$id     <- as.numeric(mydata$id)
    mydata$age    <- as.numeric(mydata$age)
    mydata$weight <- as.numeric(mydata$weight)
    write.csv(mydata, "DataQuiz1.csv", row.names = FALSE, quote = FALSE)
    @    

    \begin{question}
    Using the data provided in \url{DataQuiz1.csv} 
    \begin{answerlist}
    \item Report the variance of participants' \texttt{weight} (rounded up to two decimal places).
    \item Report what is the \texttt{age} of the youngest person (rounded up to two decimal places).
    \item Report wht is the \texttt{age} of the eldest participant (rounded up to two decimal places).
    \item Indicate what is the 3rd quartile for the variable \texttt{weigh}  (rounded up to two places).
    \item Write down how many participants are included in the \texttt{DataQuiz1}.
    \end{answerlist}
    \end{question}

    \begin{solution}
    <<echo=FALSE, results=hide, fig=TRUE>>=
    varsol  <- var(mydata$weight)
    minsol  <- min(mydata$age)
    maxsol  <- max(mydata$age)
    sol1   <-  print (summary(mydata)[5, 4 ])
    sol2  <- nrow(mydata)
    solutions <- c(varsol, minsol, maxsol, sol1, sol2)
    answerlist(ifelse(solutions, "True", "False"))
    @ 


   To replicate the analysis in R:
    \begin{verbatim}
    ## data
    mydata <- read.csv("DataQuiz1.csv")
    ## To find the variance for weight:
    var(mydata$weight)
    ## To find the minimum value for age:
    min(mydata$age)
    ## To find the maximum value for age:
    max(mydata$age)
    ## To find what is the 3rd Quartile of weight 
    summary(mydata$weight) (and check the fifth row, fourth column)
    ## To find out how many participants
    nrow(mydata)
    \end{verbatim}

    \end{solution}

    %% \exname{find_the_variance_and_minimum}
    %% \extype{num}
    %% \exsolution{\Sexpr{fmt(c=(varsol | minsol | maxsol | sol1 | sol2), 2)}}
    %% \exclozetype{num|num|num|num|num}
    %% \extol{0.01}




Solution

  • There are three issues with the exercise that prevent it from working correctly:

    1. Computing the 3rd quartile with print (summary(mydata)[5, 4 ]) yields a character and not a numeric output. Subsequent formatting etc. as a number does thus not work. Instead use summary(mydata$weight)[5] or quantile(mydata$weight, 0.75).
    2. The extype needs to be cloze not num.
    3. The command fmt(c=(varsol | minsol | maxsol | sol1 | sol2), 2) does not do what you want to do. Use paste(fmt(solutions, 2), collapse = "|") instead. (Note that it is important to have fixed issue 1 above for that.)

    With some further streamlining the exercise then looks like this:

    <<echo=FALSE, results=hide>>=
    id     <- seq(1:220)
    age    <- round(runif(220, 18, 60), 2)
    weight <- round(runif(220, 45,100), 2)
    gender <- sample(c("male", "female"), 220, replace=TRUE)
    mydata <- data.frame(cbind(id, gender, age, weight))
    mydata$id     <- as.numeric(mydata$id)
    mydata$age    <- as.numeric(mydata$age)
    mydata$weight <- as.numeric(mydata$weight)
    write.csv(mydata, "DataQuiz1.csv", row.names = FALSE, quote = FALSE)
    @    
    
    <<echo=FALSE, results=hide, fig=TRUE>>=
    varsol  <- var(mydata$weight)
    minsol  <- min(mydata$age)
    maxsol  <- max(mydata$age)
    sol1   <-  summary(mydata$weight)[5]
    sol2  <- nrow(mydata)
    solutions <- c(varsol, minsol, maxsol, sol1, sol2)
    @ 
    
    \begin{question}
    Using the data provided in \url{DataQuiz1.csv} 
    \begin{answerlist}
    \item Report the variance of participants' \texttt{weight} (rounded up to two decimal places).
    \item Report what is the \texttt{age} of the youngest person (rounded up to two decimal places).
    \item Report wht is the \texttt{age} of the eldest participant (rounded up to two decimal places).
    \item Indicate what is the 3rd quartile for the variable \texttt{weigh}  (rounded up to two places).
    \item Write down how many participants are included in the \texttt{DataQuiz1}.
    \end{answerlist}
    \end{question}
    
    \begin{solution}
    Replicate the analysis in R:
    \begin{verbatim}
    ## data
    mydata <- read.csv("DataQuiz1.csv")
    ## To find the variance for weight:
    var(mydata$weight)
    ## To find the minimum value for age:
    min(mydata$age)
    ## To find the maximum value for age:
    max(mydata$age)
    ## To find what is the 3rd Quartile of weight 
    summary(mydata$weight)
    ## To find out how many participants
    nrow(mydata)
    \end{verbatim}
    \end{solution}
    
    %% \exname{find_the_variance_and_minimum}
    %% \extype{cloze}
    %% \exsolution{\Sexpr{paste(fmt(solutions, 2), collapse = "|")}}
    %% \exclozetype{num|num|num|num|num}
    %% \extol{0.01}