Компиляция против выполнения в SAS

#sas

#sas

Вопрос:

Этот вопрос обсуждался на форуме SAS, и участники, наконец, согласились не согласиться .

Проблема проста: SAS присваивает a missing value всем переменным во время компиляции UNLESS , переменная отображается в a sum statement (в этом случае SAS присваивает значение 0 во время компиляции ) . Вот мое простое доказательство

   data test;
  put _all_;
  var1 1;
  var2=5;
  put _all_;
  run;
 

Экран журнала

 var1=0 var2=. _ERROR_=0 _N_=1
var1=1 var2=5 _ERROR_=0 _N_=1
NOTE: The data set WORK.TEST has 1 observations and 2 variables.
 

var2 был назначен a missing value , НО var1 был назначен 0 , потому что он является частью a sum statement (я так считаю)


Мой вопрос в ТОМ, ПОЧЕМУ? Я был уверен, что SAS присваивает missing values все переменные при компиляции. Почему это создает исключение для переменной, которая будет отображаться в a sum statement ? Есть ли какие — то другие исключения ?

Ответ №1:

Я бы не назвал это оператором sum.

Утверждение

 var1 1;
 

эквивалентно

 retain var1 0;
var1 = var1   1;
 

Ни оператор ‘long’ sum

 var1 = var1   1;
 

ни

 var1 = sum(var1, 1);
 

само по себе не выполняло бы поведение СОХРАНЕНИЯ или инициализацию до нуля.
Итак, чтобы ответить на вопрос:

инициализация нулем является частью поведения СОХРАНЕНИЯ , неявно запрашиваемого a b; синтаксисом для переменной a .

Я не могу думать о других исключениях.

Комментарии:

1. Хорошее объяснение. Также стоит отметить, что местоположение в потоке данных, в который вы фактически помещаете retain инструкцию, не влияет на время распознавания инструкции. Таким образом, размещение оператора retain в качестве последней строки кода — это то же самое, что и размещение его в качестве первой строки кода.