我知道(現在..)如果您可能存在缺失值並且希望將其計算為 0,則應該在 JMP 中使用 IfMZ。 我想知道下面的範例中發生了什麼,如果您有帶有“兩個 else”的 if 語句(不會返回語法錯誤)。 在下面的例子中它是表達式if_expr_三(同樣對於ifmz_expr_三
Names Default To Here(1);
if_expr_two = Expr(
res = If(val,
Print(Eval Insert("if_expr_two\!t^val^\!ttrue"));
1;
,
Print(Eval Insert("if_expr_two\!t^val^\!tfalse"));
0
);
show(res);
);
// what does this evaluate to and why does val = . return second statement
if_expr_three = Expr(
res = If(val,
Print(Eval Insert("if_expr_three\!t^val^\!ttrue"));
1;
,
Print(Eval Insert("if_expr_three\!t^val^\!tfalse?"));
0;
,
Print(Eval Insert("if_expr_three\!t^val^\!tsomething?"));
-1;
);
show(res);
);
ifmz_expr_two = Expr(
res = IfMZ(val,
Print(Eval Insert("ifmz_expr_two\!t^val^\!ttrue"));
1;
,
Print(Eval Insert("ifmz_expr_two\!t^val^\!tfalse"));
0;
);
show(res);
);
ifmz_expr_three = Expr(
res = IfMZ(val,
Print(Eval Insert("ifmz_expr_three\!t^val^\!ttrue"));
1;
,
Print(Eval Insert("ifmz_expr_three\!t^val^\!tfalse?"));
0;
,
Print(Eval Insert("ifmz_expr_three\!t^val^\!tsomething?"));
-1;
);
show(res);
);
val = 1;
if_expr_two; // OK, prints true and returns 1
if_expr_three; // OK?, prints true and returns 1
ifmz_expr_two; // OK, prints true and returns 1
ifmz_expr_three; // OK?, prints true and returns 1
Write("\!N");
val = 0;
if_expr_two; // OK, prints false and returns 0
if_expr_three; // ? prints false?, but returns missing
ifmz_expr_two; // OK, prints false and returns 0
ifmz_expr_three; // ? prints false?, but returns missing
Write("\!N");
val = .;
if_expr_two; // OK, no print but returns missing value
if_expr_three; // ? prints false? and returns missing
ifmz_expr_two; // OK, prints false and returns 0
ifmz_expr_three; // ? prints false? and returns missing
Write();
我很可能會將此問題的問題發送給 JMP 支援人員,但我也想在 JMP 社群中徵求意見。
這與以下情況有點相似關聯數組和刪除與預設值相同的鍵從這個意義上說,我不確定為什麼會發生這種情況(我確實向 jmp 支援發送了有關此問題的訊息,仍在等待最終答案)。
來自 If() 函數的腳本索引 (強調我的):
評估每對中的第一個參數並傳回與第一個條件參數相關的結果表達式的計算結果,該條件參數的計算結果為非零。 條件參數依序求值。 如果所有條件參數的計算結果為零,計算可選的 elseResult 並傳回結果。 如果沒有其他結果是規範如果ied,且沒有一個條件為真,則傳回缺失值。 如果所有條件參數的計算結果均為缺失,則傳回缺失值。
我將重要部分加粗,“評估每對中的第一個......”
因此,帶有三個逗號的 If() 有兩對。 考慮一下:
a=3;
If(
a==1, show("a==1"), //first pair - evaluate whether a==1
a==2, show("a==3") //second pair - evaluate whether a==2
);
If() 將傳回缺失值,因為不存在傳回非零值的「每對中的第一個」表達式。
在您的 If() 函數中:
If(
val,Print(Eval Insert("if_expr_three\!t^val^\!ttrue")); 1;, // first pair - evaluate whether val is nonZero
//begin second pair
Print(Eval Insert("if_expr_three\!t^val^\!tfalse?"));0; ,
Print(Eval Insert("if_expr_three\!t^val^\!tsomething?"));-1;
// second pair -- evaluate Print(); 0; - that returns 0 (since that was the last value in the expression) - so the second condition isn't nozero
);
請記住,JSL 是一種純函數式語言,帶有運算符以使其更易於閱讀,但是 ;是運算符膠水()函數。 Glue() 函數傳回它計算的最後一個表達式。
看:膠水和if的差別