SAS:暗变量和宏变量

时间:2019-02-08 09:46:09

标签: sas sas-macro

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在这里不起作用。如何正确做到这一点?

1 个答案:

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