全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3833 9
2014-05-06
悬赏 50 个论坛币 已解决
更新:

谢谢大家的回复。

Global的确是解决办法,不过若是加了Global,那么我无论是在%put _user_还是在sashelp.vmacro中都可以找得到他的值。

我说下我最原始的想法:

一般我们在写一段程序的时候,像我喜欢在整段程序中加个很大的宏环境,这样就可以在一些过程步中使用例如%do,%if这些宏语句。例如:

data a;
   a = %if &type. eq C %then in;put( b , best.);
run;

但是当我调试整段程序的时候,我也许只想运行上面那个data步。

现在对于该步中存在的%do,我已经解决了:

复制代码

这样,对于剪切板中的一段包含%do的data步,我就可以直接用我的快捷键给他加个宏环境来解析、运行它。

但是,面对data步中有的%if &type.,我需要知道宿主宏中的type为什么值,而我建议在主宏中加上范围声明。

所以。。。

我有些奇怪为什么像data或过程步中的%do,在open code中依然无法解析。(所知在9。2中仍然无法实现)

故出此问,谢谢 :)
————————————————————————————————————————————————————
想请问一下,我能否从一个宏,或者是Open Code来获取另一个宏的某个变量?
前提是不再次调用这个宏,当然这个宏已经被调用过一次。

例如:
%macro a;
  *So many statements;
  %let a = x;
  *So many statements;
%mend;

%a;

%macro b;
  *How can I get the value &a. from Macro a?;
  *Likes in JAVA style &a.a ;
%mend;

%b;



我试过%put _all_,但是这个a是local的,不知有何办法?
谢谢。

最佳答案

pobel 查看完整内容

对于楼主的例子: data a; a = %if &type. eq C %then in;put( b , best.); run; 如果楼主把这个data步放到了宏里面,是需要“调用”宏才能运行这个data步的。 所以只要把和宏变量type相关的语句也包括到宏里就可以了。 如果只是把这个data步放到%macro语句和%mend语句之间,我只能想到两种情况: 1. 宏变量type是global的; 2. 宏变量type在“更外层”的宏中赋值,并且需要调用type所在的“外层”宏。(只调用data ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-5-6 23:48:28
对于楼主的例子:
data a;
   a = %if &type. eq C %then in;put( b , best.);
run;

如果楼主把这个data步放到了宏里面,是需要“调用”宏才能运行这个data步的。
所以只要把和宏变量type相关的语句也包括到宏里就可以了。

如果只是把这个data步放到%macro语句和%mend语句之间,我只能想到两种情况:
1. 宏变量type是global的;
2. 宏变量type在“更外层”的宏中赋值,并且需要调用type所在的“外层”宏。(只调用data步所在的宏不能实现,因为如果不是global的话,那type只能存在于其所在宏“执行”过程中。如果不调用外层的宏,那所谓的type宏变量根本就不存在,更谈不上它的值了)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-5-7 08:19:51
在最前面加一个 %global a;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-5-7 08:23:02
local的宏变量都是属于“寄生”的 ,只有所在宏被执行的时候才会存在。

而且,如果宏变量真的是”local“的话,那即便是调用这个宏,该宏变量也会随着宏执行的结束而消失。

%macro a;
  %local mvar;
  %let mvar=aaa;
%mend;

%macro b;
   %local mvar;
   %let mvar=bbb;
   %a

   %put mvar: &mvar;
%mend;

%b
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-5-7 09:12:44
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-5-7 10:09:22
AML中很多rule都是用你这这方法调用的。
对于逻辑判断和循环主要是编译器方面的要求,用于判断代码执行的范围和等级。如果改动,有很多东西都需要修改。。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群