高级选项
实验题在编辑页右侧边栏提供「自定义变量」配置,用于声明这道题要收集哪些字段。本页说明它的用法,以及数据回收的体积限制。
自定义变量
自定义变量用于声明这道题要收集哪些字段。实验通过 postMessage 回传数据时(由 SDK 自动完成),只有 key 命中已声明变量的字段才会入库,未声明的字段静默丢弃。
内置变量
实验题已内置声明了 jsPsych 的常用数据列,无需手动添加:
| 变量 | 含义 |
|---|---|
trial_type | 该 trial 使用的插件名 |
trial_index | trial 在时间线中的序号(从 0 开始) |
time_elapsed | 实验开始到该 trial 结束的累计毫秒数 |
internal_node_id | trial 在时间线结构中的内部节点标识 |
rt | 反应时(毫秒) |
response | 被试的反应(按键、选项索引、输入内容等,取决于插件) |
stimulus | 该 trial 呈现的刺激 |
这些变量在设置面板里不展示、也不可删除。
添加自定义变量
实验里自己写入的字段需要手动声明。常见来源有两类:
一是在 trial 上通过 data 附加的标记字段:
{
type: jsPsychHtmlKeyboardResponse,
stimulus: '<p>请按 F</p>',
choices: ['f'],
data: { condition: 'congruent', block: 1 }, // condition、block 需声明
}
二是在 on_finish 里计算出的派生字段:
{
type: jsPsychHtmlKeyboardResponse,
stimulus: '<p>请按 F</p>',
choices: ['f'],
on_finish: (data) => {
data.correct = data.response === 'f'; // correct 需声明
},
}
在右侧边栏「自定义变量」区域声明它们:
- 在输入框输入变量名,点击「保存」(或回车)即新增,下方出现对应标签。
- 点击「批量设置」可一次粘贴多个变量名,用换行或逗号分隔。
- 点击标签上的「x」删除该变量。
变量名必须完全一致
变量名需与实验回传数据里的 key 完全一致(区分大小写),否则不会被收集。
数据结构与查看
答案以二维数组存储,每一次上报(即每个 trial)对应一个子数组,同一轮作答内全量保留、不做覆盖。字段含义与完整结构说明见 HTML 题 · 答案数据结构。
受访者重新进入这道题会开启新一轮作答,作答完毕后新一轮数据整体覆盖上一轮,不会叠加。
在自定义逻辑中使用
在自定义逻辑中用 VAR 函数读取变量值,第一个参数是这道实验题的题号,第二个参数是变量名,内置变量与自己声明的变量都可以直接用:
if VAR(Q2, "rt") > 500 then show Q3
if VAR(Q2, "correct") == "true" then show Q3
set Q4 = VAR(Q2, "response")
有几点需要注意:
- 变量名必须是内置变量或已在「自定义变量」中声明的变量,否则保存自定义逻辑时会提示错误。
- 每个 trial 都会上报一次,同一个变量因此有多个值,只要其中任意一次的值满足比较条件,条件即成立。
- 数据在实验跑完(SDK 发送结束信号)后才写入答案,因此依赖
VAR的逻辑会在本题作答完毕后生效。
如果只想判断这道题有没有做完,直接把题号当条件即可,不必借助变量:
if VAR(Q2, "水果") == "香蕉" then show Q3
if VAR(Q2, "水果") == "香蕉" and VAR(Q2, "饮料") == "可乐" then show Q3
replace "{{变量}}" in Q2 title with VAR(Q1, "水果")
更多见语法-函数。
数据体积限制
postMessage 不适合搬运大体积素材,SDK 与问卷两侧都有裁剪:
| 限制 | 说明 |
|---|---|
| 单个字段 20000 字符 | 超出的字段被丢弃,控制台给出警告 |
| 单条消息 200000 字符 | 整条消息跳过上报 |
| 一轮作答 2000 批 | 超出的上报被忽略 |
因此请不要把 base64 图片、逐帧眼动采样等原始素材直接写进 trial data。这类数据建议在实验内先做聚合,只回传统计量。