SARP. Moodle : c’est quoi ?
SARP.Moodle est un module pour R écrit par Emmanuel Curis permettant de créer des questions Moodle utilisables dans des tests.
On pourra alors rapidement créer des jeux de questions mathématiques dans lesquelles les paramètres prendront des valeurs différentes
Installation
Depuis R, lancer la commande suivante :
install.packages("SARP.moodle")
NB : Comme logiciel, vous pouvez utiliser Rstudio ou, comme moi, Sublime Text.
Proposition de modèle de fichier
Voici un fichier commenté qui permet de comprendre les étapes importantes d’un fichier utilisant SARP.Moodle.
Attention : pour éviter des messages d’erreur, il faut s’assurer que le dossier où sera écrit le fichier xml existe !
## SARP.moodle # appel à la librairie library( SARP.moodle ) # pour fixer le dossier de travail setwd("~/") #pour utiliser la fonction TeX() library(latex2exp) # création du fichier fichierxml fichierxml <- debuter_xml.moodle( "chemin/nom_du_xml" ) # choix de la catégorie pour l'importation dans Moodle categorie.moodle( "SARP/chemin_categorie" ) ###################################### # #----> On placera les questions ici # ###################################### #on cloture le fichier xml finir_xml.moodle(fichierxml) remove(fichierxml)
Exemple : numerique.moodle()
Dans cet exemple, on crée une série de questions sur la somme de deux entiers naturels.
Les réponses sont donc des valeurs numériques saisies par l’utilisateur.
## SARP.moodle library( SARP.moodle ) fichierxml <- debuter_xml.moodle( "addition" ) categorie.moodle( "SARP/Exemples" ) ########################################################## # création des questions # n.questions <- 50 for ( i in 1:n.questions ) { a <- sample( 2:10, 1 ) b <- sample( 2:10, 1 ) texte <- paste0( "\\( ", a, " + ", b, " = \\) ?" ) numerique.moodle( titre = "a + b = ?", texte = texte, bonne.reponse = a + b, n.decimales = NA ) } # # fin des questions ########################################################## finir_xml.moodle(fichierxml) remove(fichierxml)
Exemple : qcm.moodle()
Dans cet exemple, on crée une série de questions de type QCM sur le calcul littéral.
On pourra utiliser cette fonction pour un Vrai/Faux, en ne gardant qu’une erreur !
## SARP.moodle library( SARP.moodle ) fichierxml <- debuter_xml.moodle( "-ax+bx" ) categorie.moodle( "SARP/Exemples" ) ########################################################## # création des questions # n.questions <- 50 for ( i in 1:n.questions ) { a <- sample( 2:10, 1 ) b <- sample( 2:10, 1 ) texte <- paste0( "\\( ", -a, "x + ", b, "x = \\) ?" ) reponse <- paste0("\\( ", -a+b, "x \\)" ) erreur1 <- paste0("\\( ", -a-b, "x^2 \\)" ) erreur2 <- paste0("\\( ", -a-b, "x \\)" ) erreur3 <- paste0("\\( ", -a+b, "x^2 \\)" ) qcm.moodle( titre = "-ax + bx = ?", texte = texte, bonnes.reponses = c(reponse), mauvaises.reponses = c(erreur1,erreur2,erreur3)) } # # fin des questions ########################################################## finir_xml.moodle(fichierxml) remove(fichierxml)
Exemple : glisser_textes.moodle()
Dans cet exemple, on doit remettre dans l’ordre croissant quatre nombres.
L’utilisateur devra faire glisser les quatre nombres dans les zones blanches.
Dans l’énoncé de la question, il suffit de placer entre double crochets le texte des étiquettes mobiles.
## SARP.moodle library( SARP.moodle ) fichierxml <- debuter_xml.moodle( "ordre_croissant" ) categorie.moodle( "SARP/Exemples" ) ########################################################## # création des questions # n.questions <- 50 for ( i in 1:n.questions ) { a = sample(-20:-10,1) b = sample(-9:-5,1) c = sample(0,4,1) d = sample(5:9,1) entete = paste0("Faire glisser les nombres pour remplir les zones blanches :", "<br /> ", "<br /> ", " [[",a,"]] < [[",b,"]] < [[",c,"]] < [[",d,"]] .", "<br /> ", "<br /> ", "<br /> ", "<br /> ") glisser_textes.moodle( entete, titre = "Ordre croissant", infini = FALSE, ordre.aleatoire = TRUE, afficher.erreurs = TRUE) } # # fin des questions ########################################################## finir_xml.moodle(fichierxml) remove(fichierxml)
Exemple : question_libre.moodle()
Dans cet exemple, l’utilisateur va devoir rentrer le quotient et le reste de la division euclidienne.
## SARP.moodle library( SARP.moodle ) fichierxml <- debuter_xml.moodle( "division" ) categorie.moodle( "SARP/Exemples" ) ########################################################## # création des questions # n.questions <- 20 for ( i in 1:n.questions ) { a = sample(50:100,1) b = sample(6:9,1) q = a %/%b #quotient r = a %%b #Reste entete = paste0("Soit \\( A = \\dfrac{",a,"}{",b,"} \\). ", "<br />\n", "D'après la division euclidienne", "<br />\n") question_libre.moodle( titre = "b*q+r", texte.intro = entete, textes.avant = list( paste0("\\(",a," = ",b," \\times \\)"), "\\( + \\)"), texte.final = ".", reponses = list( q,r ) ) } # # fin des questions ########################################################## finir_xml.moodle(fichierxml) remove(fichierxml)
Exemple : utilisation d’image dans les énoncés
Dans cet exemple, on crée des graphiques : chacun contient un point dans un repère.
On va profiter de chaque dessin pour réaliser plusieurs questions.
Attention, cet exemple ne fonctionnera que si certains dossiers existent.
- lier_image.moodle(nom_image, interne = TRUE ) : dans ce cas, les images sont incluses dans le fichier xml.
- lier_image.moodle(nom_image, interne = FALSE ) : dans ce cas, les images sont externes. Il faut donc avoir initialisé le chemin vers les images.
- Conseil : commencer avec les images incluses puis, une fois que les images sont crées, vous pourrez ensuite utiliser des images externes hébergées dans un endroit adéquat.
On pourra utiliser la rubrique sur les graphiques avec R pour plus d’information.
##################### ## SARP.moodle setwd("~/XML/SARP_Moodle/") library(latex2exp) library( SARP.moodle ) dossier = "Repère" nom_xml = "abs-ord" nom_categorie = "Repère/Abscisse et ordonnée" setwd(dossier) fichierxml <- debuter_xml.moodle( paste0("../../",dossier,"/",nom_xml ) ) categorie.moodle( paste0("SARP/",nom_categorie ) ) #------------------ n questions numériques n.dessins <- 80 for ( i in 1:n.dessins ) { xA=0 ;while(xA==0) {xA = sample( -5:5, 1 )} yA=0 ;while(yA==0) {yA = sample( -5:5, 1 )} #------------------------------------------ début de la création de l'image nom_image = paste0("image",sprintf("%02d",i),".png") png(nom_image, width = 500, height = 500 ) #------ début du repere a=-6 b=6 plot(0,0, xlim=c(a,b), ylim=c(a,b), xaxs="i", yaxs="i", axes=FALSE, xaxp=c(a,b,b-a), yaxp=c(a,b,b-a), panel.first = grid(nx=b-a,ny=b-a), xlab=NA, ylab=NA, type="l", lwd=2, col="red") axis(1,pos=0,xaxp=c(a,b,b-a)) #,xaxp=c(a,b,b-a) axis(2,pos=0,las=2,yaxp=c(a,b,b-a)) # ,yaxp=c(a,b,b-a) #------ fin du repère points(xA,yA,pch=4,cex=1.5) text(xA,yA,TeX("$A$"),pos=1,cex=1.5,col="blue",offset=1.1) dev.off() #------------------------------------------------fin de l'image url_chemin = paste0("https://moncheminverslesimages/Automatismes/",dossier) definir_dossier.image.moodle(url_chemin) texte_inserer_image <- lier_image.moodle(nom_image, interne = FALSE ) #-------------------- fin de la création de l'image ###################################################### # x_A = ? texte <- paste0( texte_inserer_image, "<br />\n", "Donner l'abscisse de \\( A \\).") numerique.moodle( titre = "x_A = ?", texte = texte, bonne.reponse = xA, n.decimales = NA ) # ####################################################### ###################################################### # y_A = ? texte <- paste0( texte_inserer_image, "<br />\n", "Donner l'ordonnée de \\( A \\).") numerique.moodle( titre = "y_A = ?", texte = texte, bonne.reponse = yA, n.decimales = NA ) # ####################################################### ###################################################### # x_A < 0 ? if (xA*yA<0) { texte <- paste0( texte_inserer_image, "<br />\n", "L'abscisse de \\( A \\) est négative.") if (xA<0) { reponse <- paste0("Vrai" ) erreur1 <- paste0("Faux" ) } else { reponse <- paste0("Faux" ) erreur1 <- paste0("Vrai" ) } qcm.moodle( titre = "x_A < 0 ?", texte = texte, bonnes.reponses = c(reponse), mauvaises.reponses = c(erreur1)) } # ####################################################### ###################################################### # y_A < 0 ? if (xA*yA<0) { texte <- paste0( texte_inserer_image, "<br />\n", "L'ordonnée de \\( A \\) est négative.") if (yA<0) { reponse <- paste0("Vrai" ) erreur1 <- paste0("Faux" ) } else { reponse <- paste0("Faux" ) erreur1 <- paste0("Vrai" ) } qcm.moodle( titre = "y_A < 0 ?", texte = texte, bonnes.reponses = c(reponse), mauvaises.reponses = c(erreur1)) } # ####################################################### ###################################################### # xA < yA ? if (xA!=yA) { texte <- paste0( texte_inserer_image, "<br />\n", "L'abscisse de \\( A \\) est inférieure à son ordonnée.") if (xA<yA) { reponse <- paste0("Vrai" ) erreur1 <- paste0("Faux" ) } else { reponse <- paste0("Faux" ) erreur1 <- paste0("Vrai" ) } qcm.moodle( titre = "x_A < y_A ?", texte = texte, bonnes.reponses = c(reponse), mauvaises.reponses = c(erreur1)) } # ####################################################### } #-------------------- fin questions numériques coder_image.moodle( nom_image ) # à mettre avant finir_xml.moodle(fichierxml) finir_xml.moodle(fichierxml) remove(fichierxml)