飞雪团队

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 10388|回复: 0

关于sas:使用调用执行时的宏变量问题

[复制链接]

9159

主题

9247

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
29807
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>& |2 L' M" @: c3 }7 p- E
<div id="fc">
: n) P- T9 N% W% i- K5 v0 [<p></p><center> <script src="/c1.js"></script></center><p></p>
7 r3 h4 T% X" }) z<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>7 C: ]* o* h; o" v, b2 m. O' E4 ]
<p>macro %TWO 需要全局变量</p>
& f* f5 h1 h( W6 l2 C3 G<hr>- L. O3 z' |. w, B( Z) N) T( _: x/ R
<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>
/ a6 O; n" B) N<div class="codecolorer-container sas dawn" style="overflow:auto;white-space:nowrap;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>70<br>71<br>72<br>73<br></div></td><td><div class="sas codecolorer">&nbsp; &nbsp;<span class="coMULTI">/* test data */</span><br>
% M% I2 U3 r1 Q- ?, N# X" v* W2 \&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>/ X- \$ j, s9 K9 W( c5 x% |
&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>, Z7 ?2 E1 Y  K1 b8 {) c6 L
&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>
3 S* s  B0 V" o4 F( B, A* z3 \# A&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>2 w# o: O( `2 Y
&nbsp; &nbsp;<span class="kw6">run</span>;<br>" j3 p2 A& Y$ m
<br>2 j- L7 ]( R7 B- c
&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>
+ a/ B9 [; ^/ `9 i3 U& H&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>8 F8 H1 a2 ]) a
&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>
( b4 V6 M6 T+ L5 U* Z<br>6 Z3 \# c, T, w$ q
&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>
) R7 {5 z9 N' D8 m/ S&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>
( B! Z8 t& C# Y& v! `" E7 j2 r2 s&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>5 T, F2 K7 p. [, A3 h
&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>8 H( d, ]  p8 N- l6 H  z# E
&nbsp; &nbsp;<span class="kw6">run</span>;<br>3 u/ E  ~3 ^- f) R
<br>$ M% L5 y7 c0 `7 B6 J& s2 O
&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>
7 @4 W( X4 o9 J, \9 C7 B" b& e&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>
' k0 h% i1 L' g8 J0 E- Y&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>/ ]$ }" Y% b0 r3 j: W+ D3 F
&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>
( L3 W4 l5 |: M1 U8 i&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span> <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>
6 m, G$ b" d5 X7 x&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>0 `9 l* v8 U, ~8 w# N: O2 E
&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br># n1 y: L1 \/ T) Y
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
5 S% Z( ?0 H- _$ G3 Y( m6 @<br>+ V3 m: J! C* H( U% R' z( S" s
&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>
% O, |8 Z5 x7 v+ H) B&nbsp; &nbsp;%one<span class="br0">(</span>condition=<span class="nu0">1</span><span class="br0">)</span> <span class="kw2">%put</span> names_agg=<span class="re0">&amp;names_agg</span>;<br>
& E- e7 ^/ g9 E# F! `5 O, O&nbsp; &nbsp;%one<span class="br0">(</span>condition=<span class="nu0">2</span><span class="br0">)</span> <span class="kw2">%put</span> names_agg=<span class="re0">&amp;names_agg</span>;<br>+ N: ?3 X  Z2 g. W
&nbsp; &nbsp;%one<span class="br0">(</span>condition= <span class="br0">)</span> <span class="kw2">%put</span> names_agg=<span class="re0">&amp;names_agg</span>;<br>+ k8 _/ f3 |5 E2 _0 S
&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>/ m: ]5 c5 i" g9 C/ j3 q1 ^  Q
&nbsp; &nbsp;names_agg=a_agg c_agg<br>6 w- s! `2 m  n1 ^/ K* G, q7 u& m5 t
&nbsp; &nbsp;names_agg=<br>
2 l1 `8 G$ L7 F' O9 `/ V&nbsp; &nbsp;names_agg=b_agg<br>
4 V5 H6 e7 d8 K&nbsp; &nbsp;--*;</span><br>
9 }* z6 Q& }& f  q1 o1 V<br>- a, k# ^9 r7 P2 q" }
&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>
% |/ [- a+ d( m9 N&nbsp; &nbsp; &nbsp;<span class="kw2">%if</span> <span class="re0">&amp;names_agg</span>= <span class="kw2">%then</span> <span class="kw2">%do</span>;<br>- M7 Y0 s; y3 c' P
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>
3 q3 O; M0 Z1 y* S, M9 X7 K$ ]&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>
5 d8 V2 S) \, t) s&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>, }7 j3 t0 W% i; j9 M- l. d; Q+ z
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>& L7 N2 P; e1 `0 m# F* P2 L
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>
- S, D4 ^. p) k- ]% O&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>+ G4 y5 ~7 s3 @
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
1 g/ ]! r' G$ e5 u<br>& }& ^2 G1 Y( E, I
&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>+ _0 V8 O: ?, F7 s# @
&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>) L7 D5 h5 p; `# H
&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>3 w( R9 T3 x; F4 m: J! r
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>8 F. T8 B6 C* K6 L4 W
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span>code, <span class="st0">'%two('</span>, name_ot,<span class="st0">")"</span><span class="br0">)</span>;<br>
7 Y! B1 T, |- t5 t! k&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>
( q6 R! M% o- ?  ?' t&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
+ `: T1 }) C8 T& @&nbsp; &nbsp;<span class="kw6">run</span>;<br>
$ R7 r, V/ {8 r, v+ E5 ~<br>+ }7 S  k; B; g% w0 D
&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>3 }, N% }1 \) T4 |' d
&nbsp; &nbsp;<span class="kw4">title</span> ot1; proc print <span class="kw6">data</span>=ot1; <span class="kw6">run</span>; <span class="kw4">title</span>;<br>1 M* x+ |' y9 i1 Q( c4 T
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
! A9 i" q! Z* L  m1 Y4 M&nbsp; &nbsp;ot1<br>0 n1 a% ]: P- w% e7 x$ a
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
1 z4 O2 R2 w  |6 R" d+ A+ u&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>* ]  S( @4 k1 u0 T( ^
&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>
9 x9 u4 z$ M0 D7 K/ E5 K&nbsp; &nbsp;*/</span><br>
( C' q& ~1 x" z9 f&nbsp; &nbsp;<span class="kw4">title</span> ot2; proc print <span class="kw6">data</span>=ot2; <span class="kw6">run</span>; <span class="kw4">title</span>;<br>
& a& N' w# e: n4 R( b0 Z&nbsp; &nbsp;<span class="coMULTI">/* on log<br>: ^3 h" `' r# G. D( q+ Z
&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>. t7 w" _  \2 J  N" m& r9 N
&nbsp; &nbsp;*/</span><br>" `! z8 K/ A6 `" |
&nbsp; &nbsp;<span class="kw4">title</span> ot_; proc print <span class="kw6">data</span>=ot_; <span class="kw6">run</span>; <span class="kw4">title</span>;<br>5 q7 {& ]4 R) T* \5 d0 f- j3 K5 H! e9 o
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
4 n! c8 O* ?3 S4 {- F  t, G5 M&nbsp; &nbsp;ot_<br>
; S3 C0 n. ]) H" V7 G. K&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
! ~5 S9 L/ G% A% L, f&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>
7 `5 U; k& r. {. Z( {5 U&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>) d8 T1 _% ]5 A( {4 g# S) i
<hr>
4 B( k8 P/ G2 [2 o7 e<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>
- b# b7 t) N  d! o7 n6 t<div class="codecolorer-container sas dawn" style="overflow:auto;white-space:nowrap;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br>2<br>3<br>4<br>5<br>6<br></div></td><td><div class="sas codecolorer"><span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
5 X/ y2 t! c0 t- Q0 \" p- k3 ^5 D% A* p&nbsp; <span class="kw3">length</span> code $32767;<br>4 T8 m/ i" k1 O* I# H% v
&nbsp; <span class="kw4">set</span> meta_table;<br>
& l! r$ Q( x" ]0 v) s3 ^&nbsp; code = <span class="st0">'%ONE('</span> || cats<span class="br0">(</span>condition<span class="br0">)</span> || <span class="st0">'); %TWO('</span> || cats<span class="br0">(</span>Name_OT<span class="br0">)</span> ||<span class="st0">");"</span>;<br>9 }4 G& A8 E4 }& `" Q3 H! N
&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>. y% p7 W# c4 b) V# l
<span class="kw6">run</span>;</div></td></tr></tbody></table></div># J2 V* `7 m) e& ^5 z5 W: h
<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>
, C' e, a4 V+ w0 p) B<hr>& a9 [" w3 Q6 d0 e* Q" x
<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>
4 {: {+ O0 o) i* V. d<div class="codecolorer-container sas dawn" style="overflow:auto;white-space:nowrap;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br></div></td><td><div class="sas codecolorer"><span class="kw2">%macro</span> TheOnlyOne<span class="br0">(</span>condition,name_OT<span class="br0">)</span>;<br>
/ O! k9 W* [8 O. |7 k&nbsp; <span class="re1">proc sql</span> noprint;<br>
" R4 b3 ?6 R, E/ d&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>3 p- O  T. i( k, r! I  _) W
&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>$ n7 V) N4 E4 ^* f
&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>" N) ?2 k/ R0 g' v+ X/ N/ ?
&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>
/ C, w& m8 U. {; g&nbsp; <span class="kw6">quit</span>;<br>6 U. A# [( I& h/ i0 M! A
&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>2 D' D1 k! f! s7 f
&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>4 r* S! s3 }4 R
&nbsp; <span class="kw6">run</span>;<br>$ E. I5 p% b$ i
<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>
/ X; z& p! p  T. I<p></p><center> <script src="/c2.js"></script></center><p></p>, ?2 Q& X& H1 B+ q$ e6 V
<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>
/ ]; Z! Y) C$ T% P- S7 P<ul>9 F+ z' Q6 C3 q
<li># Q7 `& ?' m  \$ F: z# k
在调用执行方法之外按顺序运行宏?9 }1 V6 Z% k9 r( U9 `
</li>3 g" o* s# W* C
<li>
- J0 F5 N% k' c. _( n- ^在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?
2 I. b3 C; A$ r- V/ c% d5 d</li>
6 a/ g' i( Y3 U  ]. Z* b<li>) z3 F) v6 w; S* _
在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?; D# K4 v  Z; n
</li>" z/ _0 k& R) T* [7 r
</ul>
% E: A  G# ~# `<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>
8 T0 T2 g' x. e: c$ Y0 ~<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>6 `% H; {" k$ U$ a1 a; o
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>
9 o3 T/ W1 C0 c) X4 c. b4 L<div class="suo-content"><div style="text-align: right;">
6 [6 o8 M4 a( R9 z                <div class="xControl"><i class="fa fa-caret-right"></i>
3 a8 ?, i: [0 D7 d) q5 e. U, p                        <span class="xTitle"></span># ~" i) M8 ~  A8 {; G. I
                        相关讨论$ F) @, r/ K' f4 H& l* S
                        <div style="clear: both;"></div>
! R% ~* ]- j( E* F5 `. b                </div>' \4 a+ _5 v  b% v3 _0 L
                <div class="xContent" style="display: none;"><p></p>. ?/ h2 y* ^% i8 N) q
<ul>: y+ @2 e0 c4 z" Q
<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>" A: I/ l* U! S9 Z/ v$ T8 }5 C
</ul>+ K9 c7 K4 F  S0 ~: Q- J8 U. |
<p></p></div>5 L  z- B6 z- t0 D( U
        </div><p></p></div>
" O' O. s" s; q3 T<hr></div>
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|飞雪团队

GMT+8, 2026-8-26 14:59 , Processed in 0.071296 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表