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);