可以在公式中包括条件表达式(简称为条件)。使用这些表达式,您可以生成一系列与结果表达式配对的子句。构造一系列子句可以让您根据条件将值赋给计算列中的单元格。条件遵循以下规则:
• 没有子句为真时,“公式编辑器”对伴随 else 子句的结果表达式求值。
• 条件表达式中所有结果表达式的求值结果必须为同一数据类型。
• 缺失项匹配任意数据类型。
• 从定义上来说,求值结果为零的表达式为假。
• 若表达式的求值结果为缺失值,则不会执行任何子句,只会返回缺失值。其他所有数值表达式都为真。
有关语法的详细信息,请参见《Scripting Guide》中的Conditional Functions和《JSL Syntax Reference》中的Conditional and Logical Functions。
使用“公式编辑器”面板上的插入和删除子句按钮来展开表达式。为了提高效率,最先列出了最常求值的子句和结果对。
注意:Interpolate、Step、For 和 While 最常与其他命令一起使用来生成 JSL 脚本。您可以使用“公式编辑器”在该列中创建和执行脚本,但不推荐这样做,因为这会导致相关性问题并造成混淆。通常将脚本存储为 .jsl 文件,可以作为表属性与数据表一起保存。有关表属性的详细信息,请参见数据表中的表面板。有关脚本命令的文档,请参见《JSL Syntax Reference》。
显示包含缺失表达式和缺失 then 子句的单个 If 条件。突出显示 expr 或 then 子句,然后输入值。例如,要计算合计不为 0 时计数占合计的百分比,请输入图 A.3 中的条件表达式(使用名为计数和合计的列)。
图 A.3 条件表达式
要向 If 条件中添加新条件,请突出显示 then 子句,然后点击“公式编辑器”小键盘上的插入按钮 ()。初始时它将现有 else 条件更改为 expr 子句。再次点击插入按钮可添加 else 子句。突出显示 then 或 else 并重复点击插入按钮可将 else 更改为 expr 或添加新的 expr 子句。
要删除子句,请选择它上面的 then 子句,然后按 Delete 键或点击“公式编辑器”小键盘上的删除按钮 ()。
从定义上来说,求值结果为零的表达式为假。若表达式的求值结果为缺失值,则不会执行任何子句,只会返回缺失值。其他所有数值表达式都为真。
将表达式与子句列表进行比较,并为遇到的第一个匹配子句返回结果表达式的值。匹配表达式只提供一次,然后为每个子句指定匹配值。
在“公式编辑器”中选择 Match 后,将显示一个列表和两个选项:
• 选择根据数据添加匹配参数,将自动添加与您数据中所有水平对应的子句。或者,按 Shift 键,选择条件,然后选择 Match。在图 A.4 中,左边的示例显示自动添加的子句。
• 选择请不要添加,以便您可以单独添加每个子句。在图 A.4 中,右边的示例显示一个空子句,您可以使用缺失表达式填充它。
图 A.4 使用 Match 函数的示例
在自动填充的参数中,您应突出显示 then 子句,然后输入表达式。在空参数中,您突出显示 expr、value 或 then 子句,然后输入表达式。(或者,若您突出显示一个表达式,然后点击 Match,则“公式编辑器”创建新的 Match 条件,其中原始突出显示的表达式作为 expr 且不为 value 和 else 子句赋值。)另外,请记住:
• Match 与等效的 If 相比,求值速度更快,占用的内存更少,因为对于数据表中的每行仅对变量求一次值。而 If 条件遇到每行的每个 If 子句时都必须对变量求值,直到子句求值结果为真。有关 Match 和 If 条件的比较,请参见比较函数。
• 使用 If 和 Match,“公式编辑器”从序列顶部向下搜索第一个真子句,并对相应的结果表达式求值。后续真子句将忽略。
在以下示例中,根据年龄变量的值来赋每个值。
图 A.5 使用 Match 函数的示例
注意:Match 忽略尾部空格而 If 不忽略。
尽管 Match 对于任意缺失值返回“缺失”,您也可以专门匹配缺失值。
Choose 是 Match 的特殊形式,其中条件的参数为从 1 开始的一系列整数。子句的值替换匹配条件。图 A.6 中显示了 Choose 条件的示例。使用 Choose,“公式编辑器”直接转到正确的选择子句并对结果表达式求值。
图 A.6 Choose 条件的示例
突出显示一个表达式并点击 Choose 时,“公式编辑器”创建包含一个子句的新条件表达式。使用小键盘上的插入 () 和删除 () 按钮可添加新子句或删除不想要的子句,如前面 If 条件中所述。
Choose 对 choose 表达式求值并立即转到相应的结果表达式以生成返回值。使用 Choose,您只提供一次生成从 1 开始的一系列整数的选择表达式,然后对序列中的每个整数给出选择。
对每对参数的第一个参数求值并返回与表达式最大值关联的结果表达式(每对参数的第二个参数)的求值结果。若多个表达式都为最大值,则返回第一个最大值。若所有表达式都缺失且未指定最终结果,则返回缺失值。若所有表达式都缺失但指定了最终结果,则返回最终结果。检验表达式的求值结果必须为数值,但结果表达式可以是任何值。
对每对参数的第一个参数求值并返回与表达式最小值关联的结果表达式(每对参数的第二个参数)的求值结果。若多个表达式都为最小值,则返回第一个最小值。若所有表达式都缺失且未指定最终结果,则返回缺失值。若所有表达式都缺失但指定了最终结果,则返回最终结果。检验表达式的求值结果必须为数值,但结果表达式可以是任何值。
两个参数均为真时求值结果为 1。否则,求值结果为 0(图 A.9)。仅当两个比较结果都为真时,图 A.7 中的公式将“组 1”标记为驾驶员。
图 A.7 创建 And 函数
任一参数为真时求值结果为 1。若两个参数均为假,则 Or 表达式的求值结果为 0(图 A.9)。图 A.8 中的公式将所有大于 13 岁的男性参与者分配给“组 1”。
图 A.8 创建 Or 函数
图 A.9 中左边的真值表显示当两个参数具有求值结果为真或假的非缺失值时 And ( & ) 和 Or (| ) 函数的结果。右边的表显示左边或右边的表达式(称它们为 a 和 b)或两者具有缺失值时的结果。
图 A.9 And 和 Or 表达式的求值
参数为假时求值结果为 1。否则,Not 的求值结果为 0。应用 Not 函数时,请根据需要使用括号以避免歧义。例如,!(weight==64) 可以为真或假(1 或 0),但是 (!weight)==64 始终为假 (0),因为 Not 只能返回 0 或 1。诸如 !(weight==64) 的表达式还可以输入为 weight != 64。
在与您指定的参数对应的两个点 (x1, y1) 和 (x2, y2) 之间线性插入 y 值。可以使用插入键插入更多对 x, y 参数。Interpolate 查找与 x 值对应的 x, y 值对(点)并完成插值。
图 A.10 Interpolate 示例
Step 与 Interpolate 类似,不同的是它返回与最大 x 值对应的 y 值,它们分别小于等于 x 和 y 参数。即它从 step 函数而非两个点之间的线性拟合查找对应指定 x 的 y。与 Interpolate 类似,您可以具有所需的任意多对 x 和 y 参数。
图 A.11 Step 示例
若 while 条件为真,则重复 body 参数中的语句。init 和 next 控制迭代。
重复检验 expr 条件并执行 body,直到 expr 不再为真。
Break 完全停止执行循环,而继续执行循环后面的语句。Continue 结束循环的当前迭代并在下一迭代开始循环。
均用于 For、While 和 For Each Row 循环中。
立即停止正在运行的脚本。
从用户定义的函数返回表达式值。