Как присвоить значение макросу в datastep в цикле SAS

Поэтому я пытаюсь сделать что-то вроде этого:

data temp1;
 set temp;
 do i=1 to 10;
 call symput("var1", i);
 end;

 array x(*) x_&var1 to x_&var10;
 ....................


run;

Я пытаюсь присвоить значение я (от 1 до 10) макро переменной var1. В том же файле datastep я буду использовать переменные var1 для индексирования массивов.

2 ответа

Вы можете изменить свой call symput:

call symput(compress('var'||put(i,8.)), put(i,8.));

Я также завернул put() вокруг второго аргумента в symput чтобы очистить сообщение журнала.

(Тем не менее, это выглядит странно. Если вы динамически создаете много макропеременных, вы можете переосмыслить свою общую стратегию и придумать что-то более простое.)

Изменить: Nate имеет хороший смысл в переменной SAS, созданной с использованием symput не может использоваться внутри одного и того же файла. Если вы все еще хотите, чтобы пойти с этим решением, вы можете переместить symput петлю в _null_ datastep перед вашим "TEMP1" шаг.


Здесь есть несколько вопросов.

Один из них заключается в том, что вы не можете создать макро переменную с вызовом symput и ссылаться на нее на одном и том же шаге данных, поэтому никакая вариация на symput-sym будет исправлять это, если вы не разделите ее на несколько шагов данных.

Другим является то, что, поскольку у вас есть свой код, написанный (и в вашем описании), вы будете переписывать "var1" 10 раз... вы не хотите и хотите var1. , & var2. ,..., & var10. ? Если это так, я бы рекомендовал что-то вроде:

call symput('var'||left(i),i);

Наконец, если вам нужны только эти макропеременные для объявления массива, зачем вообще использовать макропеременные? Почему бы просто не написать x_1 в x_10? Может быть, если вы дадите нам больше информации о том, что именно вы пытаетесь достичь, мы можем разработать более эффективную стратегию для вас.

licensed under cc by-sa 3.0 with attribution.