R et Moodle : SARP.Moodle

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 />&nbsp",
		"<br />&nbsp",
		" [[",a,"]] < [[",b,"]] < [[",c,"]] < [[",d,"]] .",
		"<br /> ",
		"<br />&nbsp",
		"<br />&nbsp",
		"<br />&nbsp")

	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)