指令順序
指令順序通常不是常識問題,而是遵循下列邏輯順序: 變數定義、資料轉換及統計分析。 例如,您無法在變數存在之前以任何方式標示、轉換、分析或使用變數。 適用下列一般規則:
- 定義階段作業變數 (
DATA LIST、GET、GET DATA、MATRIX DATA等) 的指令。 必須在將標籤或遺漏值指派給那些變數的指令之前; 它們也必須在使用那些變數的轉換和程序指令之前。 - 轉換指令 (
IF、COUNT、COMPUTE等) 用來建立及修改變數的指令必須在將標籤或遺漏值指派給那些變數的指令之前,而且也必須在使用那些變數的程序之前。 - 通常,指令處理的邏輯結果會決定指令順序。 例如,在作用中資料集中建立新變數的程序必須在使用那些新變數的程序之前。
除了觀察上述規則之外,通常還必須區分導致讀取資料的指令和不讀取資料的指令,以及使用下一個讀取資料的指令儲存擱置執行的指令和立即生效而不需要讀取資料的指令。
- 導致讀取資料以及執行擱置轉換的指令包括所有統計程序 (例如
CROSSTABS、FREQUENCIES、REGRESSION); 儲存/寫入作用中資料集內容的部分指令 (例如DATASET COPY、SAVE TRANSLATE、SAVE);AGGREGATE;AUTORECODE;EXECUTE;RANK; 以及SORT CASES。 - 儲存的指令、擱置執行的下一個讀取資料指令,包括修改或建立新資料值的轉換指令 (例如
COMPUTE、RECODE)、定義條件式動作的指令 (例如DO IF、IF、SELECT IF)、PRINT、WRITE及XSAVE。 如需這些指令的綜合性清單,請參閱 儲存的指令,擱置執行 。 - 在不讀取資料或執行擱置指令的情況下立即生效的指令包括在不影響資料值 (例如
MISSING VALUES、VALUE LABELS) 的情況下變更字典資訊的轉換,以及不需要作用中資料集的指令 (例如DISPLAY、HOST、INSERT、OMS、SET)。 除了立即生效之外,也會無條件地處理這些指令。 例如,當併入DO IF結構時,不論是否符合條件,都會執行這些指令。 如需這些指令的綜合性清單,請參閱 立即生效的指令 。
範例
DO IF expense = 0.
- COMPUTE profit=-99.
- MISSING VALUES expense (0).
ELSE.
- COMPUTE profit=income-expense.
END IF.
LIST VARIABLES=expense profit.
COMPUTE在MISSING VALUES之前,會先處理; 不過,會延遲執行,直到讀取資料為止。MISSING VALUES會在發現時立即生效, 即使永遠不符合條件 (亦即,即使沒有 expense=0的觀察值)。LIST會導致讀取資料; 因此,在相同的資料傳遞期間會同時執行COMPUTE和LIST。- 因為此時
MISSING VALUES已生效,所以永遠不會符合DO IF結構中的第一個條件,因為 expense 值為 0 會被視為遺漏,因此當 expense 為 0 時,該條件會評估為遺漏。