飞雪团队

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

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

[复制链接]

9321

主题

9409

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
30293
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>  z7 Z2 g3 T: A- ]1 ]4 Y
<div id="fc">5 @4 I) Q7 h5 v2 {. i
<p></p><center> <script src="/c1.js"></script></center><p></p>- X( G1 ?: n/ Z# e8 d) N
<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
5 M4 g0 F$ ~9 W: s" C<p>macro %TWO 需要全局变量</p>6 f# P% Q# Z; _* ]: x4 E0 Q
<hr>
( d; J1 ^& N4 F# h; v% n- ]. k<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>
7 J$ m7 ~4 K# V) W<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>
$ ~2 w5 C5 }9 x9 L8 A  Q6 ]# T&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>
5 M" {9 a8 N1 |8 z; v0 A9 N&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
4 Z& S3 N4 [" C) G5 E4 r: F3 O$ S" n&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>% {. R% t# e- N* {) t$ d  f9 L6 Y
&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>8 \8 v& _: _% g. l
&nbsp; &nbsp;<span class="kw6">run</span>;<br>
# O. g8 C3 V" A! I$ m4 \<br>8 u; T3 M1 ~! F
&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>
& ]( p. a! J  r. l, f/ b8 d3 O% Q&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>; `  a) W9 K+ I; Q4 Z7 [
&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>3 t6 x% V& n/ h' G9 `9 @' f/ x
<br>
$ K" ^, v* I$ z( w8 S( L&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>  O. P/ g2 J6 C5 y2 {
&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br># p; |; Q  |; N; \
&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>: ^1 r8 E) I+ Q9 ]6 A; W
&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>! r! x. `4 V) i& U
&nbsp; &nbsp;<span class="kw6">run</span>;<br>" h5 H6 |* f+ n; P, f
<br>
' K# M% N: G& |& O( j7 _- f&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>
! b" Q* j0 }' u$ g. ]5 W&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>" K# c9 b) S  Q- t3 ?! f  W
&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>! n* z+ g" ^: d$ ~% J
&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>- {# n+ ^4 N( l( H& R  [! v4 v
&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>' z, c3 ^5 k3 @* k& _7 k- a
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>
4 P2 f1 |% t$ a5 m&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>
: ~8 Y4 R6 M# B&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
; n4 \# P6 g: D8 w4 r6 M) W<br>0 `& f. g, w1 C
&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>" R5 }! B. a0 h# }% ~! i- K
&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>
3 w' Z5 z' e3 z0 B. y+ [: ~&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. p( n4 ~( B' o7 r, j
&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>7 q- f) Z* G* a1 Y$ g2 `4 T
&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>
5 f7 l5 z$ M5 y: D: x0 b* v- `7 c&nbsp; &nbsp;names_agg=a_agg c_agg<br>
/ V; B/ c# C- a) b! X: R. U&nbsp; &nbsp;names_agg=<br>
5 c4 z7 n1 O: G8 H; c) O3 Y&nbsp; &nbsp;names_agg=b_agg<br>+ e) O& K% ?  F) x
&nbsp; &nbsp;--*;</span><br>
1 ^- h. h$ w* ^4 Z+ z2 s<br>+ b% v# C/ J7 \
&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>" N) M, T+ s( O1 G3 K/ K0 l  G, _
&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>
' D$ }, u* S, B( W! _&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>1 {& K. J; R* E* N7 X( m7 k
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>' g: G5 ~! c8 n" Q% f6 J; Q
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>4 a' `- z7 y' R( i4 K9 r& b( i; \
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>
, B  O& j4 A/ H. }# m&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>
" i/ h9 F- D3 Q( ]: y* q&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>6 C7 u! o2 H& J6 p' h" |/ x/ h" }
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
9 d5 ^9 l+ ^4 V# Y$ E" a( a<br>7 T5 ~  j, b2 U! q/ T# y- f! h7 b3 ^
&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
2 K" Y1 ~& o# m  X; G2 V&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>* v5 h9 h  I) P6 t# Q$ z+ M' ~- J
&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>
- W  `8 g3 [( v&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( R/ ?% N  A, c&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>$ s+ k+ O5 }- N0 A+ Z' M
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br># v! P! U1 c0 l5 Q$ T# J
&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>& }1 ~. R7 \1 r' z$ e
&nbsp; &nbsp;<span class="kw6">run</span>;<br>% n  Q& v& ]& e! _7 Z7 J  z" p, L, i
<br>
9 y( h2 q' T2 M* h. K# [" P&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>
- n& B4 N+ S5 j/ {&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>, ?% a& r  I3 f
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>! v3 P/ ]) d+ z! b' }7 ^) J+ I' g
&nbsp; &nbsp;ot1<br>. A8 U, u7 K4 r
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
7 f( x# E7 G1 q% I3 t+ m&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>& C2 k% ?! t7 a! I' d6 w0 i
&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>, P! m& j+ s  H$ c4 W) {4 O. _
&nbsp; &nbsp;*/</span><br>
* L8 t$ K2 T' X% @" V&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>
! K6 ?9 H- }. a# {* B&nbsp; &nbsp;<span class="coMULTI">/* on log<br>& c4 ~$ [' ~- z6 G
&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>
8 q6 r- h; |  [7 y&nbsp; &nbsp;*/</span><br>
! O5 E3 T% w8 \. ~. k&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>  a# D3 r: F1 k+ z' ~
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
; x; h  W' N. E+ b8 ~( h&nbsp; &nbsp;ot_<br>: n0 g2 R  }5 g" W; X, f7 T. v
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>- b* p+ G* F  A) R( ~
&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>
, C3 H9 G2 t) F# e' g&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>
- _: |9 \) W2 c, M5 V- O! @) N<hr>' b' r" m! A5 ^9 N2 X" n  O
<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>
% Y. A( J# m' f3 ]<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>
; z. _) v; F0 ~# b# v8 Y&nbsp; <span class="kw3">length</span> code $32767;<br>5 p" \/ Y, u+ D# V: I! K5 `
&nbsp; <span class="kw4">set</span> meta_table;<br>/ |% I3 @; d% g; m
&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>
5 `2 N2 C( I8 f9 C9 v! J& `&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
/ a5 W/ y4 L" ?! J: Z<span class="kw6">run</span>;</div></td></tr></tbody></table></div>/ S3 N9 `; i% e0 ^0 D. a" x" A/ I" x
<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>
& }0 a7 C0 Q8 l6 W+ O+ _* M! Y5 y<hr>
* @$ K- c5 B, O& |: ?7 u5 L  ?8 Z<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>$ @2 @/ t  S& u; L1 x; F
<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>
, j1 }: q+ v# B- ~5 e7 a&nbsp; <span class="re1">proc sql</span> noprint;<br>% o) Z) s  |" H8 Y6 ?0 \# C* W% y
&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>
" O& h, |$ l2 W7 J) ?: z$ [! x4 c&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>( F/ v& W: r3 D8 u
&nbsp; &nbsp; <span class="kw4">from</span> dataset<br># D1 N0 c; U0 W
&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>
) h: D( |% P' \1 Z; K. b1 [) U&nbsp; <span class="kw6">quit</span>;<br>0 v, M) ^  _' N7 a* m5 x
&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>
/ p9 B7 ~  I: t* G& o+ h&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>% K9 D) F" w4 R' i% a' y6 j( I
&nbsp; <span class="kw6">run</span>;<br>
( r& O9 r6 p6 H* Q  U7 q( E<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>% F  K" s: y& [& {
<p></p><center> <script src="/c2.js"></script></center><p></p>
0 H9 C" |" e7 @* x& k<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>) |1 C/ d# k" V; B* ?' W
<ul>
* D1 v* D! q8 Z<li>+ q+ A5 y; J# _& G9 G# c
在调用执行方法之外按顺序运行宏?
8 i) d% d* Z6 T</li>. c. F# L& o" g0 c4 a
<li>  Z% ]; B7 U/ y) i: Q! f
在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?5 F7 F. |8 g$ V
</li>
2 `- F9 g+ E0 b, f6 Y, U<li># I4 b; l# r7 s5 B" d0 O
在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?4 [: O# c3 W& Z$ c0 i6 T: a: s
</li>
- d- [$ {( N7 }</ul># g) w& O3 P9 `
<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>! W- Y  L) W" K. \6 s* A2 D
<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>
% {% d- b/ ]( O( \3 d<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>
/ c3 o2 X+ }6 d8 S. y( x<div class="suo-content"><div style="text-align: right;">' P1 U- L7 u9 ~( S, r
                <div class="xControl"><i class="fa fa-caret-right"></i>1 K# J- a3 l2 w& \3 N* n0 t  t7 ?* |5 Z
                        <span class="xTitle"></span>
) |$ n" I$ O* M, [$ r                        相关讨论
! ~$ w! Y" Q, ~* p                        <div style="clear: both;"></div>/ B' k# H  i2 Z, A0 C. U
                </div>
5 C% U2 C( A0 S& p                <div class="xContent" style="display: none;"><p></p>- \3 R% m5 ~8 ~; C, s6 K1 O
<ul>
( D( g) `5 K0 I<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>1 c7 ~0 \0 F1 ^& q
</ul>
; \% v: U- G0 U: @<p></p></div>
$ y( h% j+ a: _$ Y        </div><p></p></div>
  v! m9 ~- C1 B/ P- p* S<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2026-11-5 14:51 , Processed in 0.489012 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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