Arrays SAS做过宏-向后

Arrays SAS做过宏-向后,arrays,macros,sas,Arrays,Macros,Sas,我在用电脑 我想用do over宏重写此代码: if mysequence > 4 then grammar_last_5 = grammar_last_4; if mysequence > 3 then grammar_last_4 = grammar_last_3; if mysequence > 2 then grammar_last_3 = grammar_last_2; if mysequence > 1 then grammar_last_2 = gramma

我在用电脑

我想用do over宏重写此代码:

if mysequence > 4 then grammar_last_5 = grammar_last_4;
if mysequence > 3 then grammar_last_4 = grammar_last_3;
if mysequence > 2 then grammar_last_3 = grammar_last_2;
if mysequence > 1 then grammar_last_2 = grammar_last_1;
所以我的翻身看起来像:

%do_over(values=2-5, phrase= if mysequence > %eval(6-?) then grammar_last_%eval(7-?) = grammar_last_%eval(6-?);)
%do i = 5 %to 2 %by -1;

if mysequence > %eval(&i - 1) then grammar_last_&i = grammar_last_%eval(&i - 1);
%end;
但这不起作用

有人知道如何做到这一点吗

谢谢!!
Adam

我快速查看了宏,看起来他们使用了宏引用函数,这可能会干扰
%eval
函数的执行


如果是这种情况,那么您必须自定义编辑
%do_over()
,这样它就不会这样做。如果是这样的话,那么这可能不值得付出努力。编写自己的一次性宏以实现您的目标会更容易。

对于其他想知道的人来说,这些宏似乎可以在这里找到:

不过你有个问题。您正在尝试将%eval(6-?)和其他函数(如文本)传递给%do_over宏。它将尝试计算该函数并将结果传递给宏,因为它在应该是数学运算的过程中找到一个字符,我猜它随后会引发一点骚动

更重要的是,实现您想要的功能的方法似乎不太可能实现,因为您需要在将函数作为参数输入时屏蔽宏编译器中的函数,但在do_over实际使用该函数时将其解锁到宏编译器中,我猜do_over如果不重写它的逻辑,即使你成功了,也不会理解你想要什么

请允许我谦虚地建议您使用自己的宏代码作为开始解决方案。比如:

%do_over(values=2-5, phrase= if mysequence > %eval(6-?) then grammar_last_%eval(7-?) = grammar_last_%eval(6-?);)
%do i = 5 %to 2 %by -1;

if mysequence > %eval(&i - 1) then grammar_last_&i = grammar_last_%eval(&i - 1);
%end;
这将生成您想要的文本,尽管您需要将其放入自己的宏中,并在数据步骤中调用它,因为它在其他任何地方都没有多大意义


如果你想得到更一般化的东西,你的手就必须弄得更乱…

你不需要宏来实现这一点,除非你有一些东西没有告诉我们

if mysequence > 4 then grammar_last_5 = grammar_last_4;
if mysequence > 3 then grammar_last_4 = grammar_last_3;
if mysequence > 2 then grammar_last_3 = grammar_last_2;
if mysequence > 1 then grammar_last_2 = grammar_last_1;
->


如果你能将代码发布到
%do_over
宏中,这会有所帮助。嗯,编辑似乎去掉了亚当原始代码中的“大于”符号……哇,非常感谢!!这是超级和完美的作品。我一拿到15分就投你一票。