Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 正在解析宏变量名称SAS中包含%eval的宏_Variables_Macros_Sas_Eval - Fatal编程技术网

Variables 正在解析宏变量名称SAS中包含%eval的宏

Variables 正在解析宏变量名称SAS中包含%eval的宏,variables,macros,sas,eval,Variables,Macros,Sas,Eval,这是一个玩具的例子,以帮助我解决一个更大的问题。它主要涉及在引用更大的宏变量名时使用%eval()宏 我已经创建了一个宏变量x_2,它使用循环“it”的值,从最终输出可以看出,该变量已成功创建,但是我只能将其放入日志中,而不计算&it+1,当使用大于1的循环时,我需要这样做 它似乎先解决x_u,给出警告,然后再评估x_2作为一个整体并给出输出 我意识到这只是一个关于如何正确引用宏的问题,但我找不到任何例子表明它将求值作为宏变量名的一部分 谢谢 %macro testing; %DO it =

这是一个玩具的例子,以帮助我解决一个更大的问题。它主要涉及在引用更大的宏变量名时使用%eval()宏

我已经创建了一个宏变量x_2,它使用循环“it”的值,从最终输出可以看出,该变量已成功创建,但是我只能将其放入日志中,而不计算&it+1,当使用大于1的循环时,我需要这样做

它似乎先解决x_u,给出警告,然后再评估x_2作为一个整体并给出输出

我意识到这只是一个关于如何正确引用宏的问题,但我找不到任何例子表明它将求值作为宏变量名的一部分

谢谢

%macro testing;

%DO it = 1 %TO 1; 

data dataset;
    s=100;
    t=99;
run;

data _null_;
    set dataset;
    if s = 100 then do;
        call symput("x_%eval(&it+1)",t);
    end;
run;

%put "&x_%eval(&it+1)";

%put &x_2;

%END;

%mend testing;

%testing;
日志输出

MLOGIC(TESTING):  %PUT "&x_%eval(&it+1)"

WARNING: Apparent symbolic reference X_ not resolved.

SYMBOLGEN:  Macro variable IT resolves to 1

SYMBOLGEN:  Macro variable X_2 resolves to           99

"          99"

MLOGIC(TESTING):  %PUT &x_2

SYMBOLGEN:  Macro variable X_2 resolves to           99

99

MLOGIC(TESTING):  %DO loop index variable IT is now 2; loop will not iterate again.

MLOGIC(TESTING):  Ending execution.

您是否可以尝试
“&&x\u%eval(&it+1)”

将宏变量名构建到另一个变量中,然后展开该值要容易得多

%let t2=found;
%let mvar=t%eval(1+1);
%put &&&mvar;

实际上,SAS在调用%eval函数之前进行变量替换 最简单的解决方案是在前面的语句中调用%eval

%let xNr = %eval(&it+1);
%put "&&x_&xNr";
双符号and用于延迟
x_u1;&xNr
的计算,直到
&xNr
被计算为
2
,并且没有关于
x_1;
未定义的警告

SYMBOLGEN:  Macro variable IT resolves to 1
SYMBOLGEN:  && resolves to &.
SYMBOLGEN:  Macro variable XNR resolves to 2
SYMBOLGEN:  Macro variable X_2 resolves to           99
"          99"

同意德克的回答。但是,作为一种思维练习,使用引用函数可以达到预期的效果:

%let x_2=99;
%let it=1;
%put %unquote(%nrstr(&x_)%eval(&it+1));
所以%nrstr隐藏了&直到%eval完成了它的工作(我认为:)

更新:

@胜林在一篇评论中补充了一个类似的答案,我更喜欢上面的方法:

%put %superq(x_%eval(&it+1));

这是因为%superq()将宏变量名称作为参数(无前导&),而不是宏变量引用是不寻常的。因此,您可以使用%EVAL生成宏变量名称的一部分。如果需要,您可以%unquote(),但这不是必需的。

好主意,但不幸的是,这还不足以阻止SAS尝试解决&x_quot。请尝试%superq,方法是:%put%superq(x_quo%eval(&it+1));谢谢你,我一直在一行中尝试各种组合(类似于昆汀和胜林,他们实际上是成功的),我没有想到要把它们分开!谢谢,我太专注于试图在一行中解决它了,我错过了更简单的两行解决方案,但很高兴看到它是可能的。如果您只有一个编号的变量列表(值得我向上投票),则非常优雅,但如果您有两个列表,如
X_1
X_2
X_3
。。。和
Y_1
Y_2
Y_3
。。。