宏变量中的SAS分号

宏变量中的SAS分号,sas,Sas,我试图创建一个宏变量,其中包含一个字符串,稍后在数据步骤中执行。我遇到的问题是,我需要宏变量包含分号。下面的方法不起作用。如何将分号添加到此变量声明中 %let commandString=''; data _null_; set DATA; if decile =1 then call symput('commandString', cat(&commandString, " if p_adj >", min, " then decile_ =

我试图创建一个宏变量,其中包含一个字符串,稍后在数据步骤中执行。我遇到的问题是,我需要宏变量包含分号。下面的方法不起作用。如何将分号添加到此变量声明中

    %let commandString='';

    data _null_;
    set DATA;

    if decile =1 then call symput('commandString', cat(&commandString, " if p_adj >", min, " then decile_ =1" , %str(;) ) ) ;

    run;

%put &commandString 
加:

这就是我希望发生的事情。我希望结果是

First Part; Second Part;
但它不起作用

%let commandString=%nrstr('First Part';);

data _null_;
call symput('commandString',cat(&commandString,%nrstr('Second Part';)) ;
run;

%put &commandString; 

由于您没有提供可复制的代码,所以我对其进行了一些修改,以测试其功能

因为你想分配分号;对于宏变量,您基本上是要求SAS以不同的方式处理它,因为您必须使用一个名为-%nrstr的屏蔽函数,该函数在宏编译期间屏蔽特殊字符,包括&和%,以及常量文本中的助记符

EDITas问题已编辑

单引号在代码中的位置是错误的,单引号也应该包含分号,因为您希望也包含分号。 在call symput部分中,缺少一个括号。 修订守则

因为commandstring解析为包含分号的值;因此,为了使用%put函数打印它的值,您还必须屏蔽它,否则它将抛出错误。在这里,您可以使用将其视为字符串,或者在解析时必须使用%n引号来屏蔽分号

%nrquote-屏蔽特殊字符,包括&和%,以及助记符 宏执行时解析值中的运算符。
总体来说,你想做什么?最终,我想创建一个宏变量,它有if-then规则来组合一个数值变量。例如:如果p_adj>=0.025且pI知道这不能回答您的问题,但这通常不是进行重新编码/组合的好方法。如果你提供更多的细节,也许有一个更简单的解决方案。如果你想继续使用这个方法,我相信其他人会有答案。这允许连接一个“;”吗在宏变量字符串的末尾?我已经添加了问题。谢谢。当您执行%put&commandString;如果没有双引号,它就不起作用。你知道怎么纠正吗?我想我需要消除引号,否则我无法在数据步骤中执行字符串:数据a;B组&命令串;跑您只需要使用%str和%quote,除非您有一个包含&或%symbols的字符串,否则使用这些的'nr'版本就太过分了。我相信将描述与这些功能联系起来比将“nr”描述联系起来更清楚。
%let commandString=%nrstr('';);
data _null_;
%put &commandString ;
run;
 %let commandString=%nrstr('First Part;');
    data _null_;
    call symput('commandString',cat(&commandString,%nrstr('Second Part;')));
    run;
    %put "&commandString";
    %put %nrquote(&commandString);