Переменные инициализируются и отображаются в ODS, хотя оператор if равен FALSE - PullRequest
0 голосов
/ 25 апреля 2019

Я реализовал IF-statement в программе SAS, которая в основном проверяет достоверность сравнения по годам.Если IF-statement равно TRUE, то некоторые другие переменные инициализируются и вычисляются, если IF-statement равно FALSE, то ничего не происходит.

Однако я только что понял, что независимо от того, является ли IF-statement TRUE или FALSE, дополнительные переменные будут инициализированы (хотя MISSING в случае FALSE) и отображены вODS.Это почему?Есть ли прямой способ решить это?Я, конечно, мог бы использовать условное drop-statement, но это всегда утомительно, чтобы добавить это.

data test; 

value = 1;
if value > 2019 then a = 1;

/*
if value < 2019 then 
    do; 
        drop a;
    end;
*/

run;

РЕДАКТИРОВАТЬ: Опять же, я только что понял, что drop-statement также всегда будет падать безимеет значение, если TRUE/FALSE.

Решение но не знаю, почему оно работает :

data test; 

%let value = 1;
%if &value. > 2019 %then %do; a = 1; %end;

run;

Пока копаясь, я нашел этот пост sas-сообщества .Кажется, моя проблема в основном связана с разницей %IF vs IF.Применяя MACRO %IF, это работает.Пост кажется немного устаревшим, в отличие от поста, который можно сейчас использовать MACRO %IF вне MACRO.

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

В этом разница между компиляцией и запуском шага данных.Когда шаг данных компилируется (до того, как он действительно запустится), SAS выясняет, какие переменные ему понадобятся.Поскольку столбец a находится в левой части уравнения, он добавляется в набор данных.Помните, что на данный момент SAS понятия не имеет, какие данные вы собираетесь в нее помещать;вам может понадобиться этот столбец a, а может и нет.Вот почему вы не можете условно добавлять / удалять столбцы во время выполнения;столбцы должны быть известны при компиляции.

Во втором случае, как указал Том, выражения макросов оцениваются до шага данных, который компилируется.С точки зрения SAS, ваш код:

data test; 

%let value = 1;
%if &value. > 2019 %then %do; a = 1; %end;

run;

Просто оценивает это:

data test; 

run;

С другой стороны, этот код:

data test; 

%let value = 2020;
%if &value. > 2019 %then %do; a = 1; %end;

run;

Оценил бы это:

data test; 

a = 1;

run;
1 голос
/ 25 апреля 2019

MACRO-код и SAS-код - две разные системы.Макропроцессор сначала проверяет код и интерпретирует любой код макроса (ищет% и & триггеры).Затем полученный текст продолжается и оценивается как код SAS.

Итак, во втором случае макропроцессор генерирует другой код SAS на основе значения макропеременной.

Также обратите внимание, что вашдела проверяют разные вещи.В коде макроса вы проверяете значение макропеременной.В коде шага данных вы проверяете значение переменной набора данных (для конкретного наблюдения).

...