假设我允许用户使用通用用户界面编写自己的变量计算宏:
%macro calculate(var_name, var_value);
%* Some user-defined calculation;
%mend calculate;
Run Code Online (Sandbox Code Playgroud)
然后在数据步骤中,我可以使用用户定义的宏计算新变量:
data dataset;
set dataset;
new_var = %calculate('variable1', variable1); * This doesn't work. It just shows my indication.
run;
Run Code Online (Sandbox Code Playgroud)
其中variable1是数据集中的变量.在这里,我想传递变量名称和变量的实际值.计算后,将值放在new_var中.
我怎样才能做到这一点?
是否需要使用宏实现此目的?这听起来像是PROC FCMP
最有用的情况,因为它允许您定义自己的函数或子例程(fcmp ="函数编译器"),它们可以像数据内置函数一样在数据步骤中使用.
这是一个简单的例子:
proc fcmp outlib=sasuser.funcs.math;
function calc(var);
newvar=log(var); /*user defined stuff here - can be simple or complex*/
return(newvar);
endsub;
run;
option cmplib=sasuser.funcs; /*tell SAS where to look for functions*/
data _null_;
set sashelp.class;
newvar=calc(height); /*call your new function */
put newvar=;
run;
Run Code Online (Sandbox Code Playgroud)
您可以完成此操作,但您可能错误地编写了宏。您必须记住,SAS 宏本质上是文本预处理器:它们输入您编写的代码并输出代码以馈送到 SAS [1]。
这是一个简单的“加法”宏:
%macro calculate (var_name, var_value);
&var_name + &var_value;
%mend;
data one;
input a@@;
b = %calculate(a, 3);
c = %calculate(a, a);
cards;
1 3 -2 4
;
run;
proc print data=one;
run;
Run Code Online (Sandbox Code Playgroud)
宏工具将%calculate
用宏生成的代码替换这些位,SAS 实际上会看到以下内容:
%macro calculate (var_name, var_value);
&var_name + &var_value;
%mend;
data one;
input a@@;
b = a + 3;
c = a + a;
cards;
1 3 -2 4
;
run;
proc print data=one;
run;
Run Code Online (Sandbox Code Playgroud)
options mprint
您可以在日志文件中使用以下语句亲自查看它
不幸的是,这并不能涵盖所有潜在的计算。您可能想要寻找PROC FCMP
一种方法来生成可在 DATA 步骤中使用的自定义函数/子例程。
[1] 我知道事情比这更复杂,但你可以这样思考。