飞雪团队

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

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

[复制链接]

9159

主题

9247

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
29807
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>
9 k2 z% A( b" X; L; M<div id="fc">
- t$ P9 K( n8 `" M4 d<p></p><center> <script src="/c1.js"></script></center><p></p>
! M2 h6 m' F! N- f; ]1 b$ [<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
/ T" |1 H; q% d7 N# T2 m# ^<p>macro %TWO 需要全局变量</p>2 i- g4 n! C6 @7 D9 c0 n6 A
<hr>
( H/ B2 N; N( i5 O<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>/ l- r+ H: I( ^
<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>
) E! D! s$ m- M) B0 d&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>
. e" f: j! f* _( r3 U) l&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
) `# Z9 Y3 O, h* p&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>
& W5 g- R. h0 z3 S& m&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
$ q$ W# I7 M# Y+ m' t&nbsp; &nbsp;<span class="kw6">run</span>;<br>
- r  O, {  y7 b( O<br>
' ~  E1 m% W2 g+ C4 L&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>1 N2 z9 H" Q! q
&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>& Z, n0 u8 w0 L, j
&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>6 {0 w# e8 e$ R0 s7 E1 t! U
<br>
% }3 d* }. J! M7 g8 e  |+ H. U9 g, e&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>
3 w! D" n6 d2 c. e. I% d+ j&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>
' m% L% Y1 V* O  i: A) H) e/ f&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>) Z3 ^2 `9 D7 }
&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>
2 J- g  g9 S; r2 F5 ?. A1 r&nbsp; &nbsp;<span class="kw6">run</span>;<br>% b5 P& [5 Y, z% c
<br>' R4 Q1 z4 V2 k  N! d+ O
&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>
$ z+ r& _3 h. D0 A7 h&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>
, H$ a# N2 S/ M; f2 H+ ^' A&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>9 z. A3 g8 N0 e0 c
&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>
4 [9 v4 L' y6 w# i) y2 b) k&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>
, x( m0 c0 V: y" k! J/ D&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>
: O4 j& l" n4 w7 k- N1 e&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>
$ \, G$ G+ k( \) D/ Q&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
" o. b% E3 u, Z# v<br>* g) @# N1 {9 O4 S2 D- p
&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>
6 {: H5 a8 f2 ?# F3 H7 n# 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>
3 j& L! K7 l& h- H&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 n# Z9 ^( u! N: k' |&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>
: G# @3 z, Q) p&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>
" p" O5 W3 g' K) r* H- ^&nbsp; &nbsp;names_agg=a_agg c_agg<br>3 q7 {0 M1 A7 f$ V# g. r
&nbsp; &nbsp;names_agg=<br>
- I+ m6 m+ F. P&nbsp; &nbsp;names_agg=b_agg<br>
; S8 X1 \( h) u$ ?&nbsp; &nbsp;--*;</span><br>
6 Z0 _% h0 @3 f0 W! s: P3 e, j<br>
/ A/ B' O3 W0 G7 v+ R&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>
6 H7 I4 w4 p2 c! k) P! x&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>
4 \+ w! C) o- [2 ~" M8 M&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>: A6 v& b  R8 M' j9 M
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>
7 ]* D( \" Z8 X" U9 H&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>
7 C$ c9 r% L6 s1 a' V&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>
, o% y# @. K  O# k+ X, }0 s0 o, N$ @&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>
% s+ S8 E6 x1 L&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>
9 ?+ h4 t) C# E, w3 S&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
# }0 P  o4 V6 S- @; {5 U: S<br>
/ L4 J) o( {2 S6 R1 W, p&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>- x) `" R, z& N) k/ u- R
&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>% @% T: x3 e. v/ l/ }/ R
&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>, P- O3 x) E4 R, n2 g9 F5 G
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>& j; @- q4 }, @; L
&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>+ w0 s/ }) W8 r
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>& N+ y3 d( {2 Y. q" @7 Q2 ?* \
&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
; j8 Z; I! }% u7 E( ]6 p&nbsp; &nbsp;<span class="kw6">run</span>;<br>
5 k1 Z) h: B6 r4 _. k<br>
4 ]; G; ?: g9 ]&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>' q/ ?3 E* O: ?: _) 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>
1 k. ?. u! E' e: Z5 k; X2 O0 }&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
/ Q" L3 ^. u! G, E1 o&nbsp; &nbsp;ot1<br>
$ m& k2 Z5 `& J0 X; T0 M&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>$ }5 t) B5 {: c
&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>
& D0 [! X$ o- P9 B&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>
0 V- x, \# _( B4 u5 s- G&nbsp; &nbsp;*/</span><br>
7 R( i: C* z9 m5 e% m0 K8 i$ A&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>! P  I' _- q# o7 w2 u1 q0 M  J
&nbsp; &nbsp;<span class="coMULTI">/* on log<br>
9 U1 c+ z* s6 f0 c; I&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>
) O$ C8 a2 A, G# h! n&nbsp; &nbsp;*/</span><br>
' X$ I% I7 N8 `& }% J- a&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>7 I3 u9 O4 Z: N% _8 k! {
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>, k: e. F8 |. r1 ?
&nbsp; &nbsp;ot_<br>
' R+ Q  _8 \9 S& z" [* B) V&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br># x" h2 g, w; f3 y3 V* L3 ^. S
&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>4 Q) e8 g+ e& u$ K0 M, U8 x8 V
&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>% f1 R5 V( o8 F
<hr>; N" x$ \( |! b1 Y) ]3 [
<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>
, [0 B2 \  B  d' E  T/ @<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>
% @1 K! `* c( Z, F&nbsp; <span class="kw3">length</span> code $32767;<br>
  a8 {* K% o9 h( N  h&nbsp; <span class="kw4">set</span> meta_table;<br>
9 G; X& o, {% F1 R, J' {; ]$ N' L&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>  ^  i  ?0 ?$ I( T7 M
&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>% [  ]7 U, e( R" ?- l
<span class="kw6">run</span>;</div></td></tr></tbody></table></div>
. S% P; P( V9 O+ w: t2 c+ e. m<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>
$ l( E7 a( b! V<hr>6 e! Z4 U7 j/ C/ A: o( g8 _
<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>
9 P" x2 `% c- 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></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>" E2 w3 d! Z: l( f5 m
&nbsp; <span class="re1">proc sql</span> noprint;<br>" o& r# `1 q4 N/ v3 f5 t5 C) F
&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>
$ H* j0 A6 i2 B; O8 a( e+ {&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>% S3 N" ?$ L* j( K
&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>
9 B1 B; s$ E) Y# U. A&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>
3 n! M5 Z. A# U0 \/ M4 r&nbsp; <span class="kw6">quit</span>;<br>
7 p4 D# y; S1 t5 s0 M+ _( S# \9 t&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>& e' v) R8 V" `# [% @7 i" S6 Y" A
&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>
4 x( u- F  }  ]& k* a( \&nbsp; <span class="kw6">run</span>;<br>
1 @0 t, n* z: ?* S3 }" D<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>
( ]1 J" I; _6 s* u/ f/ h- @/ [! C<p></p><center> <script src="/c2.js"></script></center><p></p>( V  X, Y# e7 g) l; \7 n& H
<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>
; I* m/ H* I' ?" `, S<ul>
, j5 p6 M( ^3 D$ A1 W+ r5 V<li>& \2 G, C2 S* ?9 m# s
在调用执行方法之外按顺序运行宏?
0 B" N9 k9 ]8 X/ v- _</li>
* `( ^8 ^% Q8 G) K6 M; G2 g) ]4 C<li>
! q3 w+ v# i9 y( ]在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?
1 |2 z9 C8 D& E$ V</li>$ M3 p6 S% d% a  S1 W5 c
<li># w5 G( }# G9 x8 |
在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?! G5 p& q; r# ^& f
</li>
. O& s2 H) K& }5 k</ul>
# M" P  U' g; c3 l8 h<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>
1 j! d$ q- E: A$ u7 X" ]) ^<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>( g7 w% R5 D8 J$ \( \1 ?- a
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>
3 x% f0 g) U/ q8 C5 i& @2 v<div class="suo-content"><div style="text-align: right;">+ U: A& g: G9 I$ T% K
                <div class="xControl"><i class="fa fa-caret-right"></i>
6 b" U7 P. i2 m9 l" I0 n                        <span class="xTitle"></span>
2 M7 n0 Y& o+ O3 `, f( P2 E                        相关讨论
) C* |  W, w3 F# @4 ^# X                        <div style="clear: both;"></div>0 o1 }1 j  p  @$ O. J+ w
                </div>2 u7 C$ y- |1 j- |* Q2 j! Z
                <div class="xContent" style="display: none;"><p></p>
5 w% ]4 B" }. @0 q9 I4 ^<ul>
1 d5 P  l# W" z<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>
4 b) ]# `2 J) @6 M</ul>
, J! V1 F) E+ u+ c4 f# n<p></p></div>$ }% u- n$ k9 W- f" N/ S
        </div><p></p></div>: T1 {3 {4 b8 ]7 I! }$ `. }
<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2026-8-26 14:58 , Processed in 0.416121 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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