Простые вычисления в макропеременных - можно ли использовать функцию MOD (,)? - PullRequest
0 голосов
/ 04 февраля 2019

Есть ли умный способ использовать функцию MOD(,) при определении макропеременных?

Например, рассмотрим это:

%LET year=2015;
%LET dec = %EVAL(mod(&year.,100));

Где dec будет содержать только два последнихцифры года.Это не будет работать (то же самое с SYSEVAL), так как функция %EVAL не может правильно получить доступ к функции MOD.

Я не хочу включать DATA STEP, но результат долженна самом деле может быть что-то вроде этого:

data _null_;
input_year=2015;
input_dec =mod(input_year,100);
%LET year=input_year;
%LET dec = input_dec;
put &dec. 'and ' &year.;
run;

Проблема здесь в том, что Макропеременные не могут быть вызваны вне DATA STEP (возможно, я сделал что-то не так? Даже global option не работает).

Некоторый контекст:

В существующем autoexec file пользователь должен изменить некоторые входные данные, в зависимости от года, все вместе 3 Макропеременные должны быть адаптированы (год, декабрь и последующий год).Моя идея заключалась в том, чтобы вывести другие изменения только из одного источника - года.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Вам необходимо использовать SYSFUNC (), чтобы использовать функции в синтаксисе макросов.SUBSTR тоже будет работать.

%let year=2015;
%let index = %sysfunc(substr(&year, 3, 2));

%put &year;
%put &index.;

% EVAL () работает для математических вычислений, таких как:

%let next_year = %eval(&year + 1);
%let next_year_index = %eval(&index + 1);

%put Next Year: &next_year.;
%put Next Year Index: &next_year_index;
0 голосов
/ 05 февраля 2019

Reeza предоставила хорошее решение, которое абсолютно правильно.Я бы расширил его двумя комментариями:
1. В SAS можно найти такие функции, как% SUBSTR, но они работают только с макро-переменными ;они не заменяют %sysfunc(substr()), наоборот.
2. Полезно потратить минуту и ​​просмотреть список макрофункций, то есть тех, которые начинаются со знака процента: вы увидите это, кроме% EVAL ()также есть% SYSEVALF ().Список здесь .

0 голосов
/ 04 февраля 2019

%eval и %sysevalf используются для вычисления чисел вне шага данных.При использовании функций вам нужно %sysfunc

%LET year=2015;
%LET dec = %sysfunc(mod(&year.,100));

%put &=dec. and &=year.;
...