試行中に反応してもらいたいが,参加者ごとに試行の実施時間が異なるのを避けたいので,試行の時間は固定したいという場合があります。例えば,クイズを呈示して,回答を思いついたらスペースを押してもらう手続きにおいて,スペースを押したとしても(押さなかったとしても),試行開始から30秒経った場合のみ試行終了するという手続きです。この時,回答を思いついた時間(スペースが押された時間)も記録したいとします。

まず,この試行についてはGUIで「Behavior」にTimeoutとして「30000」と入力し,30秒の制限時間を設定しておきます。そして,Scriptsに「before:prepare」のタイミングで以下のコードを書いてください。

//before: prepare
//無反応をデフォルトで指定しておく
this.data.response = "noResponse";
this.data.responseTime = 30000;

//反応があった場合に反応記録

//反応の有無を記録する変数
let responded = false;

//スペースを押した場合
this.options.events['keypress(Space)'] = e =>
{
  e.preventDefault();
  
  //反応済みの場合は何もしない
  if(responded)
  {
    return
  }
  //反応していない場合(初回)
  else{
    this.data.response = "responded";
    this.data.responseTime = e.timeStamp - this.internals.timestamps.show;
    responded = true;
  }
}

このコードでは,まず,最初に無反応時のデータを仮にいれておきます。この試行は30秒(30000ms)の試行なので,無反応で時間経過した場合は無反応(noResponse)を反応として記録し,同時に試行の制限時間(30000)を(無)反応時間として記録しています。何も反応がない場合はこのデータが記録されます。スペースが押された場合で,かつ,そのスペース押下が初回だった場合には反応あり("respondend")と記録し,その反応時間も記録します。e.timeStamp - this.internals.timestamps.showという式は,実験開始から反応取得時点までの経過時間(e.timeStamp)から,実験開始からこの試行開始時までの経過時間( this.internals.timestamps.show)を引くことで,反応時間を計算するためのものです。2回目以降のスペースが押された際に反応記録が上書きされないように,respondedという変数でロック処理も行っています。「反応済みの場合は何もしない」というところなどを参照してください。

余裕があれば後日,デモとコードを追加します。

©2021 Masanori Kobayashi