アプリケーションとラウンド¶
アプリケーション¶
oTreeアプリケーションはPythonおよびHTMLコードを含むフォルダとして構成されます。一つのプロジェクト内で複数のアプリケーションを含むことができます。セッションは基本的に、次々に実行される一連のアプリケーションを表します。
アプリケーションの組合わせ¶
セッション構成 app_sequence
を設定することで、アプリケーションを組み合わせることができます。
アプリケーション間のデータ受け渡し¶
Participant fields と session fields を参照してください。
ラウンド¶
C.NUM_ROUNDS
に値を設定することで、実行するラウンド数を設定できます。例えば、 app_sequence
が ['app1', 'app2']
として設定されており、 app1
が NUM_ROUNDS = 3
に、app2
が NUM_ROUNDS = 1
に設定されている場合は、合わせて4つのセッションが実行されます。
ラウンド数¶
player.round_number
で現在のラウンド数を参照できます。(この要素はsubsession、group、playerオブジェクトが保持しています。)ラウンド数は1から数えられます。
ラウンドとアプリケーション間のデータの受け渡し¶
それぞれのラウンドは個別の Group
、 Player
オブジェクトを保持します。例えば、ラウンド1で player.my_field = True
に設定した場合、ラウンド2で player.my_field
の値を参照しようとしても None
が返ってきます。これはラウンドによって個別に Player
オブジェクトが作成されるためです。
過去のラウンドやアプリケーションからのデータにアクセスするために、以下のいずれかの方法でアクセスすることができます。
in_rounds、 in_previous_rounds、 in_round など¶
Player、Group、subsessionオブジェクトは次のメソッドを持ちます。
- in_previous_rounds()
- in_all_rounds()
- in_rounds()
- in_round()
例えば、もし10ラウンドのゲームの最後に、 player.in_previous_rounds()
を呼び出すと、過去の9ラウンド分の同じ参加者のPlayerオブジェクトのデータが返されます。
player.in_all_rounds()
はほとんど同じですが、現在のラウンドも含めて10このオブジェクトを返します。
player.in_rounds(m, n)
はラウンド m
からラウンド n
までの同じ参加者のPlayerのリストを返します。
player.in_round(m)
はラウンド m
のPlayerデータを返します。例えば、前のラウンドの参加者の利得が知りたい場合は、次のようにします。
prev_player = player.in_round(player.round_number - 1)
print(prev_player.payoff)
これらの関数はsubsessionでも同じように機能します。(例: subsession.in_all_rounds()
)
これらはGroupに対しても同じように機能しますが、ラウンド間でグループがシャッフルされる場合は、使用しても正しい結果を得ることはできません。
Participant fields¶
前のアプリケーションの参加者のデータにアクセスしたいのなら、participantオブジェクトにアクセスしたいデータをあらかじめ保存しておく必要があります。このオブジェクトはアプリケーション間で保存されます。( Participant )( in_all_rounds()
は、同じアプリケーションの前のラウンドのデータにアクセスする必要があるときのみ有効です。)
実験の参加者に定義したいフィールドの名前のリストである、 PARTICIPANT_FIELDS
を定義し、設定してください。
すると、コード上でこれらのフィールドに任意のタイプのデータの取得や設定ができます。
participant.mylist = [1, 2, 3]
内部的には、すべての参加者のデータは participant.vars
という辞書型リストに保存されています。また、 participant.xyz
は participant.vars['xyz']
と同等です。
session fields¶
セッション中のすべての参加者で共通のグローバル変数を利用するために、 SESSION_FIELDS
を追加してください。それは、 PARTICIPANT_FIELDS
と同じように働きます。内部的には、全ての session fields は session.vars
に保存されます。
ラウンド数を可変にする¶
もし、ラウンドを可変にしたいなら、ライブページ の利用を検討してください。
代わりに、 NUM_ROUNDS
を高い値に設定してから、プログラム内である条件で {{ next_button }}
を非表示にして、先のラウンドへ進めなくするか、 app_after_this_page を使う方法もあります。ただし、ラウンド数が増えると(例えば、100以上)、パフォーマンスに問題が生じる可能性があります。注意して、テストしてください。