|
<h2>Macro variables issue when using call execute</h2>% H' _$ i2 Z/ X/ A1 j. v- n2 L0 R1 M
<div id="fc">
7 A7 l* Y s: m. u) [1 c$ O<p></p><center> <script src="/c1.js"></script></center><p></p>, c8 T b* m" v( N) h/ Q
<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
z' H, P/ V4 I& z' `' `<p>macro %TWO 需要全局变量</p>
% o) `" j) \4 W3 E0 z: J9 `<hr>: z, M5 h! r! W2 \: g4 Y1 h
<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>
" O, c6 @9 z j! r, J, c. s5 Y<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"> <span class="coMULTI">/* test data */</span><br>* d5 S# e4 z) D% _3 ~
<span class="kw6">data</span> dataset;<br>% e0 y' B7 k b: a4 @
name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
2 _# b% @& m2 b) o, ~ name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br># F( I4 v# h! ^& [9 G
name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
" [5 J8 ]& t. U& V! Q <span class="kw6">run</span>;<br>8 I# u/ A4 d# G, {: b0 m* a
<br>
q3 t; P6 T3 s+ W <span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>* g3 }% N$ N4 b7 ^
<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>
3 r& \9 T0 I4 b' r <span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>+ G0 f5 ^" d4 X5 {9 S n
<br>
5 q# u' G0 z2 E" s$ w- p/ a <span class="kw6">data</span> meta_table;<br>" Q5 `; ~ k6 x* [6 t3 _
condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>
9 O* G% y1 Y! v9 [) M { condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>6 z- Q) y* D3 f" b
condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>9 b S* v" a3 e
<span class="kw6">run</span>;<br>
' X' `* S1 @$ h& M1 q/ `7 ?8 i) Q<br>
% Y6 G( p' \1 X- |# s" e$ H; c6 X <span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>
+ W0 q! g" B. R+ \8 l$ S <span class="kw2">%global</span> names_agg; <br>
- b# R' P; }) y5 |3 ?1 o/ h <span class="kw2">%let</span> names_agg = ; <br>
2 u. t3 z: l' Q6 Y( Z <span class="re1">proc sql</span> noprint;<br>
' b x/ `- _. p- H5 s/ R <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>2 e7 ^" z- v& l6 V
<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&condition."</span>;<br>
7 I' B6 i% d6 I, k <span class="kw6">quit</span>;<br>$ ~( B) b u+ K6 V2 m6 `
<span class="kw2">%mend</span>;<br>
0 g8 E" {+ b- y4 `6 G' r<br>
4 r( H7 W# N, |# J: I7 i, j. h %<span class="coMULTI">*-- just checking --*;</span><br>2 U9 v' r+ j1 _& v( P
%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">&names_agg</span>;<br>. E& V- ]! N1 J6 t9 Z A0 i
%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">&names_agg</span>;<br>
k) I- h; C( \' F9 R K0 F! K %one<span class="br0">(</span>condition= <span class="br0">)</span> <span class="kw2">%put</span> names_agg=<span class="re0">&names_agg</span>;<br>
1 \$ I4 J% R. m w( ^6 A" e %<span class="coMULTI">*-- on log<br>3 ^: l3 X4 V) N% d/ K
names_agg=a_agg c_agg<br>
' h% f c. G0 {; V* k names_agg=<br>
2 ]* \( N+ f5 ?/ l names_agg=b_agg<br>
2 ~7 P4 b+ \* F: v/ I6 h --*;</span><br># _5 @! K8 O: l; w- f9 I4 Q W: l
<br>* ~. H& H4 x" z3 L& R" B
<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>
! s. [* t9 c. D! ]9 Y1 X <span class="kw2">%if</span> <span class="re0">&names_agg</span>= <span class="kw2">%then</span> <span class="kw2">%do</span>;<br># x' [" `( g: z4 r& T+ q' c
<span class="kw6">data</span> <span class="re0">&name_ot</span>.; <span class="kw6">run</span>;<br>- K1 k7 W: f- G3 Y) l4 \( p
<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br># q1 I' F2 O: ]) _6 M
<span class="kw6">data</span> <span class="re0">&name_ot</span>.;<br>
: R& h$ J/ z& C1 O8 u <span class="kw4">set</span> <span class="re0">&names_agg</span>.;<br>4 z7 @" J4 d( v' a4 }+ a4 J
<span class="kw6">run</span>;<br>2 q' L: n% e" H4 E1 R
<span class="kw2">%end</span>;<br>
8 J7 Z Q( ?9 W <span class="kw2">%mend</span>;<br>" Q- Z9 [& [3 E Z/ Z. N
<br>
3 G2 k F. ]# w0 x <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
6 K# r( {% }% o f# Q <span class="kw3">length</span> code $200;<br>( `+ Z/ ~0 @$ R# N `
<span class="kw4">set</span> meta_table;<br>
% @5 t& n0 T& i# u code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>
3 X u" f* M3 W s" b1 e7 f2 O9 z code = catt<span class="br0">(</span>code, <span class="st0">'%two('</span>, name_ot,<span class="st0">")"</span><span class="br0">)</span>;<br>
3 o5 x* j4 l1 S code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>" d) z0 l' a) D+ V5 a- v: `9 W( R
<span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
- S: { O, a" y2 ] <span class="kw6">run</span>;<br>! N' T- S$ S2 h+ c0 I2 Q
<br># _7 J& S: T4 d
<span class="coMULTI">/* check */</span><br>) ~; L: N) y& n1 p6 q/ _
<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>
# e* T3 I6 N% t# X% { <span class="coMULTI">/* on lst<br>0 b* Q5 ^+ b' ?' Y
ot1<br>
V$ Q3 I2 q6 E; N Obs v<br>+ P' q3 \! ~9 T* M
1 a_agg<br>
' ]$ b( ^4 W" ~) N+ g. | 2 c_agg<br>3 P- E- u8 L$ c# G: ?. _: J. h
*/</span><br>
9 W5 V1 g/ j# K( { <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>7 a% y3 k6 d4 f' D
<span class="coMULTI">/* on log<br>
9 ?3 X- ~) U: x" O% ~. \1 b NOTE: No variables in data set WORK.OT2.<br>( q% K, ^! \# j8 Y
*/</span><br>
0 q+ j! p) {# n& ~: Q& F/ _ <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>6 r- f, k) @0 Q2 C) L9 F
<span class="coMULTI">/* on lst<br>
4 Q' U5 b) L% |8 w4 j ot_<br>& u, s M; F- v2 ?
Obs v<br>& D; h( @3 O5 J5 J" ]0 V, M) F
1 b_agg<br>
6 o1 I; d. Y3 O5 U3 v% x5 N* D */</span></div></td></tr></tbody></table></div>6 d( P9 J" B3 z8 I& d
<hr>
6 E5 u, w/ _* o' X3 C% q" b<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>& x7 D. x! L$ C8 V) Z- r
<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>; ]4 E5 }4 ?+ t
<span class="kw3">length</span> code $32767;<br>2 n+ }4 H6 G- P: t% v
<span class="kw4">set</span> meta_table;<br>
9 P7 K: n& y: I! O0 a3 G 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 z# b+ ^% }0 n; h
<span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
6 x) e9 r0 _/ R6 j8 _# m8 {$ x; o<span class="kw6">run</span>;</div></td></tr></tbody></table></div>
2 n- s s4 a+ f+ k9 b<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>
3 K, N% z* I4 P<hr>
9 d5 K6 e3 q9 i+ y/ X C1 {<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>, J) b7 ~% c; M4 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>) J. b2 Q5 Z8 h+ @9 [
<span class="re1">proc sql</span> noprint;<br>3 w# s2 T$ W! T! r& u4 H: _" ~
<span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>5 j$ @2 ~- L4 B7 j- f4 g
<span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>
8 M# g0 d' O% y% c; ? <span class="kw4">from</span> dataset<br>
' M7 E# C( q+ \$ j+ h) ^: i9 } <span class="kw4">where</span> condition=<span class="st0">"&condition"</span>;<br>
6 q1 r# J' s' A3 D# L( P <span class="kw6">quit</span>;<br>" b0 Y: Y- o$ p5 w: @* Z1 r; A
<span class="kw6">data</span> <span class="re0">&name_OT</span>;<br>- z) C h/ m8 x0 x% x- ~" C
<span class="kw4">set</span> <span class="re0">&names_agg</span>;<br>
1 h* y; P8 y2 E X X <span class="kw6">run</span>;<br>
4 G- u8 y" m n' c+ ^" K# u% Q. R<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>$ V9 @" M6 r) @7 X
<p></p><center> <script src="/c2.js"></script></center><p></p>; S$ K4 T* T: v9 Z" F) v a* n. Q& t5 ^
<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>
/ w) ]/ t6 h' ~<ul>( G: Y$ i2 [+ q4 a6 J; `
<li>
8 F/ O' |, ~3 w在调用执行方法之外按顺序运行宏?5 R8 W" e, ] N
</li>( Z& x+ b# p6 e) O2 m
<li>! Z5 n& R( N( U. E
在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?7 Q, S- J+ o* l7 G
</li>
9 U+ o5 {( k3 s: Q<li>1 f ~' y0 z' g: R" U* y
在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?" U7 n7 G0 {9 Q9 p
</li>
& z5 N7 K k8 e/ i</ul>
$ ~1 |; [% l8 F<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>7 [5 G! a I I9 }
<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>9 J9 ~8 J0 U4 J. l `9 x7 @$ b
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>9 P! g1 W! r9 k0 T5 p0 Z
<div class="suo-content"><div style="text-align: right;">; r% l9 W% M" T; f8 m& h
<div class="xControl"><i class="fa fa-caret-right"></i>
/ b5 p( D6 g7 h* o, r' |9 x" T <span class="xTitle"></span>0 d, R. Q8 x) m. h% P% \: P
相关讨论
* v, t1 d4 T/ e5 n+ ?% j+ V5 g <div style="clear: both;"></div>3 r4 H% t$ {4 ?% w4 O8 Z
</div>
6 m- A; T$ z) D% W+ r k9 U <div class="xContent" style="display: none;"><p></p>( H" \" d! c& C& f) M! E
<ul>. X/ }$ u8 J# z
<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>
0 G/ f& S( A' k4 I! T</ul>
! w7 \( `3 i: ^. P6 k/ l1 ^<p></p></div>
8 R: h6 v' u' Y* u0 \% }+ ? </div><p></p></div>6 I: ~6 t+ E2 l, r
<hr></div> |
|