SAS:暗变量和宏变量
SAS: dim and macro variables
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 在这里不起作用。如何正确地做到这一点?
您正在以 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);
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 在这里不起作用。如何正确地做到这一点?
您正在以 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);