Reply To: Question about assigning conditions, groups + randomization

PennController for IBEX Forums Support Question about assigning conditions, groups + randomization Reply To: Question about assigning conditions, groups + randomization

#10745
Jeremy
Keymaster

Hi Kate,

You can use the same function to generate all your trials:

Template("dummy", () => {
    const targetKeys = Object.keys(targets);
    fisherYates(targetKeys);   // shuffle the references to the pairs
    let new_targets = []; // this will contain half the items (only POS or only NEG for each pair)
    for (let i=0; i<targetKeys.length; i++) // keep the POS rows for the first half, the NEG rows for the second half
        new_targets.push( ...targets[targetKeys[i]][ i<targetKeys.length/2 ? "posi" : "neg"] );
    // Create three items per row that we kept
    new_targets = new_targets.map(t=>
        [ {contextsetter: t['contextcomparative'], contextquestion: t['comparativequestion']},
          {contextsetter: t['contextequative'], contextquestion: t['equativequestion']},
          {contextsetter: t['contextquestion'], contextquestion: t['questionquestion']}
        ].map(row => ["experiment_"+t.pair,"PennController", myCustomTrialFunction(row)] ) // this map returns an array of 3 trials
    ).flat(); // flatten the array to have all the trials at the root, instead of having a series of arrays of 3 trials
    // Shuffle new_targets as long as we can find three items in a row that come from the same pair
    while (new_targets.find( (v,i)=>i<(new_targets.length-2) && v[0].split('_')[1]==new_targets[i+1][0].split('_')[1] && v[0].split('_')[1]==new_targets[i+2][0].split('_')[1] ))
        fisherYates(new_targets);
    window.items = new_targets; // now add the trials to the experiment's items
    return {}; // we added the items manually above: return an empty object from Template
})

This way you necessarily get the same rendering for all your trials

Jeremy