在宏中包含代码时出现问题

时间:2014-08-20 13:13:06

标签: sas sas-macro

我不知道这是否适合发布,但在我看来,我更有可能在那里得到答案。

目前正在为SAS实习工作,我正在尝试编写一个宏来自动化为我的数据集找到拟合ARIMA模型的过程。我对这个软件很陌生,而且不是统计领域的专家。

然而,虽然我似乎明白如何导入我的文件并启动proc arima,但我仍然遇到了一个小问题。我的代码的一部分,如果我在宏之外编写它(我猜它叫open code?)就可以正常工作了:

data _null_;
set Lib.out;    /* Lib.out contains the data of the OUTSTAT statement of the PROC ARIMA */
x = 1000000;
put _STAT_;     /* Prints correctly the names of the different lines in the log */
if _STAT_='AIC' then do;  /* _STAT_ is a column and AIC the name of a line AFAIK */
    if _VALUE_ < x then
        x = _VALUE_;
    put x;
    put _STAT_;  /* Here only prints AIC, which I guess is correct inside of the IF loop */
end;
run;

但是当在一个宏中运行时,例如:

%macro recherche(poste=, mto=);
    --- code ---

data _null_;
set Lib.out;    /* Lib.out contains the data of the OUTSTAT statement of the PROC ARIMA */
%let aic0 = 1000000;
%put _STAT_;     /* Doesn't recognize the _STAT_ statement and stops */
%if _STAT_='AIC' %then %do;
    %if _VALUE_ < &aic0 %then %do;
        &aic0 = _VALUE_;
        data Lib.chosen;
        set Lib.model;   /* Contains the OUTMODEL statement of PROC ARIMA */
        run;
    %end;
end;
run;

    --- code ---

我试图在互联网上搜索类似的案例,但无法找到我正在寻找的解释。此外,作为SAS的新手,官方文档仍然难以理解。提前谢谢。

2 个答案:

答案 0 :(得分:0)

你在那里做的大部分内容都不需要%。如果它是一个控制甚至发送给编译器的代码行的语句,你只需要它。

%macro recherche(mto=);
data _null_;
set Lib.out;    /* Lib.out contains the data of the OUTSTAT statement of the PROC ARIMA */
x = &mto.;
put _STAT_;     /* Prints correctly the names of the different lines in the log */
if _STAT_='AIC' then do;  /* _STAT_ is a column and AIC the name of a line AFAIK */
    if _VALUE_ < x then
        x = _VALUE_;
    put x;
    put _STAT_;  /* Here only prints AIC, which I guess is correct inside of the IF loop */
end;
run;
%mend recherche;

假设MTO参数用于保存分配给x的值。你唯一一次使用%IF就是你做了类似

的事情
%macro recherche(mto=,stat=);
data _null_;
set Lib.out;    /* Lib.out contains the data of the OUTSTAT statement of the PROC ARIMA */
x = &mto.;
put _STAT_;     /* Prints correctly the names of the different lines in the log */
%if &stat=AIC %then %do;
  if _STAT_='AIC' then do;  /* _STAT_ is a column and AIC the name of a line AFAIK */
    if _VALUE_ < x then
        x = _VALUE_;
    put x;
    put _STAT_;  /* Here only prints AIC, which I guess is correct inside of the IF loop */
  end;
%end;
%else %if &stat=XYZ %then %do;
  *more code ...;

%end;
run;
%mend recherche;

那只会执行其中一段或另一段代码。宏语句无权访问proc或data步骤中的数据,并且它们不使用引号(除非引用是代码的实际重要部分)。

答案 1 :(得分:0)

在宏中使用管道语句do while循环时遇到了同样的问题。我会得到unclosed do循环错误,但语句可以独立工作。我曾尝试过每一次迭代来解决,但无济于事。最后,我的解决方案是将管道infile语句放入自己的程序中,然后使用%include将其带入宏。这非常有效!这个问题绝对是SAS内部的一个错误。