代码之家  ›  专栏  ›  技术社区  ›  CPak

从数据集中的宏函数返回和分配全局值

sas
  •  0
  • CPak  · 技术社区  · 7 年前

    不太确定执行以下操作的最佳方法-我想从数据步骤中调用宏函数,将现有列中的值作为参数传递,并将宏函数生成的值赋给新列。我对任何方法都很开放——proc-sql、call-execute等。

    %macro simple(x=);
        %global value;
        %let value = %sysfunc(intnx(month, %sysfunc(today()), &x, same)); 
        %put &value;
    %mend simple;
    %simple(x=1);
    
    data have;
        do x = 1 to 15;
            output;
        end;
    run;
    
    data want;
        data have;
            newdate = %simple(x);
    run;
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   data _null_    7 年前

    注意对简单百分比的更改以及调用它的位置。解决此案例的工作,但
    %复杂:-)不会。另外,最好不要调用宏,所有操作都可以在数据步骤中完成。我希望你能更好地利用这个而不是工作保障。

    %macro simple(x=);
       %sysfunc(intnx(month, %sysfunc(today()), &x, same))
       %mend simple;
    
    %put NOTE: %simple(x=1);
    
    data have;
        do x = 1 to 15;
            output;
        end;
    run;
    
    data want;
       set have;
       newdate = input(resolve(cats('%simple(x=',x,')')),F16.);
       format newdate date9.;
       run;
    proc print;
       run;
    
        2
  •  3
  •   Tom    7 年前

    如果要在语句中间使用宏,如:

    newdate = %simple(x);
    

    然后宏只能发出语句的一部分。这不是分号。

    在这种情况下,如果定义宏以生成对intnx()的调用,那么可以在赋值语句中使用它。

    %macro simple(value);
      intnx('month',%sysfunc(today()),&value,'same')
    %mend simple;
    

    因此,如果today()是2018年11月20日,那么您在数据步骤中有效地运行这个有效的SAS语句。

    newdate = intnx('month',21508,x,'same') ;
    

    注意如何 名称 变量x是传递给宏的内容,以及生成的SAS代码中使用的内容。

    当然,如果您想尝试在SAS语句之外使用宏,那么它现在是无用的。

    推荐文章