САС макропеременная изменить

В общем, как мы справляемся с ситуацией, когда макро-переменные должны быть изменены внутри макроса; например, предположим, что у меня есть этот макрос:

%macro test (arg=); 
array arrayone [&arg];   /* This is ok */
array arraytwo [&arg+1] /* This is not ok. How to make it work? */ 
... 

Как мы управляем этой ситуацией, когда я хочу %test(3) , а затем arraytwo должен принять измерение 4... ?

2 ответов


изменить на

array arraytwo[%EVAL(&ARG + 1)] ;


использование %eval достаточно, если требуется только целочисленная арифметика. Если вам нужно выполнить арифметику с плавающей запятой с переменными макроса, вы должны использовать %sysevalf вместо этого.

большинство функций шага данных могут быть применены непосредственно к макро-переменным с помощью одного из двух методов:

 1. %function()
 2. %sysfunc(function())

для многих из наиболее часто используемых функций, существуют точные эквиваленты макро, и все, что вам нужно сделать, это добавить % перед именем функции. Функции, которые не имеют точные эквиваленты макроса обычно можно заставить принять переменную макроса, вызвав их внутри %sysfunc (). Б. Н. функции шага данных, которые обычно ожидают, что строка, завернутая в одинарные кавычки, завершится ошибкой при вызове фрагмента кода макроса через %sysfunc (), если вы не удалите кавычки. Е. Г.

data _null_;
  x = rand('uniform');
run;

отлично работает на шаге данных, но чтобы дать переменной макроса то же значение в куске макроса, вам нужно будет использовать

%let x = %sysfunc(rand(uniform));

Это потому, что в макросреда, SAS интерпретирует текст униформа как строка, в то время как на шаге данных SAS интерпретирует некотируемый текст как имя переменной.