вернуть и присвоить глобальное значение из макрофункции в наборе данных - PullRequest
0 голосов
/ 20 ноября 2018

Не совсем уверен, что лучший способ сделать следующее - я хочу вызвать макрофункцию из шага DATA, передав в качестве аргумента значение из существующего столбца и присвоив значение, сгенерированное макрофункцией, новомуколонка.Я открыт для любого подхода - PROC SQL, CALL EXECUTE и т. Д.

%macro simple(x=);
    %global value;
    %let value = %sysfunc(intnx(month, %sysfunc(today()), &x, same)); 
    %put &value;
%mend simple;
%simple(x=1);

data have;
    do x = 1 to 15;
        output;
    end;
run;

data want;
    data have;
        newdate = %simple(x);
run;

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Если вы хотите использовать макрос в середине оператора, например:

newdate = %simple(x);

, то макрос может выдавать только часть оператора.Это не точка с запятой.

В этом случае, если вы определите макрос для генерации вызова INTNX (), вы можете использовать его таким образом в операторе присваивания.

%macro simple(value);
  intnx('month',%sysfunc(today()),&value,'same')
%mend simple;

Поэтому, если сегодня () - 20NOV2018, то вы эффективно выполняете этот действительный оператор SAS на своем шаге данных.

newdate = intnx('month',21508,x,'same') ;

Обратите внимание, как имя переменной X передается в макроси что используется в сгенерированном фрагменте кода SAS.

Конечно, ваш макрос теперь бесполезен, если вы хотите попробовать использовать его вне оператора SAS.

0 голосов
/ 20 ноября 2018

Обратите внимание на изменения в% SIMPLE и где он вызывается.RESOLVE работает для этого случая, но
% COMPLEX :-) не будет.Также это лучше сделать без вызова макроса, все это можно сделать на шаге данных.Я надеюсь, что вы используете это лучше, чем безопасность работы.

%macro simple(x=);
   %sysfunc(intnx(month, %sysfunc(today()), &x, same))
   %mend simple;

%put NOTE: %simple(x=1);

data have;
    do x = 1 to 15;
        output;
    end;
run;

data want;
   set have;
   newdate = input(resolve(cats('%simple(x=',x,')')),F16.);
   format newdate date9.;
   run;
proc print;
   run;
...