data example1;
input var1 var2 var3;
datalines;
10 11 14
3 5 8
0 1 2
;
data example2;
input var;
datalines;
1
2
8
;
让我们说 var 变量的数量取决于数据输入。我想将该数字放入宏变量并在另一个数据步骤中使用,例如:
%macro m(input);
data &input.;
set &input.;
array var_array[*] var:;
%let array_dim = dim(var_array);
do i = 1 to &array_dim;
var_array[i] = var_array[i] + 1;
end;
drop i;
run;
data example2;
set example2;
var2 = var * &array_dim; /* doesn't work */
run;
%mend;
%m(example1);
%let array_dim = dim(var_array);在第二个数据步骤中不起作用,因为未评估dim(var_array),但是在声明宏变量时%eval或%sysevalf在这里不起作用。如何正确做到这一点?
答案 0 :(得分:1)
您正在以SAS不支持的方式混合宏代码和数据步骤代码。如果要为宏变量分配在数据步骤中生成的值,则需要使用call symput
。
此外,如果在数据步骤中创建宏变量,则无法在尝试执行的同一数据步骤中解析宏变量(除非使用resolve
函数...)。只需为此使用数据集变量即可。
因此,这是您的代码的固定版本,我认为它可能满足您的要求:
%macro m(input);
data &input.;
set &input.;
array var_array[*] var:;
array_dim = dim(var_array);
/*Only export the macro variable once, for the first row*/
if _n_ = 1 then call symput('array_dim_mvar', array_dim);
do i = 1 to array_dim;
var_array[i] = var_array[i] + 1;
end;
drop i;
run;
data example2;
set example2;
var2 = var * &array_dim_mvar;
run;
%mend;
%m(example1);