2014-10-29 5 views
2

Вот мой макрос, ниже. Переменные var1, var2, var3, VR и maxwt не вводятся в макрос и не находятся в файле. Это промежуточные результаты, которые вычисляются внутри макроса. Когда я исполняю в в SAS 9.3, я получаю сообщение, как это:Промежуточные переменные в макросе SAS

1  var1 = &dcount1 * (&spop1/&refpr1)**2; 
     ---- 
     180 

ERROR 180-322: Statement is not valid or it is used out of proper order. 

Macro:

%macro confi (aart,dcount1,dcount2,dcount3,spop1,spop2,spop3,refpr1=0.53468238,refpr2=0.30153350,refpr3=0.16378412); 
    var1 = &dcount1 * (&spop1/&refpr1)**2; 
    var2 = &dcount1 * (&spop2/&refpr2)**2; 
    var3 = &dcount3 * (&spop1/&refpr3)**2; 

    VR = var1+var2+var3; 

    maxwt = max(&refpr1 &refpr2 &refpr3); 

    CI_low = (VR/ 2*&aart)) * cinv(0.025,2*(&aart**2)/VR); 
    CI_high = ((VR + maxwt**2)/(2*(&aart+maxwt)))* cinv(0.975, 2*(&aart+maxwt)**2/(VR + maxwt**2)); 

    %put &aart CI_low CI_high; 

%mend confi; 

%confi (aart=1000, dcount1=20, dcount2=70, dcount3= 10. spop1=3000, spop2=3000, spop3=200); 

ответ

1

Этот макрос должен быть выполнен внутри шага данных. Это переменные и операторы данных и не могут быть выполнены в открытом коде.

Вы также не можете использовать %put для этой цели - вам необходимо использовать put.

1
  1. Вам не хватает данных, чтобы рассчитать все ваши не-макропеременные.
  2. Когда вы вызываете МАКРО для выполнения, это ЛУЧШАЯ ПРАКТИКА не ставить; в конце строки.
  3. На арифметической операции CI_LOW у вас есть рассогласование.
  4. Когда вы вызываете макрос% confi, вы неправильно назначаете значение переменной dcount3, вам нужна запятая, а не точка.
  5. Когда вы объявляете макрос, вы не назначаете значения там, а только объявляете переменные.
  6. В функции Макс. Переменные должны быть разделены запятыми.

Попробуйте это:

Options Macrogen Symbolgen; 
%macro confi (aart,dcount1,dcount2,dcount3,spop1,spop2,spop3,refpr1,refpr2,refpr3); 

data _null_; 
var1 = &dcount1 * (&spop1/&refpr1)**2; 
var2 = &dcount1 * (&spop2/&refpr2)**2; 
var3 = &dcount3 * (&spop1/&refpr3)**2; 
VR = var1+var2+var3; 

maxwt = max(&refpr1, &refpr2, &refpr3); 


CI_low = (VR/ 2*&aart) * cinv(0.025,2*(&aart**2)/VR); 
CI_high = ((VR + maxwt**2)/(2*(&aart+maxwt)))* cinv(0.975, 2*(&aart+maxwt)**2/(VR + maxwt**2)); 

put 'low =' CI_low; 
put 'high = ' CI_high; 

run; 

%put &aart; 

%mend confi; 

%confi (aart=1000, dcount1=20, dcount2=70, dcount3= 10, spop1=3000, spop2=3000, spop3=200, refpr1=0.53468238, refpr2=0.30153350, refpr3=0.16378412) 
+0

Ввод ',' в конце строки часто необходимо получить подсветки синтаксиса для правильной работы, к сожалению. Для 5. это неверно; вы можете назначить значения по умолчанию (и это похоже на то, что здесь нужно). Для 6., либо запятые, либо включают ключевое слово 'of'. – Joe

+0

Для 5 я согласен, что вы можете объявлять значения по умолчанию при объявлении макроса. Это поднимет вопрос, какова точка макроса ?. Для ; после вызова MACRO, я не уверен, что вы подразумеваете под «часто необходимо, чтобы подсветка синтаксиса работала правильно». Фактически официальная документация даже не упоминает о необходимости; другими словами, компилятор игнорирует:. – Salva

+0

Значения по умолчанию имеют смысл, когда вы иногда хотите, чтобы значение было заполнено, а иногда нет. Я использую их все время. Для бит ';' синтаксический ярлык является частью расширенного редактора или корпоративного руководства, который превращает ключевые слова в разные цвета; Отсутствует ';' после вызова макроса не требуется, чтобы программа работала, но иногда это может привести к тому, что маркер будет запутан, поэтому следующий оператор может быть неправильно подсвечен. (Очевидно, что есть некоторые случаи, когда ';' является проблемой, и в этих случаях это должно быть исключено.) – Joe