САС макропеременная изменить
В общем, как мы справляемся с ситуацией, когда макро-переменные должны быть изменены внутри макроса; например, предположим, что у меня есть этот макрос:
%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 ответов
использование %eval достаточно, если требуется только целочисленная арифметика. Если вам нужно выполнить арифметику с плавающей запятой с переменными макроса, вы должны использовать %sysevalf вместо этого.
большинство функций шага данных могут быть применены непосредственно к макро-переменным с помощью одного из двух методов:
1. %function()
2. %sysfunc(function())
для многих из наиболее часто используемых функций, существуют точные эквиваленты макро, и все, что вам нужно сделать, это добавить % перед именем функции. Функции, которые не имеют точные эквиваленты макроса обычно можно заставить принять переменную макроса, вызвав их внутри %sysfunc (). Б. Н. функции шага данных, которые обычно ожидают, что строка, завернутая в одинарные кавычки, завершится ошибкой при вызове фрагмента кода макроса через %sysfunc (), если вы не удалите кавычки. Е. Г.
data _null_;
x = rand('uniform');
run;
отлично работает на шаге данных, но чтобы дать переменной макроса то же значение в куске макроса, вам нужно будет использовать
%let x = %sysfunc(rand(uniform));
Это потому, что в макросреда, SAS интерпретирует текст униформа как строка, в то время как на шаге данных SAS интерпретирует некотируемый текст как имя переменной.