2016-09-07 4 views
1

Я создал макрос SAS, макрос A, который принимает имя переменной и возвращает преобразованные версии этого имени, то есть если вы запустите %A(asdf), вы выйдете asdf_log asdf_exp asdf_10. Я хочу написать еще один макрос, макрос B, который выводит результат из первого макроса и присоединяет его вместе к новой макропеременной.Создайте макрос SAS для создания макрокоманды

%macro B(varList, outputName); 
    %let &outputName = 
     %A(var1); 
     %A(var2); 
     ; 
%mend 

Это почти то, что я хочу сделать, за исключением того, что он явно не компилируется. Я также не уверен, что это возможно в SAS. В качестве дополнительного осложнения вход макроса B представляет собой список переменных, которые я хочу запустить для макроса A и добавить в один длинный список имен переменных.

Почему? Потому что у меня есть макрос, который выполняется в списке переменных, и я хочу запустить его в списке преобразованных переменных.

Пример: У меня есть %let varList = x y;, и я хочу как выход x_log x_exp x_10 y_log y_exp y_10. Для этого я хочу два макроса один макрос A, который возвращает преобразованные имена переменных:

%macro A(var); 
    &var._log 
    &var._exp 
    &var._10 
%mend 

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

+0

Можете ли вы опубликовать некоторые примеры значений? Сначала краснеть, похоже, у вас слишком много полуколонок. – Tom

+0

Привет, Том, да, это не сработает из-за странного размещения полуколоней. Завтра я дам более подробный пример. Но я хочу, чтобы & outputName содержало результаты от запуска макроса A два раза (или более раз). – Sheldon

ответ

2

Итак, если внутренний макрос просто возвращаются символы, то есть фактически не генерировать любое не утверждение макросов, то почему бы не сделать внешний работает одинаково?

%macro inner(x); 
    &x._log &x._exp &x._10 
%mend; 

%macro outer(list); 
%local i; 
%do i=1 %to %sysfunc(countw(&list)); 
%inner(%scan(&list,&i)) 
%end; 
%mend outer; 

%let want=%outer(X y Z); 
+0

Это аккуратно , и вы правы, так как мой макрос на самом деле ничего не делает, он может также просто вернуть символы / – Sheldon

2

Это не слишком сложно. Вам необходимо перебрать значения в varList, добавив результаты к outputName. Кроме того, необходимо объявить outputName как глобальные, так он будет доступен за пределами %B

%macro B(varList, outputName); 
%global &outputName; 
%let &outputName = ; 

%local i n var; 
%let n = %sysfunc(countw(&varList)); 

%do i=1 %to &n; 
    %let var = %scan(&varList,&i); 
    %let &outputName = &outputName %A(&var); 
%end; 
%mend; 
+0

Спасибо @DomPazz, вот что я искал. Установка переменной в глобальную и ее добавление. – Sheldon

+1

Вы не можете сделать макро переменную global, если она уже существует в некоторой рабочей среде. Лучше использовать '% if not% symexist (& outputname)% then% global & outputname;' – Tom

+0

Кроме того, мне нужно было использовать '% let & outputName = &&& outputName% A (&var);', чтобы он мог правильно конкатенировать список. – Sheldon

Смежные вопросы