2017-02-02 20 views
0

Потребности выполнить оценку макропеременной вне datastep и в зависимости от наличия переменного, выполните вставку:Введенного значения Если макропеременная существует еще другое значение

data my_dataSet; 
set ... 
.... 
if %SYMEXIST(Variable_from_prior_code) = 1 then do; 

    dataset_variable = &Variable_from_prior_code.; 

    end; 
else do; 

    dataset_variable = &Some_default_value_from_prior_code; 

end; 

Однако это терпит неудачу в компиляторе при попытке запустить его как «Явная символическая ссылка & Variable_from_prior_code». не было разрешено. То есть. компилятор проверяет содержимое оператора if, даже если это условие не выполняется.

я придумал глупую обходным: подойти к этому с противоположной directon, но чувствует себя глупее мешок барсуков:

if %SYMEXIST(Variable_from_prior_code) = 0 then do; 

    dataset_variable = &Some_default_value_from_prior_code 

    %let Variable_from_prior_code=0; /*Dummy value*/ 

    end; 
else do; 

    dataset_variable = &Variable_from_prior_code.; 

end; 

Любой способ ограничить компилятор от оценки содержания, что он не должен» т из-за состояния? Или, альтернативно, более элегантный обход, который не требует создания переменной?

+1

Вы смешиваете макро логику (используется для генерации кода) и логику шага данных. Если вы поместите свой код в макрос, вы можете использовать% IF для условного генерации кода. – Tom

ответ

1

Я бы сказал, избегайте макро логики, если это необходимо! Ниже приведен чистый подход к обработке данных:

%symdel Variable_from_prior_code; /* make sure variable does not exist */ 
%let Some_default_value=test; /* populate macro variable */ 

data my_dataSet; 
    if SYMEXIST('Variable_from_prior_code') = 1 then do; /* use data step function */ 
    /* note variable name is quoted, else would reference a data step variable value */ 
    dataset_variable = symget('Variable_from_prior_code'); 
    end; 
    else do; 
    /* had to shorten this name to less than max allowed 32 chars */ 
    dataset_variable = symget('Some_default_value'); 
    end; 
run; 

Как упоминает Том, вы в настоящее время смешиваете макрос и логику шагов данных. Макрос используется для написания кода шага данных (так что это по существу генератор программ), и этот полученный код шага данных выполняется задолго после того, как макрокоманды скомпилированы/решены/выполнены.

+0

Симгмент сделал трюк. Протестировано и подтверждено для работы. Согласовано. макро логика - плохой джуй. Однако потребность такая, какая есть. :((Чтобы объединить два старых рабочих процесса и разрешить редактировать только выбранные несколько файлов. ') – pinegulf