SAS CALL SYMPUT не работает внутри макроса (и до этого) - PullRequest
1 голос
/ 14 апреля 2020

Мне нужно хранить в макропеременной количество строк в наборе данных. Поэтому я использовал это:

%macro get_table_size(inset,macvar);
 data _null_;
  set &inset NOBS=size;
  call symput("&macvar",size);
 stop;
 run;
%mend;
%get_table_size(LOANTAPE.INSTRUMENT_VU21,NUM_REG_INS);
%put &NUM_REG_INS;

До того, как мой компьютер вышел из строя (вынужден перезагрузить его с открытым SAS), это работало (клянусь, xd). Но теперь макрос NUM_REG_INS не создан. В журнале написано: Кажущаяся символика c ссылка на MACVAR не разрешена .

Итак, я проверил код как шаг данных, а не как макрос, например:

data _null_;
  set LOANTAPE.INSTRUMENT_VU21 NOBS=size;
  call symput("macvar",size);
 stop;
run;
 %put &macvar

И это работает. Таким образом, проблема заключается в использовании этого кода внутри макроса. Кто-нибудь знает, что здесь может происходить и как это исправить? И, ради любопытства, почему это работало раньше?

Спасибо, правда !!

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Если вы хотите получить доступ к макропеременной вне макроса, убедитесь, что она не определена как локальная для макроса. Вы можете использовать третий параметр вызова symputX для принудительного обновления глобальной макропеременной. Но тогда у вас могут возникнуть проблемы при попытке вызвать этот макрос для обновления макропеременной, которая является локальной для вызывающего макроса.

Просто добавьте строку в макрос, чтобы сделать макропеременную глобальной, если она не существует. , Вам также следует использовать более новую функцию CALL SYMPUTX (), если только вам не нужны те пробелы в значении макропеременной, которые автоматическое c преобразование SIZE в символьную строку генерировало бы с использованием более старой функции CALL SYMPUT (). .

Также переместите CALL SYMPUTX () до оператора SET, чтобы он выполнялся, даже если набор данных имеет нулевые наблюдения .

%macro get_table_size(inset,macvar);
%if not %symexist(&macvar) %then %global &macvar;
data _null_;
  call symputx("&macvar",size);
  set &inset NOBS=size;
  stop;
run;
%mend;
1 голос
/ 14 апреля 2020

Переменная область. Попробуйте использовать CALL SYMPUTX() вместо CALL SYMPUT(). Вероятно, это сработало и раньше, потому что вы создали глобальную переменную во время тестирования, а в этом случае у вас нет. Макропеременные не существуют вне макроса, если вы не создадите их как глобальную макропеременную.

call symputx("&macvar", size, 'g');

См. Документацию здесь

...