宏变量中的简单计算 - 使用 MOD(,) 函数的任何方式?
Simple calculations in Macro Variables - any way to use the MOD(,) function?
在定义宏变量时,有没有巧妙的方法来使用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 个宏变量(年份、十二月和后续年份)。我的想法是仅从一个输入(年份)推断出其他变化。
%eval
和 %sysevalf
用于在数据步骤之外对数字进行计算。使用函数时,您需要 %sysfunc
%LET year=2015;
%LET dec = %sysfunc(mod(&year.,100));
%put &=dec. and &=year.;
您需要使用 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;
Reeza 提供了一个很好的解决方案,绝对正确。我将通过两条评论对其进行扩展:
1. 您可以在 SAS 中找到类似 %SUBSTR 的函数,但这些函数仅在 macrovariables 上运行;相反,它们不会取代 %sysfunc(substr())
。
2. 花一点时间浏览一下宏函数列表很有用,即那些以百分号开头的函数:您会看到除了 %EVAL() 之外,还有 %SYSEVALF()。该列表是 here.
在定义宏变量时,有没有巧妙的方法来使用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 个宏变量(年份、十二月和后续年份)。我的想法是仅从一个输入(年份)推断出其他变化。
%eval
和 %sysevalf
用于在数据步骤之外对数字进行计算。使用函数时,您需要 %sysfunc
%LET year=2015;
%LET dec = %sysfunc(mod(&year.,100));
%put &=dec. and &=year.;
您需要使用 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;
Reeza 提供了一个很好的解决方案,绝对正确。我将通过两条评论对其进行扩展:
1. 您可以在 SAS 中找到类似 %SUBSTR 的函数,但这些函数仅在 macrovariables 上运行;相反,它们不会取代 %sysfunc(substr())
。
2. 花一点时间浏览一下宏函数列表很有用,即那些以百分号开头的函数:您会看到除了 %EVAL() 之外,还有 %SYSEVALF()。该列表是 here.