Почему этот код SAS выполняет условия IF THEN DO и ELSE DO? - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть следующий код:

   *---------------------------------------*
   |  CREATING A GLOBAL VARIABLE GLOB      |
   *---------------------------------------*;
%GLOBAL GLOB;
   *---------------------------------------*
   |  CREATING A DATASET DST               |
   *---------------------------------------*;
DATA DST;
%LET GLOB = 1;

IF GLOB = 1 THEN DO
%LET GLOB =2;
%PUT GLOB = &GLOB;
END;

ELSE DO;
%LET GLOB =3;
%PUT GLOB = &GLOB;
END;

RUN;

%PUT GLOB = &GLOB;

Я создаю глобальную переменную GLOB и в DST набора данных я переназначаю значение GLOB на 1. Так что, согласно моему пониманию, оно должно тольковыполнить условие «ЕСЛИ». Но в моем случае выполняются оба условия: «IF» и «else». И если я перезаписываю значение GLOB как 2 в условии IF, то почему я не получаю значение 2 для последнего оператора, который является

% PUT GLOB = & GLOB;

1 Ответ

2 голосов
/ 03 ноября 2019

Это не так. Препроцессор макроса оценивает статистику макроса (% let и т. Д.) До того, как шаг данных будет скомпилирован и запущен. Поэтому, когда на шаге данных выполняются только фактические операторы SAS (включая любые условно сгенерированные кодом макроса), выполняется следующее.

Вы в основном выполняете этот код:

%LET GLOB = 1;
%LET GLOB =2;
%PUT GLOB = &GLOB;
%LET GLOB =3;
%PUT GLOB = &GLOB;

DATA DST;
  IF GLOB = 1 THEN DO;
  END;
  ELSE DO;
  END;
RUN;

%PUT GLOB = &GLOB;

Обратите внимание, что вашПредложение THEN никогда не будет выполнено, так как ваш оператор IF проверяет переменную GLOB, которая никогда не может быть 1, поскольку ей никогда не назначалось какое-либо значение. Любые значения были назначены только макропеременной с именем GLOB.

Возможно, вы хотели вместо этого запустить нечто подобное?

%LET GLOB = 1;

DATA DST;
  IF &GLOB = 1 THEN DO;
    call symputx('glob','2');
  END;
  ELSE DO;
    call symputx('glob','3');
  END;
RUN;

%PUT GLOB = &GLOB;

Или что-то, использующее только код макроса? Как это:

%LET GLOB = 1;

%IF &GLOB = 1 %THEN %DO;
  %LET GLOB = 2;
%END;
%ELSE %DO;
  %LET GLOB = 3;
%END;

%PUT GLOB = &GLOB;
...