为什么我不能在 do 宏循环中使用 call symputx() ?

问题描述 投票:0回答:1

我需要在 SAS 循环中临时动态存储日期值。当我在宏之外运行下面的代码时,它可以工作。

/*This works outside of a macro*/
    %let i=1;
            /* Assuming &i contains the row number*/
            data _null_;
              set new_dataset;
              if _n_=&i then do;
                call symputx('start', date_var,'g');
              end;
              stop;
            run;
    %put Start Date: &start;

此代码是另一段在宏之外但不在宏循环内工作的代码。

proc sql noprint inobs=&i;
  select date_var into :start from new_dataset;
quit;

但是,当我运行下面的代码时,它不起作用。有谁知道问题是什么以及可能的解决方案?

%macro loop_enrollment_first;
    
    %do i = 1 %to 10;
        
        %put &i;
        /* Assuming &i contains the row number*/
        data _null_;
          set new_dataset;
          if _n_=&i then do;
            call symputx('start', date_var,'g');
          end;
          stop;
        run;

        %put Start Date: &start;
     %end;
%mend loop_enrollment_first;
%loop_enrollment_first;
loops for-loop sas macros
1个回答
0
投票

三点:

  1. 我怀疑这是解决您实际问题的最佳方法。这似乎是一个更大问题的一部分,可以更简单地解决。
  2. 在您发布的代码中,您必须确保您的输入数据中实际上有 10 个可用的 obs。否则,程序会抛出错误。
  3. 我认为这里的主要问题是 Stop 语句。您将其放在 If N = &i 之外。部分。因此,程序将在第一次迭代中退出数据步骤。您可能想将 Stop 语句放置在 If 块内,如下所示。
© www.soinside.com 2019 - 2024. All rights reserved.