為什麼總是使用 else 語句以及空值和缺失值之間的根本區別大家好,
這裡有一個理論問題。 我目前正在為我的同事編寫 JSL 腳本教程,因此我試圖確保我對 JSL 的工作方式有很好的理解。
我曾經在論壇上讀到,您應該始終在“If”循環內使用“Else”語句,即使這意味著添加 Empty() 作為“Else”語句。
為了看到差異,我嘗試使用腳本編輯器:
y=if(1>2, 1);
z= if (1>2, 1 , Empty());
Show (y);
Show (z);
Show (Is Missing (y) );
Show (Is Missing (z) );
Show (Is Empty (y) );
Show (Is Empty (z) );
x= If (y==z, "true", "false");
Show (x); <BR /><BR />// results :<BR />y = .;<BR />z = Empty();<BR />Is Missing(y) = 1;<BR />Is Missing(z) = 1;<BR />Is Empty(y) = 0;<BR />Is Empty(z) = 1;<BR />x = .;
因此,值 Empty() 既是缺失值又是空值,但是“.”缺失但不為空。 這有什麼區別呢? 考慮到它們在比較運算符中使用時都會返回缺失值,為什麼我要費心使用 Empty() 作為“Else”語句呢?
這也說明了這樣一個事實:當 if 語句中測試的條件返回缺失時,它既不是 true 也不是 false,因此循環既不返回這兩個語句,這一點始終要記住!
回复:為什麼總是使用 else 語句以及空值和缺失值之間的根本區別FWIW 如果沒有 ELSE 條件,我從不使用 ELSE 語句。使我的代碼保持簡單和緊湊。我知道 if() 是一個函數,並且我知道如何使用它。也許這是我使用過的其他語言的遺留問題。
回复:為什麼總是使用 else 語句以及空值和缺失值之間的根本區別我同意一般的計算機編程,特別是 JMP 腳本編寫是嚴肅的話題。 保存腳本和將其他人編寫的腳本拼湊在一起只能讓您到目前為止。 通常會導致混亂和沮喪。
很抱歉,我們的培訓不是一個選擇。 我們的入門課程已經成熟(大約二十年)並且很受歡迎。 我不知道 JSL 是否有任何其他免費或收費的培訓。 可能有一些涵蓋特定主題的免費視頻,但我懷疑它們是否傳達了這種心態。 它們通常是“如何做”或“食譜”風格。
也許另一位社區成員知道適合您的培訓。
回复:為什麼總是使用 else 語句以及空值和缺失值之間的根本區別嗯,我當然不想因為限制性思維而限制我的創造力。 我想我可能缺乏這方面的培訓。 幾個月前,我對 JSL 中的腳本進行了評估,主要是迭代現有腳本並查看腳本索引和腳本指南 pdf。 現在我想如果我想釋放 JSL 的潛力,我需要做一些更嚴肅的事情。
您知道用於學習 JSL 的(免費)在線資源嗎? 我知道這可能是一個棘手的問題,因為您是一名員工,並且您的公司提供付費課程,但目前這對我來說不是一個選擇。
回复:為什麼總是使用 else 語句以及空值和缺失值之間的根本區別你問了一些大問題。
我的基本觀點是,與任何計算機編程語言一樣,JSL 語法和習慣用法是我們的朋友,但我們不是它們的奴隸。 我的問題是:“你期望什麼?”只是想指出,每次編寫或修改代碼時,我們都需要這個問題的答案。 明確的答案對我們的代碼來說至關重要。
是的,函數是編寫腳本的關鍵元素。 根據定義,每個函數都會返回一個結果。 但有時我們對函數的副作用比返回的結果更感興趣。 例如,V List Box() 函數返回對其創建的顯示框對象的引用。 我可能對盒子本身(副作用)比對參考文獻更感興趣。
許多新手腳本編寫者認為 If() 和 For() 是語句或命令。 它們是函數。 陳述心態會限制你的創造力。 心態很重要。 以下腳本顯示了完成同一件事的兩種方法,但具有聲明心態的人永遠不會想到第二種方法。
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
mean weight = Col Mean( dt:weight );
// assign within the If() function call
dt << New Column( "Condition 1", Numeric, Continuous );
For Each Row(
If( :weight < mean weight, dt:Condition 1 = -1, dt:Condition 1 = 1 );
);
// assign with the returned result from the If() function call
dt << New Column( "Condition 2", Numeric, Continuous );
For Each Row(
dt:Condition 2 = If( :weight < mean weight, -1, 1 );
);
回复:為什麼總是使用 else 語句以及空值和缺失值之間的根本區別嗨馬克貝利,
感謝您的這些見解:)事實上,我認為必須使用 Empty() 作為 else 語句很奇怪。 我試圖尋找提到這種做法的帖子,但再也找不到了,所以我無法詢問用戶為什麼他認為這很有用。
回答你的問題:你想用條件 If() 函數做什麼? 你期望它返回什麼?
人們很容易忘記 JSL 是一種基於函數的語言並且函數有返回值。 所以通常情況下,我並不真正使用 If 語句返回的內容。 我只是將其作為理解 JSL 基礎知識的一種方式進行探索。 在實踐中,我想知道使用 If 語句的返回值有什麼用?
我能想到的就是在腳本中獲得空間或使其更快一點。 但感覺如果我嘗試以這種方式變得聰明,它會在以後困擾我並產生錯誤/錯誤。
您對此有何看法?
回复:為什麼總是使用 else 語句以及空值和缺失值之間的根本區別我使用 Is Empty() 的方法是查看變量是否已被分配。從而避免語法錯誤:
names default to here(1);
show(z);
我們可以檢查變量“z”是否被引用過:
Names Default To Here( 1 );
If( Is Empty( z ) == 0,
Show( z )
);
一個更好的例子是下面的例子。
Names Default To Here( 1 );
x=1;
If( x > 2, z = 7 );
If( Is Empty( z ) == 0,
Show( z )
);
由於 JSL 是一種解釋性語言,因此它遵循 JSL 的邏輯流程,因此,如果 x <= 2,JSL 將不會執行(甚至不看)z = 7,因此無需檢查 z 是否為 Empty()是必需的,因為 JSL 會給出語法錯誤。
在您的示例中,您使用不同的形式將值分配給 z
names default to here(1);
z=(if(1>2, 7));
show(z);
如果 1>2,則變量 z 的值為 7,但如果不為 true,則 z 不再未分配,因此它將呈現缺失值“.”。這裡的優點是,一旦進行賦值,JSL 就已經處理了變量 z,並且如果稍後在程序流程中引用 z,則不會出現語法錯誤。
這給我們帶來了一個問題:如果 If() 函數返回 false,我們是否應該分配 Empty() 。
names default to here(1);
z=(if(1>2, 7, Empty()));
show(z);
然後簡單地歸結為,您是否不想讓 z 作為缺失值,而寧願檢查 Is Empty() 與 Is Missing()。我個人更喜歡缺失值路線,因為它留下 Empty() 作為 z 從未被分配的驗證。 。
回复:為什麼總是使用 else 語句以及空值和缺失值之間的根本區別我編寫腳本的時間比大多數人都長(1998 年)。 我是我們所有腳本課程的作者並教授這些課程。 我不知道“最佳實踐”建議始終包含“else”條件的參數或使用空的在沒有特定返回值的情況下。 我當然從未錯過過它,也從未因不使用它而付費。 我認為這個問題是“視情況而定”的另一種情況。 你想用條件做什麼如果()功能? 你期望它返回什麼?
默認返回值如果()函數是丟失的當第一個參數的計算結果為 false 並且只有兩個參數時。 您使用存儲在中的值演示了此行為y 。 這如果()自 2000 年 JSL 首次在 JMP 4 中引入以來,該函數就一直如此。
您可以提供第三個參數如果()當第一個參數計算結果為 false 時計算並返回的函數。 您使用存儲在中的值演示了此行為z你提供的地方空的()函數作為第三個參數。
丟失的代表一個未知值。 它通常表示未知的數據值或評估不可能的數值表達式(例如 Log( -1 ))的結果。 我覺得丟失的作為未由參數表示的條件的默認返回值很有意義。
空的就是這樣。 它代表著什麼都沒有的狀態。 例如,如果您致電當前數據表()當沒有打開數據表時不帶參數,它返回空的。