Bouclage et variables indépendantes
L'élément loop a deux fonctions importantes :
- Il exécute un autre élément plusieurs fois.
- C'est là que vous définissez généralement vos variables indépendantes ; c'est-à-dire les variables que vous manipulez dans votre expérience.
- L'élément à exécuter
- Définition des variables indépendantes
- Lecture des variables indépendantes à partir d'un fichier
- Interrompre la boucle
- Génération d'un plan factoriel complet
- Pseudorandomisation
- Opérations avancées sur les boucles
- Aperçu de la boucle
- Accéder à la table de boucle dans un script Python en ligne
L'élément à exécuter
Un loop est toujours connecté à un autre élément : l'élément à exécuter. Vous sélectionnez l'élément à exécuter dans la case étiquetée "Exécuter". Dans la plupart des cas, l'élément à exécuter est une sequence, qui exécute plusieurs éléments séquentiellement.
Deux structures sequence-loop courantes sont :
- Si une sequence correspond à un seul essai (par convention appelé trial_sequence), alors un loop connecté à cette séquence correspond à plusieurs essais, ou un bloc (par convention appelé block_loop).
- Si une sequence correspond à un bloc d'essais suivis d'un affichage de feedback (par convention appelé block_sequence), alors un loop connecté à cette séquence correspond à plusieurs blocs, ou une session expérimentale complète (par convention appelée experimental_loop).
Définition des variables indépendantes
Le tableau de loop est un moyen simple et puissant de définir des variables indépendantes. Chaque colonne du tableau correspond à une variable; chaque ligne correspond à un cycle, c'est-à-dire un niveau de la variable. Par exemple, une boucle simple avec une variable (animal
) comportant deux cycles ("chat" et "chien") ressemble à ceci :
animal |
---|
chat |
chien |
Le loop a quelques options importantes :
Répéter indique combien de fois chaque cycle doit être exécuté. Dans l'exemple ci-dessus, répéter est réglé sur 2, ce qui signifie que trial_sequence est appelé deux fois alors que la variable animal
a la valeur "chat", et deux fois alors que animal
a la valeur "chien" (quatre fois en tout).
Ordre indique si les cycles doivent être exécutés séquentiellement ou dans un ordre aléatoire. La randomisation est complète, dans le sens où la liste complète des essais nombre-de-cycles × répétition est randomisée.
Lecture des variables indépendantes à partir d'un fichier
Si vous souhaitez lire des variables indépendantes à partir d'un fichier plutôt que de les entrer dans le tableau de loop, vous pouvez procéder comme suit :
- Réglez Source sur fichier.
- Sélectionnez un fichier Excel (
.xlsx
) ou CSV (.csv
) dans l'entrée Fichier.
Le fichier source suit les mêmes conventions que le tableau de loop ; c'est-à-dire que chaque colonne correspond à une variable et chaque ligne correspond à un cycle.
Les fichiers CSV doivent être au format suivant :
- texte brut
- séparés par des virgules
- entre guillemets doubles (les guillemets doubles littéraux sont échappés par des barres obliques inverses)
- encodé en UTF-8
Interrompre la boucle
Si vous souhaitez interrompre la boucle avant que tous les cycles aient été exécutés, vous pouvez spécifier une expression break-if. Cette expression break-if suit la même syntaxe que les autres expressions conditionnelles, telles que décrites sur :
Par exemple, l'instruction break-if suivante interromprait la boucle dès qu'une réponse correcte est donnée :
correct == 1
L'option Évaluer au premier cycle indique si l'instruction break-if doit être évaluée avant le premier cycle, auquel cas aucun cycle peut ne pas être exécuté du tout, ou seulement avant le deuxième cycle, auquel cas au moins un cycle est toujours exécuté. Dans certains cas, l'instruction break-if fera référence à une variable qui n'est définie qu'après le premier cycle, auquel cas vous devez désactiver l'option 'Évaluer au premier cycle' pour éviter une erreur 'Variable does not exist'.
Génération d'un plan factoriel complet
En cliquant sur le Plan factoriel complet, vous ouvrez un assistant qui vous permet de générer facilement un plan factoriel complet, c'est-à-dire un plan dans lequel chaque combinaison de facteurs se produit.
Pseudorandomisation
Vous pouvez ajouter des contraintes de pseudorandomisation au script de l'élément loop. Cela permet de mélanger les lignes, même si l'ordre est réglé sur séquentiel. (Actuellement, cela n'est pas possible via l'interface graphique.)
Exemple : Assurez-vous que les répétitions du même mot (donné par la variable word
) sont séparées par au moins 4 cycles :
constrain word mindist=4
Exemple: Assurez-vous que le même mot n'est pas répété:
constrain word maxrep=1
Les commandes constrain
doivent venir après les commandes setcycle
.
Opérations avancées sur les boucles
Les commandes pour les opérations avancées sur les boucles doivent venir après les commandes constrain
et setcycle
.
fullfactorial
L'instruction fullfactorial
traite la table de boucle comme l'entrée pour un plan factoriel complet. Par exemple, la table de boucle suivante:
cue | duration |
---|---|
left | 0 |
right | 100 |
200 |
Donnera comme résultat:
cue | duration |
---|---|
left | 0 |
left | 100 |
left | 200 |
right | 0 |
right | 100 |
right | 200 |
shuffle
shuffle
sans argument mélange toute la table. Lorsqu'un nom de colonne est spécifié (shuffle cue
), seule cette colonne est mélangée.
shuffle_horiz
shuffle_horiz
mélange toutes les colonnes horizontalement. Lorsque plusieurs colonnes sont spécifiées, seules ces colonnes sont mélangées horizontalement.
Par exemple, lorsque shuffle_horiz word1 word2
est appliqué à la table suivante :
word1 | word2 | word3 |
---|---|---|
cat | dog | bunny |
cat | dog | bunny |
cat | dog | bunny |
Le résultat pourrait être (c'est-à-dire que les valeurs sont échangées de manière aléatoire entre word1
et word2
, mais pas word3
):
word1 | word2 | word3 |
---|---|---|
dog | cat | bunny |
dog | cat | bunny |
cat | dog | bunny |
slice
slice [from] [to]
sélectionne une partie de la boucle. Il nécessite un indice de début et de fin, où 0 est la première ligne et les valeurs négatives sont comptées à partir de la fin vers l'arrière. (Comme dans le découpage de liste en Python, en d'autres termes.)
Par exemple, lorsque slice 1 -1
est appliqué à la table suivante :
word |
---|
cat |
dog |
bunny |
horse |
Le résultat serait:
word |
---|
dog |
bunny |
sort
sort [column]
trie une seule colonne, sans modifier les autres colonnes.
sortby
sortby [column]
trie la table entière par une seule colonne.
reverse
reverse
inverse l'ordre de toute la table. Si un nom de colonne est spécifié (par exemple, reverse word
), seule cette colonne est inversée, sans changer les autres colonnes.
roll
roll [value]
fait avancer (pour les valeurs positives) ou reculer (pour les valeurs négatives) toute la table. Si un nom de colonne est spécifié (par exemple, roll 1 word
), seule cette colonne est décalée, sans changer les autres colonnes.
Par exemple, si roll 1
est appliqué à la table suivante :
word |
---|
cat |
dog |
bunny |
horse |
Le résultat serait:
word |
---|
horse |
cat |
dog |
bunny |
weight
weight [column]
répète chaque ligne en fonction d'une valeur de pondération spécifiée dans une colonne.
Par exemple, si weight w
est appliqué à la table suivante :
word | w |
---|---|
cat | 0 |
dog | 0 |
bunny | 2 |
horse | 1 |
Le résultat serait:
word | w |
---|---|
bunny | 2 |
bunny | 2 |
horse | 1 |
Aperçu de la boucle
Si vous avez spécifié des contraintes ou utilisé des opérations avancées sur les boucles, il est conseillé de vérifier que le résultat est celui attendu. Pour ce faire, vous pouvez générer un aperçu de la table de boucle telle qu'elle sera (ou pourrait être, en cas de randomisation) lorsque vous exécuterez l'expérience.
Pour générer un aperçu, cliquez sur le bouton Aperçu.
Accéder à la table de boucle dans un script Python en ligne
La table loop d'origine, telle que vous la voyez dans l'interface utilisateur d'OpenSesame, est un objet DataMatrix
appelé dm
, et est une propriété de l'élément loop.
Cette table loop d'origine est généralement transformée de diverses manières ; par exemple, l'ordre des lignes peut être randomisé, et les lignes peuvent être répétées plusieurs fois. La loop transformée est également un objet DataMatrix
, et s'appelle live_dm
. live_dm
est créé juste avant l'exécution de la boucle et est défini à None
lorsque la boucle est terminée ; c'est-à-dire que live_dm
est disponible uniquement pendant la phase run de la loop.
Enfin, l'indice de la ligne courante est stocké dans la variable expérimentale live_row
. C'est-à-dire que live_row
indique la ligne active de live_dm
.
Alors, disons que nous avons une loop appelée block_loop. Nous pourrions alors accéder à la table loop dans un script Python en ligne comme suit :
print("La table originale de la boucle :")
print(items['block_loop'].dm)
print("La table de boucle transformée :")
print(items['block_loop'].live_dm)
print("La ligne actuelle :")
print(items['block_loop'].live_dm[var.live_row])
Vous pouvez même définir la table loop de manière programmatique. Vous devez le faire dans la phase de préparation d'un inline_script qui précède la loop.
from datamatrix import DataMatrix
items['block_loop'].dm = DataMatrix(length=4)
items['block_loop'].dm.cue_side = 'gauche', 'droite', 'gauche', 'droite'
items['block_loop'].dm.cue_validity = 'valide', 'valide', 'invalide', 'invalide'
Les objets DataMatrix
sont des structures puissantes pour travailler avec des données tabulaires. Pour plus d'informations, consultez :