SAS do-Loops и операторы set

Почему этот макрос работает? (да) Цикл может начаться, несмотря на то, что переменная nrows определена в операторе set внутри цикла. Читает ли SAS инструкцию set перед запуском цикла? Где я могу найти документацию по этому вопросу (какие операторы внутри циклов, если они есть, выполняются до запуска цикла)?

%macro get_last_n_rows(n, existing, new);
data &new.;
do _i_ = 1 + nrows - &n. to nrows;
  set &existing. point = _i_ nobs = nrows;
  output;
end;
stop;  
run;
%mend get_last_n_rows;

person IceCreamToucan    schedule 02.03.2018    source источник


Ответы (1)


Краткий ответ на ваш вопрос: да, SAS считывает количество доступных строк до выполнения цикла. Фактически SAS считывает количество доступных строк перед выполнением шага данных; это определяется во время компиляции шага данных. См., например, эту статью и эту статью и многие другие.

См., в частности, SAS. документация для SET:

Во время компиляции SAS считывает дескрипторную часть каждого набора данных и автоматически присваивает значение переменной NOBS=. Таким образом, вы можете обратиться к переменной NOBS= перед оператором SET. Переменная доступна на шаге DATA, но не добавляется ни в один выходной набор данных.

Обратите внимание, что это не имеет ничего общего с циклом do; это верно для всего шага данных (который, конечно, сам по себе является одним большим циклом).

person Joe    schedule 02.03.2018
comment
Также стоит отметить, что это можно было бы сделать проще с помощью firstobs, а не point, учитывая, насколько тривиально определить количество наблюдений. Гораздо эффективнее. - person Joe; 03.03.2018