飞雪团队

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

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

[复制链接]

8242

主题

8330

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
27056
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>
" u7 G7 ^+ V. O, ]. Q<div id="fc">9 ~: g! F) i6 }% l
<p></p><center> <script src="/c1.js"></script></center><p></p>6 y* P( x* I" \8 H
<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
* c8 P  ?! b9 m8 [) _3 }<p>macro %TWO 需要全局变量</p>
/ P1 o' w' X; z/ F4 `' r<hr>
% ^3 d+ N/ O- \" I8 f<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>8 V( [* a/ K/ }; B, x- u2 x
<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>* j, M0 d8 R7 i& l6 D7 W
&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>' r3 I2 |8 H3 ~! i
&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
5 T! j$ y9 D! o9 J- O" R% g( T3 m&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>3 ^" F/ V4 F( E& z/ C. T0 S% U
&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
% B) _8 {2 u3 m( l8 r/ T9 m&nbsp; &nbsp;<span class="kw6">run</span>;<br>
- n! ?% y3 u6 f+ [% L<br>
/ Y! o* x' Q- N3 h! ^9 G2 `, S&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>/ s3 }1 q* `& z1 }' t5 @
&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>- u5 u* P8 @- w" r3 A) r5 l
&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>
9 m) V$ n( V  S: W<br>
! \; k. j4 X- i, A0 X( G8 Z&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>
: M" U* x! e- K5 U% h; l. X1 t&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>
. {2 @- G: Z" s9 L# b' o- ^&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>. k  f8 f: v7 z0 {
&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>
' m- I2 X( x& O% n4 c&nbsp; &nbsp;<span class="kw6">run</span>;<br>* S) h" B( y, v5 P# Q
<br>: `0 f7 e$ W/ K8 u' z7 f
&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>
: I) N1 G5 ]: ?( {&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>
; B7 [( w3 g( a( K&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>% h- H. i1 j  [/ V- _% m
&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>* ?& C( h+ [; y; L8 H6 x. |2 I! A
&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>% M# L* l) D+ U/ }) X; j
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>
% y/ L' B2 \, A&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>
; U. `+ N% s- \& O/ @&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
6 W; h+ v9 {* M. y! ^8 i<br>
/ Q* [8 ^5 R+ V; `- v) T: f! v&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>
# U9 W% S7 O6 X2 x; {; |! O&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>
2 Q# l+ L* r) u! l  l( @&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>! X* U$ G) ~- n6 @
&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>
6 l& M. ?0 ]0 F1 k. v* p& f&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>
2 x. V6 Q% s6 `) y9 Z&nbsp; &nbsp;names_agg=a_agg c_agg<br>
( k: R" G9 A5 e1 Z6 W# k9 y&nbsp; &nbsp;names_agg=<br>
$ v* l3 b* S5 D3 D&nbsp; &nbsp;names_agg=b_agg<br>
5 e" b9 ?# e3 w3 d&nbsp; &nbsp;--*;</span><br>
; }8 G" g% V( B* R" N<br>
" o& p/ J6 C) G&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>
4 C& l2 }4 p- G) e4 W( L/ }&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>
2 T8 K. H" t, M! X&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>
2 p  l  H7 p3 k2 |, S, A5 q8 S" B&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>' T1 h/ l4 R  l9 w' }1 `5 u2 r
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>
, f# R/ g) y2 ]# H. f' J&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>
* m5 s/ u) V2 e/ W5 p&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>
6 D- G4 d6 c! O( A7 X&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>7 K; D: t  L5 H" f% J( m! {1 B
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>! U+ k+ L+ |% x+ f. Y' g4 W
<br>7 E4 Y1 t, n5 e' U, v
&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
/ K  E5 e7 ?0 T  P&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>* S2 R! l4 P( Z4 k% [; ^
&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>
  o7 V) D' y3 Y5 g0 c&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 ^/ m, f5 H+ i) a&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>+ s8 `# Y: g& D  T# Z: L8 b. F
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>
: S, l/ y0 V& [9 m- c&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>% G; w% x$ \/ S
&nbsp; &nbsp;<span class="kw6">run</span>;<br>7 ?! k7 Q) o1 G
<br>
: L# ~1 k( N& F" q! }8 I&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>
( b" ]( P7 A9 Q( w- m( ~&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>0 [- Y* P& e! i, e' J
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>+ s: Q5 c* m% y' j5 s5 v
&nbsp; &nbsp;ot1<br>( C, m% D5 R/ ]. x& n$ i, V
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
7 J; a9 y) j: H7 c& x&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>
7 U0 I" ?3 ^. K0 X. r&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>; q/ V, {1 F+ ^% r- h  z# R5 o
&nbsp; &nbsp;*/</span><br>( X; [6 N# d' C: q
&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>- C* A( B( H. Z( A' N) y
&nbsp; &nbsp;<span class="coMULTI">/* on log<br>
- d% W2 Z7 r1 M&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>
3 p# b* v% q6 B/ R9 F&nbsp; &nbsp;*/</span><br>4 a+ W4 a- p0 s# C4 X2 f1 H; r, s
&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>
; y: r# \# @5 |& }&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
. \* p0 O6 p2 u4 X6 F$ a! f&nbsp; &nbsp;ot_<br>) r7 ~9 ?- H. g. o
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
' u! V+ ?4 v# c, a9 E! b; `3 |( R&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>" ?4 c7 J" L' W! S9 N0 k! r
&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>
& T/ n2 m5 p! x# O/ r9 |0 i<hr>, b  Z- |5 s7 v) L, u& t$ W
<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>8 |; R5 J) ~  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></div></td><td><div class="sas codecolorer"><span class="kw6">data</span> <span class="kw1">_null_</span>;<br>9 ~$ h& q6 p: M$ A( v
&nbsp; <span class="kw3">length</span> code $32767;<br>' A0 `$ H5 h$ m  o# P% g3 t
&nbsp; <span class="kw4">set</span> meta_table;<br>0 z( j' K# z0 M, N' u, `: H
&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>% R1 }4 q3 [  Y$ q6 `# o9 G( o& {
&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
) h: x; V; B' ?% O<span class="kw6">run</span>;</div></td></tr></tbody></table></div>. ^$ I; B7 N! n% T. V2 h
<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>; }3 R: p1 W+ H& Y1 X0 v5 G9 p
<hr>$ y7 g) r" A2 J: d& F
<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>
7 F3 I8 k! j5 ]/ z* P+ ?; O<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>& X- j' U+ q/ k! h
&nbsp; <span class="re1">proc sql</span> noprint;<br>6 e. p  a) W5 e! v- r4 j
&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>
" c5 \; j1 L2 Y' w! t0 ?! ], H&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>
; ?9 }) |, J% g- [; m' U&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>! e! L- o" o7 }+ n* ~1 B
&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>
3 k3 I7 }% s% }/ o) W8 Y&nbsp; <span class="kw6">quit</span>;<br>: m& j1 w1 s# b! i* z! M7 |! B! r4 `9 e
&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>
) I! \% Y5 D( Y&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>5 [8 K1 k* r* y( j
&nbsp; <span class="kw6">run</span>;<br>' f7 L5 x/ o( s- x
<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>
" m( Q+ D. y5 L7 Z3 x<p></p><center> <script src="/c2.js"></script></center><p></p>
; _6 F* N% b  @<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>
* v0 l0 M( H, F5 U/ I<ul>
; H/ i, I, Q  C5 ?- |. j; }<li>9 S# P; b( @3 i8 Y: s1 d  z
在调用执行方法之外按顺序运行宏?
. y* c5 j; w& q) M</li>
2 A+ Q  `& p5 j2 ~<li>: d2 f4 C, f' g6 T2 L) y7 _, N, B
在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?$ l9 r, K5 r% U( u1 m/ C2 G, f
</li>
0 L0 [! k/ `7 t2 U6 j) o% }<li>8 r: z% M" S, y) A: K, t6 ^8 y
在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?
% K5 ?+ \; h8 X</li>; K6 S! Y* N2 Y' s) N, B
</ul>6 n# b& J2 b, d  `' C" Q
<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>
9 Z+ X* W4 N- \# I3 Z<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p># ?4 A; T" |8 h6 H
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>
, G/ s. M6 R" M1 S8 G<div class="suo-content"><div style="text-align: right;">
2 w/ N- _& r7 r4 i/ |3 J                <div class="xControl"><i class="fa fa-caret-right"></i>
& I& \& X0 _2 N# c& v# U( Y  S( |                        <span class="xTitle"></span>  N4 y% J) Q. h5 i# Y4 z0 H
                        相关讨论  J4 q" O6 g3 h) E$ }4 x  l
                        <div style="clear: both;"></div>
( w) S+ b* M8 z" m( [2 y) t9 a                </div>+ p+ E, v: s' O
                <div class="xContent" style="display: none;"><p></p>: i: [. v/ Q: Z& g
<ul>
8 |) k' a2 H* |: R" M0 p<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>9 I" K3 D6 @8 {
</ul>3 i! y" _" P; i  B  O+ c
<p></p></div>; d4 Y2 Q& J* g" g: t1 b
        </div><p></p></div>8 }/ v- p* }# P  V, N6 Z
<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2026-2-26 22:49 , Processed in 0.083156 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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