2013-06-06 3 views
0

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

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

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

%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; 

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

+0

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

ответ

2

Самое простое решение пропустить%, если материал и просто определить 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); 
+0

В этом случае min(), вызываемый% sysfunc, является функцией минимума SAS, не связанной с вашим макросом каким-либо образом, кроме имени и цели. Вы также можете выполнить это в открытом коде, если у вас есть ymin1/ymin2, определенный и/или сконструированный в вызове sysfunc. Вам не нужно было бы использовать SYSEVALF, если бы вы это сделали. – Joe

+0

Вы правы,% sysfunc делает это намного проще. Тем не менее, теперь я получаю сообщение об ошибке «ERROR: Open code statement recursion». –

+0

Можете ли вы переписать процедуру? –