2016-10-06 183 views
0

此宏字符串比较以神秘的方式为我工作。对我来说很明显,%test1(intotest)%test2(intotest)的结果是相等的。sas宏字符串比较不等同于相同的方式

%macro test1(intotest=); 
    %str(&intotest) = %str("b"); 
%mend; 

%macro test2(intotest); 
    %if %str(&intotest) = %str("b") %then 
     1; 
    %else 0; 
%mend EAF; 

data datatable; 
    fromtable = 'b'; 
    test1 = %test1(intotest=fromtable); 
    test2 = %test2(intotest=fromtable); 
run; 

输出是 fromtable=b,test1=1,test2=0

我将如何改写%test2(),以便它给出了相同的结果%test1()并仍然使用信息的数据表作为输入?

+1

这是一个可怕的宏代码使用。请不要使用这个。除非这是一项学术活动,否则你真的想做什么? Proc fcmp用于功能。 – Reeza

+1

'%修补EAF'是什么意思?我只使用没有参数的'%mend'或者你想结束的宏的名字。 –

+0

@StigEide“警告:对宏定义TEST1忽略了%MEND语句上的无关文本。” –

回答

2

SAS语言被设计成处理在数据集(和其它来源)的数据。宏语言旨在处理文本并生成SAS语言代码。

在第一个示例中,您正在成功使用宏语言生成SAS代码fromtable = "b";,然后SAS代码计算(对于每个记录)数据集变量fromtable的数据值等于文字值b的数据值。顺便说一句,你不需要%str()函数。

在第二个示例中,您试图(希望)使用宏语言来处理存储在数据步骤变量中的数据。宏语言不处理数据步骤数据。 [有些例外,但我认为他们不会帮助你理解。]正如所写,宏语言是将文本字符串fromtable与文本字符串"b"进行比较(请注意,字符串是三个字符长,因为在宏语言引用标记是价值的一部分)。宏语言不知道有一个名为fromtable的数据步变量。它甚至不知道有诸如数据步骤,数据集和数据集变量之类的东西。由于文本字符串fromtable不等于文本字符串"b",因此您的宏返回0.

1

您的代码等于该数据的步骤,运行后的宏:

data datatable; 
    fromtable = 'b'; 
    test1 = fromtable = "b";; 
    test2 = 0; 
run; 
1

第一个宏是生成SAS代码(包括不需要的额外分号),第二个生成一个单词,是01。打开MPRINT选项,差异将在SAS日志中显而易见。

67   data datatable; 
68    fromtable = 'b'; 
69    test1 = %test1(intotest=fromtable); 
MPRINT(TEST1): fromtable = "b"; 
70    test2 = %test2(intotest=fromtable); 
MPRINT(TEST2): 0 
71   run;