sas 宏字符串比较不等同于相同的方式

sas macro string-comparison does not equate in the same way

这个宏字符串比较对我来说以神秘的方式工作。对我来说显而易见的是 %test1(intotest)%test2(intotest) 的结果是相等的。

%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() 相同的结果并且仍然使用数据表中的信息作为输入?

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

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

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

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

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

第一个宏生成 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;