Есть ли способ сохранить и обновить «список» в переменной% let? - PullRequest
1 голос
/ 14 января 2020

Все еще довольно новый (и изо всех сил!) Для SAS, вот кое-что, что я действительно хотел бы сделать, но просто не могу понять: сохранять и обновлять / добавлять в список в скрипте SAS.

Ситуация: моя работа заключается в создании / сортировке наборов данных на основе большой базы данных для использования другими. Например, мы получаем список критериев выбора и запрошенных переменных, которые мы используем для создания набора данных в исследовательских целях. Некоторые из запрошенных переменных будут «готовы к отправке» в нашей базе данных, другие мы должны вычислить / создать в запрошенном формате. Мы пишем сценарии SAS, которые документируют весь процесс от выбора до написания набора данных для доставки. Это означает, что к концу есть шаг, когда мы выбираем из всех переменных в наборе данных, с которыми мы работаем, только те переменные, которые мы хотим доставить нашим «клиентам». Что я действительно хотел бы сделать, так это «построить» список переменных для доставки «как I go», т.е. добавить имя каждой переменной, которую я создал или подтвердил готовность к доставке, в список с именем «varstodeliver». ", так что в конце я могу просто сказать ему выбрать все переменные в" varstodeliver ". Возможно ли это?

Вот как далеко я продвинулся:

%let varstodeliver = IDvar;
%put &varstodeliver; * prints IDvar;

data _null_;
 call symputx("varstodeliver", catx(" ", vname(&varstodeliver.), "var1 var2"));
run;

%put &varstodeliver; * prints IDvar var1 var2 ;

Обратите внимание, что я прибег к использованию vname (), чтобы получить реальное имя хранится в & varstodeliver. Пока все хорошо, но если я попытаюсь добавить четвертое имя переменной (точнее: третье добавление, поскольку предыдущее добавление состояло из двух имен переменных в одном go), оно остановится из-за слишком большого количества уровней & varstodeliver:

data _null_;
 call symputx("varstodeliver", catx(" ", vname(&varstodeliver), "var3"));
run;

ОШИБКА: вызов функции VNAME имеет слишком много аргументов.

Ввод или идеи о том, как еще поддерживать подсчет, очень приветствуются !!

пс среди других вещей Я пытался это:

data _null_;
 call symputx("varsteleveren", catx(" ", vlist(vname(&varsteleveren.(*))), "var3"));
run;

, который возвращает: ОШИБКА: необъявленный массив ссылается: var2. ОШИБКА: спецификация ARRAYNAME [*] требует массив. ОШИБКА: у вызова функции VNAME слишком много аргументов.

1 Ответ

3 голосов
/ 14 января 2020

Если вы просто хотите добавить имена переменных в макропеременные и сохранить их все, вы можете использовать %let:

%let varstodeliver = IDvar;
%put &=varstodeliver;

VARSTODELIVER = IDvar

%let varstodeliver= &varstodeliver var1 var2;
%put &=varstodeliver;

VARSTODELIVER = IDvar var1 var2

%let varstodeliver= &varstodeliver var3;
%put &=varstodeliver; 

VARSTODELIVER = IDvar var1 var2 var3

...