SAS Macro, если то иначе

Я новичок в SAS и хочу создать макропроцедуру, которая создает значения оси Y для более поздней версии PROC GPLOT.

Говоря простым языком, на этом графике есть два возможных минимальных значения (и максимума). Диапазон оси зависит от того, какое минимальное значение является наименьшим. В противном случае SAS не будет отображать данные за пределами диапазона оси. Я НЕ хочу, чтобы SAS автоматически создавал диапазон для меня. Я хочу сам определить диапазон.

Итак, это моя попытка создать процедуру, которая а) вычисляет два минимальных значения, б) сравнивает два и в) сохраняет меньшее из двух в новой макропеременной. Если я смогу заставить этот работать, процедура max будет легко проделана.

%MACRO min;
%LET ymin1 = %SYSEVALF(&minresult - (((&minresult + &maxresult)/2) * .05);
%PUT ymin1 = &ymin1;
%LET ymin2 = %SYSEVALF(&min - (&min * .05));
%PUT ymin2 = &ymin2;
%IF &ymin1 > &ymin2
%THEN %LET ymin = ymin2;
%ELSE %LET ymin = ymin1;
%PUT ymin = &ymin;
%MEND min;

У меня такое чувство, что я делаю что-то синтаксически не так. Любая помощь приветствуется.


person Wendell Shirley    schedule 06.06.2013    source источник
comment
Несколько замечаний - макросов не существует; macro - это сам термин. PROC FCMP позволяет создавать функции и процедуры, но они не на макроязыке, а на чем-то близком к языку шагов данных. Кроме того, вы должны определить & min / & minresult / & max / & maxresult как параметры макроса; даже если они существуют как глобальные макропеременные, лучше определить их снова с точки зрения стиля. Вы все еще можете вызвать% min (& min, & max, & minresult, & maxresult), и он будет работать нормально.   -  person Joe    schedule 06.06.2013


Ответы (1)


Простое решение - пропустить% if stuff и просто определить ymin из ymin1 / 2:

%let ymin = %sysfunc(min(&ymin1,&ymin2));

Конкретная синтаксическая ошибка, которая у вас есть, кроме пропущенной) в первом объявлении ymin, заключается в том, что %let ymin = ymin2; должно быть %let ymin=&ymin2;. В противном случае он просто содержит текст «ymin2», а не содержимое макропеременной.

Весь макрос:

%MACRO min(minresult,maxresult,min,max);
%LET ymin1 = %SYSEVALF(&minresult - (((&minresult + &maxresult)/2) * .05));
%PUT ymin1 = &ymin1;
%LET ymin2 = %SYSEVALF(&min - (&min * .05));
%PUT ymin2 = &ymin2;
%let ymin = %sysfunc(min(&ymin1,&ymin2));
%PUT ymin = &ymin;
%MEND min;

%min (5,6,3,4);
person Joe    schedule 06.06.2013
comment
В этом случае min (), вызываемая% sysfunc, является функцией SAS min, не связанной с вашим макросом каким-либо образом, кроме имени и назначения. Вы также можете выполнить это в открытом коде, если вы определили ymin1 / ymin2 и / или сконструировали их в вызове sysfunc. Вам не пришлось бы использовать SYSEVALF, если бы вы сделали это там. - person Joe; 06.06.2013
comment
Вы правы,% sysfunc делает это намного проще. Однако теперь я получаю сообщение ОШИБКА: обнаружена рекурсия оператора открытого кода. - person Wendell Shirley; 07.06.2013
comment
Можете переписать процедуру? - person Wendell Shirley; 07.06.2013
comment
Чаще всего рекурсия открытого кода означает, что вы где-то пропустили точку с запятой. - person Joe; 07.06.2013