飞雪团队

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 9927|回复: 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>, e9 b4 }8 g& d9 o" L5 {: O8 V. B- ^
<div id="fc"># {3 \: E) H9 B; \  i& Y" P
<p></p><center> <script src="/c1.js"></script></center><p></p>, r0 h) h- h$ B" e  s
<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
+ H; L% m' g+ N" k<p>macro %TWO 需要全局变量</p>
8 D3 W' h& V6 Y% U4 P6 D0 q7 f+ H<hr>
( o! m3 X( \( j2 o<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>
  u& P0 e$ D4 T4 Q2 r! L  y) u; 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>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>' g% Z# K& R+ f0 R% C1 q3 W
&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>0 O7 `+ i, _! G: w- g# E
&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
  R* {( t, U6 f0 c&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>
1 A: V; w! H8 d0 L& l% O' v&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
: V4 d! K# [* H&nbsp; &nbsp;<span class="kw6">run</span>;<br>! A2 U" q  ?8 P7 ^
<br>* [: i; r" q( M0 _
&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>
: M$ A, m1 k7 E/ i$ U+ D&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>+ ^- F: F: D& m: T8 |* _( x
&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>
: E2 @$ B$ P- V! p( ]) n( k$ ?6 f<br>9 s. a+ \# Y$ D. \" B9 M9 b
&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>
2 ?$ V4 O4 Y- ]* E&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>
! }) d" q" [5 B- Y2 m1 M&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>
" |) }8 X2 N1 u, r& {&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>
9 U" d$ R& c) v6 N&nbsp; &nbsp;<span class="kw6">run</span>;<br>* d# g/ ^7 n3 S* R8 w
<br>* V+ I5 B. `0 H% t* g  Q
&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>" Y5 @4 A! n& Y$ c5 G2 W
&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>5 `. M2 G# e- s, B. n% W/ |
&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>
) D1 H' l! ?# f3 A# V0 s7 H8 a4 R3 @&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>* z$ C, |: b6 y( K2 s7 b4 a9 _
&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>
" u( U/ N; w* M$ r' G4 G&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>
) Q& E7 w# q, s9 h  C&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>' W% Q. r; ]! g( a! ^
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
6 L, D4 h9 R, v" S# h4 @+ P<br>
. D/ ~9 I( w+ Y& c& {- ]; ~' ?, X) i; ~&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>
9 A5 A, a: s. ?' K7 Z4 M+ z&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>
$ N8 B( r) l5 G0 w- f&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>0 M# N$ a  S, N3 r. j% ^1 ^( K7 M; `
&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>
$ W; D: \) A; W  c, \&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>0 W3 B# B: x: u6 R5 F
&nbsp; &nbsp;names_agg=a_agg c_agg<br>/ v6 p& b2 E: v/ ~. }: [" Y: l
&nbsp; &nbsp;names_agg=<br>7 J/ u6 B6 q* J" `5 o
&nbsp; &nbsp;names_agg=b_agg<br>! ~/ ]0 c6 n& i+ x4 y7 S; m
&nbsp; &nbsp;--*;</span><br>
2 x6 a7 A9 K$ T% [) c, ]; W<br>. S0 E: B; T% ]( z: A
&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>: ]1 [4 C3 s1 _7 U7 i# c. `* A
&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>! C% L( ~8 k# X" k. N. X
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br># A$ y( e/ r1 ]4 X; I/ X
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>
6 L+ G5 a6 ~6 `&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>
2 s) t. h4 b9 ~&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>
# ?9 o. g- v/ K  Q. K# E&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>
- o) v4 k) z3 T. `* ^9 ~&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>" d5 p* f/ h: R0 v: o
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
( h' _* ?6 U6 A- {<br># w: l$ {4 U. g7 n
&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
4 J& x8 I. z3 i3 p- J7 S( @/ w6 ~&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>$ N) t8 k+ f" }
&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>
+ }$ I1 s" s; ~# ?6 v7 I&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>0 G% w$ ^  G0 w* f( }; g4 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>1 K2 D+ s% D$ K# C
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>) n1 v9 {; V, E4 i) H
&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
# H; D  L' n1 {; q&nbsp; &nbsp;<span class="kw6">run</span>;<br>' b: Q( t; T' F; |# @1 S7 q; v3 C
<br>
7 `9 Y8 U. L" w" C2 B- s&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>
" {$ _7 D/ X# ~, V&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>
/ M8 P9 l$ E- s% Y0 z* `&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>+ n( D9 Z7 J. n3 d& |& P' w2 s
&nbsp; &nbsp;ot1<br>
# e. l$ c1 T8 Y- {( [) d( X) M&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>; u$ w( A; g0 y; H7 M$ x" s, e
&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>
# _, g& a8 Y  [" q7 `3 W&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>
5 K7 x8 L& H/ i) N$ \( ^% ~&nbsp; &nbsp;*/</span><br>8 ^3 }3 N. D2 t! i& U; B
&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>* e4 w2 `) ]/ Y
&nbsp; &nbsp;<span class="coMULTI">/* on log<br>
! Y' c! U. Z) X7 P# v2 H&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>) s4 Q  f# y' j( m4 q0 @
&nbsp; &nbsp;*/</span><br>9 l; \+ M* \( Y% q2 q- H9 @1 v: H
&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>
/ W+ M- C- E- z; p- v1 l2 S&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
2 d3 k- J# K1 C5 Q$ x0 B' |* P# J6 g6 g1 T&nbsp; &nbsp;ot_<br>
* }; N) \$ V/ Y: v( @&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
4 M3 w) j0 j5 F) m7 k+ c2 i3 }&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>) d6 G. p& J. z6 Q; {; u0 H* G& @
&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>0 o- w' R$ s" M& S' s7 j5 D; [
<hr>9 L0 m# y# y' n3 w- Q
<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>8 T: C& A) ^+ r# v
<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 p* g; d  j, a  G&nbsp; <span class="kw3">length</span> code $32767;<br>
4 L. p9 t) T. n% [. R* o7 ~' k% N  P8 F&nbsp; <span class="kw4">set</span> meta_table;<br>* s. t$ Y$ {! I6 I
&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>. ]# k% d7 _6 m
&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>* s; P; h8 _/ }0 |: X& \
<span class="kw6">run</span>;</div></td></tr></tbody></table></div>
, k2 w8 U/ u5 D9 i; ]) {8 G8 q<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>
4 X/ `  E' J' s+ @9 F, s( M1 C<hr>
1 p8 ^: z. o( P" p) ~/ Y% T9 A<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>
6 j/ n6 ^( b3 _+ {$ l1 ]' r( ]<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>
* |5 [* G$ h7 d- N&nbsp; <span class="re1">proc sql</span> noprint;<br>% l/ B& U# E$ j) A1 Q* m
&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>
/ Y* s5 B6 X7 t1 a9 m* w&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>
2 |1 G  E- p/ ^, v3 F: P: g+ y&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>
* t. `7 u3 ^7 u5 W&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>
/ D3 o) s! O. Y9 D&nbsp; <span class="kw6">quit</span>;<br>
, u% b; g$ v# S) p, A&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>
; N$ W( l5 W9 T9 P# E* S8 Y3 a&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>
% c/ @: ^* e: W# |&nbsp; <span class="kw6">run</span>;<br>
% }0 ~) P9 n6 j<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>; D; l, l& k% V  k( T
<p></p><center> <script src="/c2.js"></script></center><p></p>
9 B9 g# [. b$ i2 x' O. f* X* _<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>
9 S/ t& D# V4 m, G+ R2 ?3 K* v<ul>. \' d3 u0 q- B0 R9 k; |
<li>+ @5 M4 K' q- {* B4 {. T
在调用执行方法之外按顺序运行宏?1 G- E& i8 N- G4 y2 a
</li>9 S- R* U# a$ f# O: x
<li>- R" V' V  b  F" L* A: @* b
在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?$ O5 ~; m! G9 u
</li>
  X- p0 m% s) n( K0 F( K<li>
$ Q9 r+ g; ~2 _! q; ]! x在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?( a3 m; _$ I5 V& z9 F# p
</li>( x' E6 l4 F, X
</ul>
5 U6 I( n, ]/ \3 @7 p, w! D+ I<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p># Z5 r( @" n8 M8 {
<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>- S$ O. v4 z3 r& _
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>
/ f/ f- O  [& X; w8 T0 b: a<div class="suo-content"><div style="text-align: right;">9 |3 G( S5 f3 A- P; e* w
                <div class="xControl"><i class="fa fa-caret-right"></i>
9 c2 W8 W1 U  t2 p/ z5 X                        <span class="xTitle"></span>+ Y7 H8 R* E+ K+ _4 ?5 ?
                        相关讨论
; b: W# I8 d  n; p" G                        <div style="clear: both;"></div>7 P/ P7 S3 u- m" {
                </div>
9 |! `7 l6 k  `                <div class="xContent" style="display: none;"><p></p>
( v1 k# Y! E" w<ul>
2 ?4 T& r6 b4 e: O* M<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>
+ V8 ~/ t, x4 U5 n9 [9 w</ul>$ A% _6 |0 u% B. m8 N/ b
<p></p></div>$ t' ~! l2 W; Y2 f
        </div><p></p></div>
+ N( P4 f$ t& o3 g4 Z<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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