2014-10-29 122 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 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. 您缺少datastep来计算所有非宏变量。
  2. 当你打电话给一个MACRO执行,这是一个最佳实践,不要把;在行末。
  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.,无论是逗号还是包含''''关键字。 – Joe 2014-10-29 20:07:15

+0

对于5,我同意你可以在声明宏时声明默认值。那会提出一个问题,那么宏观的重点是什么?为;在调用MACRO之后,我不确定你的意思是“通常需要让语法高亮器正常工作”。事实上,官方文件甚至没有提到需要;换句话说,编译器忽略了;。 – Salva 2014-10-29 20:47:11

+0

当您有时需要填充值并且有时不需要时,默认值才有意义。我一直都在使用它们。对于';'位,语法高亮显示是增强的编辑器或企业指南的一部分,它将关键字转换为不同的颜色;在宏程序调用对程序不起作用的情况下忽略';',但它有时会导致荧光笔混淆,因此下一个语句可能无法正确突出显示。 (显然,在某些情况下,';'是一个问题,在这种情况下,它必须排除在外。) – Joe 2014-10-29 20:55:42