Как работает цикл в этом коде? Почему вызов выполнить работает без окончания цикла? - PullRequest
0 голосов
/ 15 апреля 2019

Нужно понимать, почему вызов execute работает, когда он находится вне цикла для каждой итерации? Имя переменной будет перезаписываться каждый раз, поэтому я должен получить результат для последней переменной в моем наборе данных, а не все 111 переменных.

data _null_; 
set basel.Data_Dictionary; 
do i =1 to 111 ;
call symput('Varname',NAME); 
%put &varname.; 
end;
call execute ('%missimp(&varname.)'); 
run;

1 Ответ

1 голос
/ 15 апреля 2019

Не уверен, что вы имеете в виду вне цикла?

Первое, что сделает программа, это напечатает значение, которое макропеременная VARNAME имеет ДО того, как шаг _null_ данных начинается в журнал.Обратите внимание, что сначала обрабатывается код макроса, а затем полученный текст интерпретируется как код SAS, который вы хотите запустить.Было бы менее запутанным помещать оператор %put перед оператором data.

Ваш шаг данных будет "зацикливаться" на каждом наблюдении в исходном наборе данных.Он будет читать наблюдения из ваших входных данных.Цикл DO заставит его установить макропеременную VARNAME в одно и то же значение сто одиннадцать раз.Затем он вызовет макрос с именем MISSIMP, который будет использовать значение VARNAME (во время выполнения оператора CALL EXECUTE).Это будет повторяться до тех пор, пока инструкция SET не попытается прочитать после конца входного набора данных.Все эти вызовы макросов будут выполняться после завершения текущего шага данных.

Намного проще было бы просто пропустить инструкцию CALL SYMPUT и использовать значение NAME, чтобы сгенерировать код для передачи в CALL EXECUTE.Как это:

data _null_; 
  set basel.Data_Dictionary; 
  call execute(cats('%missimp(',NAME,')')); 
run;
...