飞雪团队

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

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

[复制链接]

8590

主题

8678

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
28100
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>
, N% d7 ?4 r7 ~; ]9 ^# w. z4 `<div id="fc">
* ~, ?2 x' F& @! [' w* O; s# {<p></p><center> <script src="/c1.js"></script></center><p></p>* x* w, I8 [2 P
<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
1 T6 n) b9 V& T! K/ p<p>macro %TWO 需要全局变量</p>
0 R0 n4 W  j) S8 \( S. j; T<hr>) v9 Y8 h6 I# P: o
<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>
! H$ r9 s: l; D& `5 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>
5 J8 V! s- v7 e&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>% Z# [: Y* I! m: D) [
&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
  ^% R( Q3 F0 D) Z' \&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>2 w' p9 F) f" k$ n' j% ~5 v
&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>4 q4 e7 ~0 J* y" z+ \
&nbsp; &nbsp;<span class="kw6">run</span>;<br>
" D5 x# i" d$ H, @<br>% U# U; E, G1 ?: T9 N7 G( n, e& x
&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br># C; ~" L2 |* h8 [/ `, R/ e0 H
&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>) M2 \% `8 X0 j( k; _, }( V
&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>
1 b, O8 U- m' W) D! K2 k# \<br>
+ @. z1 k4 K. A  g) y$ W! N&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>
6 Q% K; Q6 L. j( E) c  w&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>
8 V6 \" E: R$ w: b&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>8 V' ~$ _% G1 ]# ?: ]
&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>
7 j6 d' Y( u3 U# ?+ G&nbsp; &nbsp;<span class="kw6">run</span>;<br>
. s4 k' L! b, D9 L<br>
1 E8 W8 K. B: z7 B&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>
) s, k+ P8 A% ]% e! h- U: Q$ q( p&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>
# y2 |" m0 ^5 f" L" d" R6 @&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>, m( ^# m: N* k3 l, A' T1 ?+ \
&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br># \) j6 `0 P: z, _
&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>2 ?- Y# |5 A8 I* \: @( d
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>3 b- w8 k2 P! R0 U# s7 v
&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>
, F. q+ K. `) K9 U7 a9 w9 U& v&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>( _5 ?" }* l4 v2 o
<br>9 p9 _' F; S$ S3 b( w5 a
&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>5 d0 i) s6 f! ^* a% U
&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>
' F9 X- `* `2 h& k1 j3 R&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>2 S9 i# m. E, ]. f
&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># q$ v. [1 C- F- Q0 w* A
&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>, u3 [6 ]& s) d0 X. ?8 i. Z. R# q4 O
&nbsp; &nbsp;names_agg=a_agg c_agg<br>. E4 U; I/ R* h/ |
&nbsp; &nbsp;names_agg=<br>  D* n4 }( O  |- Y2 Y2 H
&nbsp; &nbsp;names_agg=b_agg<br>
0 _& J0 K/ u1 I&nbsp; &nbsp;--*;</span><br>
2 d/ F) a# G7 l( `! ^<br>
: V0 L4 i% Q' w& n  W2 U8 b6 B&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>
/ u7 X1 a/ r( d6 I" B8 W4 J4 W&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>: n2 b2 h; C) X9 a6 I' H6 g
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>
; {% O+ `3 s6 B+ C* a0 R&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>
' K" p  z; x2 x- K$ a&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>
4 g  e, c  N/ ~2 H&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>5 ~( k( _7 j4 p: h$ O
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>- B) ^% q! m6 U9 Y6 y9 ^3 c
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>
) h1 o) z1 Y4 u" o' O( V) o&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>9 B) Z8 {& c! p0 D7 q3 S$ A
<br>
( Z, U7 w0 @- E9 l4 U/ B) u&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
# a( t% U$ _5 y&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>3 h  ~5 S6 C% [: v$ n7 Y
&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>
; e# T( D# A5 t0 O! f  e&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>" `9 S; }* b! Y3 m
&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># `5 b3 ^. i, o5 |- V+ _
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>
# f: g) ?$ K* _6 x2 j% Q: F2 b&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>. y) C  E$ ~0 U# i% J
&nbsp; &nbsp;<span class="kw6">run</span>;<br>) C8 L3 J5 d; X6 z" K/ m% Q' a
<br>
1 }# d6 Y/ a# v2 f* V3 }&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>
% x5 ~+ s3 \/ ]7 q1 h- m8 c8 i&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>
( J4 f# v  B0 J) N8 G&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
- J* d5 r( q0 q0 K&nbsp; &nbsp;ot1<br>
- o% g+ }9 n/ }5 u7 S1 l, {! ~9 U&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>: P8 o& {7 _$ K1 u- s& }0 z
&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>
) s! Z# [  J) L" d&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>
5 `1 B8 s$ R: |4 H% R, l&nbsp; &nbsp;*/</span><br>
/ N. V7 k7 d6 o9 k3 f* W3 L0 @&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>+ n1 g& U( N' e
&nbsp; &nbsp;<span class="coMULTI">/* on log<br>
; o+ I5 u4 O" @2 U0 T$ f1 v&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>
, C. Q5 O; G; J% K  l3 L&nbsp; &nbsp;*/</span><br>
( \# q- S; T: l&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>9 z9 K* J7 b# @9 j6 ?* G- q
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
* Y, L" X$ Z6 T# ^&nbsp; &nbsp;ot_<br>! F! _7 s# q8 a/ G  c! y
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>4 r: i* A4 x5 w8 z+ K4 s0 \- J
&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>
* U/ q  {3 p+ w: l3 `! C&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>
: }  F1 `6 }  P<hr>
, Z7 s$ n. @1 A2 t9 i( J* b<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>9 J+ X, P+ ~# R$ n4 ]
<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>/ I2 k9 m6 y6 c) p0 x, Q5 q/ i
&nbsp; <span class="kw3">length</span> code $32767;<br>
& _: C- a" q/ m- V3 d! R, R/ m0 y- c&nbsp; <span class="kw4">set</span> meta_table;<br>% n' ]) V, [6 N5 K0 ?2 r
&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>6 r' g' t/ v$ C3 d# |4 w; d1 \2 d
&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>( i. F; o: [6 q( T* s) B5 z2 f
<span class="kw6">run</span>;</div></td></tr></tbody></table></div>
4 A0 S/ o( D4 Y2 D<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>6 \9 T: |* ]3 L5 \' M( K* f
<hr>* ^7 L, g, ?# a- n, s
<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>
  j  H7 V4 K9 [, o" G<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>; w8 q# W" t/ ?' O
&nbsp; <span class="re1">proc sql</span> noprint;<br>
" c$ s1 f, e  T- k4 c4 T& H&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>: Y. i, m8 @$ H& }" Z: H/ h
&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>
3 y; `7 c  ^5 J0 w&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>
* l7 d: [% J3 e/ S! j7 _&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>+ r( \! ]1 u$ g9 o( {5 W2 s
&nbsp; <span class="kw6">quit</span>;<br>
1 w- ~) k, @9 R) P4 R" X&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>3 {1 b% T/ `' t2 ~5 d
&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>: y7 r2 j6 p: J  Y- Z7 J- F8 y* _
&nbsp; <span class="kw6">run</span>;<br>- p0 O; b( C; w7 i3 i
<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>
  `3 R9 ~4 ?" K6 k2 a$ I( i<p></p><center> <script src="/c2.js"></script></center><p></p>
) [# ^( f4 ~8 c5 h$ ?<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>
8 a0 @3 ]0 \; C7 s<ul>/ y& y' U" t) I0 |# |
<li>
" `4 ]+ H! O* Q4 ~* W7 L在调用执行方法之外按顺序运行宏?
8 |# o6 }% o4 x2 ~</li>
( s% L& k7 t. [( d- }5 F! {<li>
6 _, Q% N- P" R6 ?. p+ c在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?- `8 ~3 p* _/ x$ h( @$ d
</li>
, f/ ?- d. A" k2 {7 S( n+ L4 W, o<li>- M: K9 Z/ p9 m3 V3 U
在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?
; x! e& }/ x& [) ^9 ]</li>7 u4 F8 d, p7 |
</ul>% z* J# X1 x& A
<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>1 p4 T: o# U; C
<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>6 [2 F; o) d1 ^4 v( n4 G
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>
5 H8 T" K8 {1 R<div class="suo-content"><div style="text-align: right;">
* }1 ?0 f' Z. v. O( i: |                <div class="xControl"><i class="fa fa-caret-right"></i>4 c" L2 b3 w# X" z  e; w0 `
                        <span class="xTitle"></span>
- P: S9 I) X& B2 r/ r                        相关讨论+ u' t4 L  D4 L+ k
                        <div style="clear: both;"></div>- ?) h. m- N: C, L7 \" \8 Z
                </div>
* v' C% m# }( G0 Q  c                <div class="xContent" style="display: none;"><p></p>: B/ d- ~' t; f2 ]9 }
<ul>6 C1 I3 ?+ Q- u! P
<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>
) f/ n& F) b- C! c) g8 [</ul>
2 k0 l1 z5 v3 L* j: X& n<p></p></div>
: T% V2 ?, `) `+ u. J        </div><p></p></div>
: ^. G7 g, O1 x. U<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2026-4-30 09:42 , Processed in 0.298938 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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