Loops 没有任何输出的宏do循环

Loops 没有任何输出的宏do循环,loops,macros,sas,Loops,Macros,Sas,我的目的是了解是否有后续行动。首先,objid需要与所有R1到R14进行比较。如果objid等于某个RX,则检查R(X+1)中是否有后续操作。总的来说,最大R为14。如果objid=R14,则没有后续行动。例如,第一条记录中的objid是1111。它与R1相同,并且有一个后续的R2,因为R2没有丢失。第二条记录R1=R14,但没有后续记录 我已经写了一段代码,但没有输出。我不明白问题出在哪里 数据如下所示: objid R1 R2 ... R14 ----- ---- --

我的目的是了解是否有后续行动。首先,objid需要与所有
R1
R14
进行比较。如果objid等于某个
RX
,则检查
R(X+1)
中是否有后续操作。总的来说,最大
R
为14。如果
objid=R14
,则没有后续行动。例如,第一条记录中的objid是1111。它与R1相同,并且有一个后续的
R2
,因为
R2
没有丢失。第二条记录
R1=R14
,但没有后续记录

我已经写了一段代码,但没有输出。我不明白问题出在哪里

数据如下所示:

objid  R1    R2    ...   R14
-----  ----  ----        ----
1111   1111  1112  ...  
2222   1101  2201  ...   2222
...             
4567   5234  4567  ...  
代码:

%macro rr(n=);
   data linkrr;
      set linkrev_tricup;
      %do i=1 %to &n;
         %if %eval(r&i.=objid) %then %do;
            %let j=%eval(&i.+1);
            %if %eval(r&j.>0) %then %eval(index_rr=1); 
            %else %eval(index_rr=0);
            output;
         %end;
      %end;
   run;
%mend rr;
%rr(n=14);

您正在混合使用宏和datastep函数。宏函数只是代码生成器。他们无法评估在datastep中传递的信息。 为此,请尝试仅使用带有数组的datastep代码 e、 g


数组方法是有道理的,但当我读OP时,她希望第二条记录的索引为0,所以我将删除最后一条IF语句。我并没有真正理解问题的这一部分。在这种情况下,只需省略
如果R[dim(R)]eq objid,那么index_rr=1零件。
data linkrev_tricup;
   infile datalines ; 
   input objid R1 R2 R14;
   datalines;                      
1111    1111    1112   .
2222    1101    2201   2222
;

data linkrr;
set linkrev_tricup;
index_rr=0;
array R [*] R1 -- R14;
do i = 1 to dim(R)-1;
    if R[i] eq objid and R[i+1] gt 0 then do; 
        index_rr=1; 
        leave;
    end;
end;
if R[dim(R)] eq objid then index_rr=1; 
run;