Ссылка на макрос SAS не разрешена - PullRequest
0 голосов
/ 27 мая 2020

В моем коде есть макросы, которые создаются и используются в случайном порядке.

Отображается «ссылка не разрешена» для «% put & pincuk» и синтаксическая ошибка для «& pincuk». Он отлично работает, когда я запускаю код дважды. Я предполагаю, что это происходит, когда SAS достигает & pincuk до создания макроса. Например,


data x.fcastukcalc;
do day=&daycountuk + 1 to &daycountkorea
retain fcast &ukdmax;
fcast=(fcast * &pincuk) + fcast;
output;
end;
run;



/* then this, later on */

data _null_;
keep deathsuk inc1 inc2 pinc1 pinc2 pinc;
set x.uk;
inc1=deathsuk - lag1(deathsuk);
pinc1=(inc1 / lag1(deathsuk));
inc2=lag1 (deathsuk) - lag2(deathsuk);
pinc2=(inc2 / lag2(deathsuk));
pinc=(pinc1 + pinc2) / 2;
call symputx('pincuk', pinc);
run;

%put &pincUK;



1 Ответ

1 голос
/ 27 мая 2020

Если при первом прохождении x.uk не существует или имеет нулевые строки, call symputx('pincUK',pinc); никогда не будет достигнуто. Итак, в «случайной» ситуации запуска кода, давайте проявим большую щедрость и скажем, в ситуации развития , ваши ожидания могли быть опровергнуты неверно запомненной операцией или тонким изменением состояния. Проверьте свой код на наличие операторов %SYMDEL. Во время разработки большого макроса вы можете отправлять части внутренней части макроса и не иметь полной «симуляции» состояния, которое, как ожидается, будет существовать во время фактического вызова макроса.

Запустить fre sh Сеанс SAS и посмотрите, сохраняется ли проблема с кодом и может ли быть воспроизведена более прямым образом.

Чтобы указать c, ваш вопрос касается макроса символов , часто называемого макросом переменные. Макросы сами по себе являются именами групп операторов программирования SAS.

From help (хорошее чтение)

Когда SAS компилирует текст программы, два разделителя запускают активность макропроцессора:

& name

% name

Подстановка текста, производимая макропроцессором, завершается до компиляции и выполнения текста программы. Средство макросов использует операторы и функции, похожие на операторы и функции, которые вы используете на шаге ДАННЫЕ. Однако важным отличием является то, что элементы макроязыка могут разрешать только замену текста и не присутствуют во время выполнения программы или команды.

------ Редактировать (добавлено) ----- -

Написание кода с большим количеством абстракций (например, макропеременных) требует определенного уровня дисциплины и проектирования системы. Макрос макрос должен быть скомпилирован перед его вызовом, однако макропеременные (т.е. символы), в которых он разрешается, НЕ должны существовать во время компиляции, только во время вызова (вызова) макроса. Для старых выдумок эта концепция похожа на шаблон слияния писем со слишком большим количеством полей.

Макропеременные могут быть локальными (как параметр в определении макроса, или явно указанные в %LOCAL, или как присвоение ранее неопределенный символ. Использование макропеременных GLOBAL должно быть сведено к минимуму или не должно быть нулевым, также как и чрезмерная зависимость от переменных, которые, как ожидается, будут существовать в области вызывающего объекта. Зависимость от глобальной переменной должна быть явно указано с %GLOBAL в источнике макроса.

Присвоение необъявленному %LOCAL может быть проблемой, потому что присваивание могло случайно (неожиданно) заменить значение объявленной или существующей переменной во внешней (или вызывающей) области видимости, и быть причиной , это не работает правильно проблем. Хорошей дисциплиной является явное %LOCAL всех переменных в определении макроса - макросистема не имеет строгий режим (как в других языках), который воспроизводит orts problemati c макропеременные.

...