Разрешение макропеременных в шаге данных - PullRequest
0 голосов
/ 02 октября 2018

У меня проблемы с получением операторов If / Then для корректной работы с моими макро-переменными внутри шага данных.Я пишу макрос для обработки двух разных случаев: вычисление статистических тестов без преобразования, а затем вычисление статистических тестов после естественного преобразования журнала.Если мои данные не проходят проверку на нормальность, я регистрирую преобразование и проверяю снова.Если он проходит, я устанавливаю свой глобальный флаг log_flag на 1. Затем я хочу проверить состояние этого флага на шагах данных, чтобы правильно обрабатывать преобразованные (или нет) переменные.Я пробовал варианты следующего:

Data want;
set have;
if symget("log_flag")=1 then do;
if &log_flag. = 1 then do;
if resolve("log_flag")=1 then do;
test=symget("log_flag");
  if test=1 then do;
end

Независимо от того, что я пытаюсь, оператор if / then по существу игнорируется, и весь следующий за ним код обрабатывается так, как если бы if / then было истинным, даже когдаэто ложьЯ знаю, что log_flag правильно присваивается нулевое значение, потому что операторы %if %then работают и правильно выполняются в открытом коде.У меня просто проблемы с получением правильного разрешения внутри шага данных.

Пожалуйста, дайте мне знать, если вам нужна какая-то другая информация, которая поможет мне разобраться в этом.Спасибо, ребята!

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Проблема, которую вы указали в комментариях, заключается в том, что вы вообще не хотите генерировать код SAS.Вот для чего предназначен макроязыковой процессор.Поэтому используйте %IF для условного генерирования кода.

Итак, если вы хотите создать переменную newvar только тогда, когда макропеременная log_flag равна единице, вы можете кодировать ее следующим образом.

data want ;
  set have ;
%if &log_flag. = 1 %then %do;
  newvar= x*y ;
%end;
run;

Так что, когда &log_flag. = 1 вызапустите этот код:

data want ;
  set have ;
  newvar= x*y ;
run;

И если это не так, вы запустите этот код:

data want ;
  set have ;
run;

Начиная с выпуска SAS 9.4 M5, вы можете использовать его в открытом коде, в противном случае поместите еговнутри определения макроса и выполните макрос.

0 голосов
/ 02 октября 2018
  • SYMGET () вернет символьную переменную.
  • RESOLVE () вернет символьную переменную, но для этого требуется параметр &.
  • & log_flag преобразуется в числовое значение

Вам необходимо правильно обрабатывать их в зависимости от используемого вами справочного метода.

Вот пример тестирования каждого из них независимо, а затем вы можетепроверьте их вместе, если хотите, вложив их.

%let log_flag=1;
Data want;
set sashelp.class;
if symget("log_flag")='1' then do;
  put "Test #1 is True";
end;

if &log_flag. = 1 then do;
  put "Test #2 is True";
end;


if resolve("&log_flag")="1" then do;
  put "Test #3 is True";
end;

test=symget("log_flag");
if test='1' then do;
  put "Test #4 is True";
end;

run;
...