SAS обращается к имени макропеременной - PullRequest
0 голосов
/ 18 октября 2018

У меня есть несколько макропеременных, и каждой присваивается значение.Как я могу получить имя переменных из их значения?Например, я назначил каждому человеку возрастное значение.& Эми = 12, & Питер = 10.У меня также есть макро-функция, которая вычисляет что-то еще, скажем, вес.

%macro weight(name=);
       %let weight=&name*10;
       %put &name.'s weight is &weight.;
%mend;

, если я запускаю% weight (name = Amy), я хочу получить результат как «Amy's weight is 120».как я могу получить результат как "Эми" вместо "12"?

Спасибо

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Красиво зло!Эта маленькая одиночная цитата в "Эми" все немного запутывает.SAS, похоже, запутался, пытаясь оценить остальную часть макроса как строку в кавычках.Начните с «волшебной строки», чтобы завершить все кавычки, и убедитесь, что вы включили вывод макроса.

После того, как вы это сделаете, должно работать следующее.Обратите внимание на дополнительные амперсанды перед именем, как предложил другой респондент.

;*';*";*/;quit;
options mprint;
%let Amy = 12;
%macro weightmacro(name=);
       %let weight=%sysevalf(&&&name..*10);
       %put &name.s weight is &weight.;
%mend;
%weightmacro(name=Amy);
0 голосов
/ 19 октября 2018

Если точка является притяжательным существительным, которое может быть достигнуто с помощью% str (% ');

357  %let Amy = 12;
358  %macro weightmacro(name=);
359         %let weight=%sysevalf(&&&name..*10);
360         %put &name.%str(%'s) weight is &weight.;
361     %mend;
362  %weightmacro(name=Amy);
Amy's weight is 120
0 голосов
/ 18 октября 2018

Это поможет вам в этом.Обратите внимание, что апостроф здесь немного проблематичен, вам нужно избежать этого или процитировать его.Я проигнорировал это сейчас.Для остальной части вашего вопроса:

  1. Добавьте еще & для разрешения вложенной макропеременной
  2. Используйте% SYSEVALF () для выполнения расчетов с макропеременными

    %let Amy = 12;
    
    %macro weight(name=);
           %let weight=%sysevalf(&&&name*10);
           %put &name. weight is &weight.;
    %mend;
    
    %weight(name=Amy);
    
...