飞雪团队

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

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

[复制链接]

8993

主题

9081

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
29309
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>8 ]$ ]4 i# O$ P5 s
<div id="fc">5 F$ V  M* d- k/ ~) |
<p></p><center> <script src="/c1.js"></script></center><p></p>+ z* }2 U$ N, A' E) h
<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>' O; y5 E! \8 A+ N9 \
<p>macro %TWO 需要全局变量</p>8 C( D: C8 e1 I
<hr>
: r4 t' I& N* }$ l: n( D( d<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>
+ C2 S$ g2 m! i! J3 B; U<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>$ P& b+ j, Z4 f. I5 N  Z* T# N0 K
&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>
% W6 }* G' v: Q* t" j: L, J&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>" W  z9 U2 l. g* U% N. u
&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>
/ k) q+ p" K  b- W7 ]9 h) u&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>& n% V+ d4 q% R2 J4 d" d0 S
&nbsp; &nbsp;<span class="kw6">run</span>;<br>% y# I) ]' e4 Q& F, w; X& z' T( x
<br>
. K6 D& ]" t# y, p) V0 v8 A&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>0 N, ?5 y1 Y1 m+ f
&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>
( m0 o, U/ B1 ]3 e; @. R&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>
( }3 u. m+ M9 z) d+ O- \- N8 w' q<br>9 H/ _/ W( P5 e6 Q4 S' w
&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>
9 w6 |( @/ X1 j8 q) D&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>
: P  D9 ]5 r8 w0 E&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>4 W/ ]4 B. a8 t" J0 L) x; h3 \1 I
&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>) W5 w( L( ]; l+ K/ ?
&nbsp; &nbsp;<span class="kw6">run</span>;<br>. |/ C2 U6 J7 m$ W( X
<br>
: ?* ]; Q. s. q0 B. a/ N&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>% j6 a1 M# ]' ?( i5 }8 v2 m/ y, f, b
&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>0 o- ]6 o# b9 m- Z: S
&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>
0 k9 L, {5 V: Y+ r$ |9 E9 [8 U. \&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>
5 a! g; W  `1 c&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>
3 O& i9 {1 g) R&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>
3 N+ R% `4 o0 a2 U& v  Z' _4 v&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>: X* H& ^8 M8 W* O4 h* p
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
8 _/ S) b' O4 Y<br>& p. U5 S# g& t5 I
&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>- L7 g) M# W; f2 R' s9 u6 d
&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 ]. i& @1 G3 Z0 K# d: `
&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>
4 Z" o+ K# [: I( s" D% \&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>
* m8 t& D. N- _* {&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>
$ u1 a# S# q5 ]8 ^. h* A, B: ?&nbsp; &nbsp;names_agg=a_agg c_agg<br>) b+ r* R/ O, i( L, b
&nbsp; &nbsp;names_agg=<br>
( u9 G( i4 m: R+ x0 v. W' s  }&nbsp; &nbsp;names_agg=b_agg<br>2 P: K7 U9 ]  N1 T/ u3 C, c4 o+ h
&nbsp; &nbsp;--*;</span><br>& X: ~& d& M( X( e' `
<br>- j3 O' r6 h% a8 `) O& O
&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>  \3 W0 c+ a+ \# c+ P
&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>
3 s- T) h7 _$ U# q. l* }&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>
  |1 M3 f3 A! |&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>/ G) \) j7 l4 o3 Q+ S
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>0 k6 t6 L$ {1 s/ v/ }) G
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>
( |: h4 E, V$ Z0 m&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>
2 M+ A% x+ ^( }, t0 l&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>0 y* K6 ^( k* \" J2 S) B# U! v% ^
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br># h! v' a2 }% ~0 C8 T
<br>
% E5 q1 `3 I& ?, g: o/ q" s&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
6 W4 ~: E9 M% Q* W/ e&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>
) }& F! q' l: [7 y9 D$ J&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>5 o9 O3 W! u8 t$ p, h/ {$ s
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>
" P! Q( l4 k8 {, B$ r' Y&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>* N. J2 D4 `/ E$ P  T  E
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>/ X4 @" `5 w: T, ]0 N+ @
&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
! I+ \! s+ J0 F; A; g& }&nbsp; &nbsp;<span class="kw6">run</span>;<br>7 |4 w4 k& j0 R  k, e9 b. S% v4 y
<br>% v- @, R; I3 K% {& |1 |
&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>
, z9 U! X0 B" h4 q&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>
' z' ~4 d# W) K: Z0 s&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
  x* z' t" H4 U&nbsp; &nbsp;ot1<br>" A( k4 J# c$ z8 b& T' P! P0 l( {
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>( n5 x1 b, ]& [9 L/ e) F
&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>$ A  V( b* X6 Q7 {% J  Q
&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>
5 U- `! L$ E% p% S- v! X/ E8 z&nbsp; &nbsp;*/</span><br>, F! X2 e! ?! z0 j, _: D+ ^
&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>
1 @: K. C$ l! J% y( V% D! v&nbsp; &nbsp;<span class="coMULTI">/* on log<br>! w1 {: M1 R# M
&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>
# |9 a6 Y! J4 M&nbsp; &nbsp;*/</span><br>
1 a0 x; v/ L) z0 N&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>. C9 Z7 }/ T4 K
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
2 r: g+ W, a( r/ C+ n7 U- \+ C&nbsp; &nbsp;ot_<br>" u( S( Q' @- K, T4 }
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>) L2 [; V/ N" C9 h$ b& R
&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>
4 C0 _; O# |" K% p/ Q+ m" N; ~&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>6 p! `" ], [# a2 r1 |
<hr># k$ a; ^2 A( \. \' s$ ^
<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>" s5 x; w# _) q
<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>
6 F9 J4 f0 @; I&nbsp; <span class="kw3">length</span> code $32767;<br>9 M2 s9 P5 v  E/ W5 ~2 B+ t
&nbsp; <span class="kw4">set</span> meta_table;<br>
& j- e3 n! Z+ M5 p( s&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>! K9 j: y; v/ g9 c4 B# Z
&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>  N! w4 C; l+ S' N: S" t  ?% |
<span class="kw6">run</span>;</div></td></tr></tbody></table></div>
) x* a& i6 y4 Z1 W5 }<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>: e7 T+ |3 l; B3 U" |  v; W
<hr>
. W* w: o( M. s- u+ }<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>6 h5 p, x5 v' S. x/ r/ F- j
<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>' g: t) c! P* k; R' Z5 m. B9 L
&nbsp; <span class="re1">proc sql</span> noprint;<br>. Y; S* V: ?. x$ K, t6 F
&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>
6 E/ s, Z7 H8 l# h, Y+ P) m) w7 M&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>
8 J  Y. \( f! T! q0 y' T9 l' i&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>) }4 e6 Y) b# V' B% D! C; Z
&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>
. H- S7 ]2 |3 C3 Z0 ]&nbsp; <span class="kw6">quit</span>;<br>
5 q9 _0 g2 z) l+ F) [&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>
6 Q% E7 N( n) P& e6 z&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>! t. b; i# C% J
&nbsp; <span class="kw6">run</span>;<br>/ J; W; V$ b& b9 {) f' x0 \* f& f
<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>7 j. G5 d0 E7 e  x5 X
<p></p><center> <script src="/c2.js"></script></center><p></p>
8 E; j- e" Z. g0 @<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>' B7 R% T# l  P3 }9 C8 Q4 K6 t. q
<ul>) V: |4 a$ \# M& h5 L" x0 Q( D3 R
<li>) k" W9 Q+ \/ X7 t9 c
在调用执行方法之外按顺序运行宏?/ l! P1 H- x1 p3 r, O
</li>" W1 z: ?  `/ z
<li>% A; B- q; h% y  _
在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?
# x6 l! u/ ]. I</li>  L: {& ?8 K! m; x" f' V
<li>
" E5 b! Q$ n& L" b+ f, k2 I在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?' c+ R" n: D2 R8 s* F
</li>
/ i7 [7 p0 z' l: |8 s* Q) S</ul>0 [: ]: M, C" `1 w, I; Q% v2 ]3 `
<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>
/ a  R/ Z% J5 y<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>- X) I9 A* v8 ?; T6 q# y
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>
5 C1 K( w# h! p4 I6 N<div class="suo-content"><div style="text-align: right;">
( n/ z2 w3 T* X                <div class="xControl"><i class="fa fa-caret-right"></i>% A3 l' P/ ]# i  o, ]) Z" z% _0 w) {* ^+ q) H
                        <span class="xTitle"></span>
5 I6 O% s% j# b" _) }                        相关讨论  m" X% X7 C; \- J
                        <div style="clear: both;"></div>' V) i/ D4 ]5 ^
                </div>  B4 l: Z. o* M: N, z" F# E7 J
                <div class="xContent" style="display: none;"><p></p>6 Y% h0 s" g* H( g
<ul>3 K5 V* Q' M, t- i( \
<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>3 f! y; k8 W2 t8 H
</ul>
8 l$ d4 C& z3 E3 }- ?& D<p></p></div>
2 W' F, i2 T8 g5 b        </div><p></p></div>
& V* e" Y. h9 o4 G( X<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2026-7-12 06:33 , Processed in 0.488287 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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