Изменение макропеременной SAS - PullRequest
6 голосов
/ 25 марта 2011

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

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

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

Ответы [ 2 ]

5 голосов
/ 25 марта 2011

Измените его на

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

3 голосов
/ 27 февраля 2012

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

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

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

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

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

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

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

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

...