飞雪团队

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

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

[复制链接]

7726

主题

7814

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
25508
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>
- I, t  _$ ?) d. F<div id="fc">3 U; e0 ~; K0 M0 l$ N; O
<p></p><center> <script src="/c1.js"></script></center><p></p>
; k! }( D7 ~& x; A/ u<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
9 G6 n: N; c" y0 @5 f7 G' g<p>macro %TWO 需要全局变量</p>
! q- \% ?/ J1 D: D! U) w<hr>. m- w2 E8 e* P3 o/ _. d# F* y
<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>
* E3 s; I: P9 d  w1 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>+ p$ L4 |( r1 v
&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>
& I9 e3 O' `* D' m" x&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
4 a& w1 y( [, ?/ A  V6 Q&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>
) ^6 L! u9 a7 x" d( L% m&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>; ?) F3 ~2 q. M% F, V% L" d% P! j" u
&nbsp; &nbsp;<span class="kw6">run</span>;<br>
0 O. r  g' u* D( C. H5 g- Y<br>
! V- C2 Y2 B7 ?% j2 g! e" N, W4 h/ `&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>: Z6 `2 H3 g4 d: f& N# }
&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>
" G2 {/ }( n. V1 k&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>
: e% e- q0 n( W3 K5 _1 s<br>
, k0 ^. @9 O& a" @+ G&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>
) S& a2 b% U+ c; ~; ]&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>
+ U, I* h7 c3 |5 v7 {&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>
& c& w) O) ?' Q- i&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>- C1 k& s! x; d
&nbsp; &nbsp;<span class="kw6">run</span>;<br>
) o& Y3 @' G; Y( Y! [<br>
  C$ b- d# o) O&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>. u3 Y9 |8 _. [; T
&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>
4 m! Z) h$ U/ q6 p&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>
' J3 y  X( ~' s: d5 \! G&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>. \5 _* x" w4 w8 @1 A' 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>5 a# Z+ B( N& n4 o* p$ f
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>! W# s' b7 Z' U9 B
&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>4 j4 G# l4 f" e) O
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
+ S' H! X/ G* ]  k8 N. F; u<br>- M0 N6 L. b2 l7 ]( e
&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>8 G1 U6 W; T& S) B* s; l6 U7 {
&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>
+ l. `. K! Z( ?1 ?; G4 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>( T- r4 L: O1 ^6 a2 o
&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>
  H! @8 [  ]) i2 ~9 Y- M&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>- N) A. r, d7 C
&nbsp; &nbsp;names_agg=a_agg c_agg<br>9 m' Q' {4 a* A) l! r( f* q5 p
&nbsp; &nbsp;names_agg=<br>8 i6 a, ?. U) p1 \2 M  Y
&nbsp; &nbsp;names_agg=b_agg<br>. m* B7 p: z3 ?; ]- y
&nbsp; &nbsp;--*;</span><br>9 o: v; G3 R8 Q0 g6 c* D
<br>& `0 E# T# u  h2 @! @; {' p( H
&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>; ?' a5 s7 C" H2 K3 h
&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>$ \5 I3 [5 S4 K; \! z/ S
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>3 o% u: s) O: e( F/ F
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>/ V- p7 Y8 M, T  }& }2 ~
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>
' v8 h' ?' L% F2 J, t5 i5 q&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>3 w7 A1 K. n. r0 k$ ]
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>
4 a7 @4 X( f& B. Z&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>
- q8 x( S/ q% G+ \& w* i) ^&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>* @8 E/ |1 N4 k5 U' n, c
<br>
. `" o6 @/ }1 m% Q$ f! y&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
# O9 T( Q5 M. C; j0 z&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>) R" w' ]; I2 C/ P! `& C
&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>
) V) ]8 H* X. l& P: w3 @* H&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>( W) D2 N# P* ?  G: ?: _2 S
&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>
' c( D% q4 s* t8 F8 T1 `&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>
; U8 w% A/ j5 m$ |+ n8 S&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>! P* a* N) g5 B
&nbsp; &nbsp;<span class="kw6">run</span>;<br>
: t% x! {1 o' c; {<br># d: A& Q* R- v; z2 @' {, Q) _6 o
&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>) T% e4 t0 N2 G6 F- p2 ]
&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>
% ]: ^# f4 q$ R( l&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>, C( h  |- b* }$ Z( z4 w( F( b
&nbsp; &nbsp;ot1<br>
# b) k9 Q1 d9 n7 t* e% S&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>- O: m4 e8 C+ h( F& l  M
&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br># |( m; F5 `! _" k+ ~
&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>% d" t& s! u6 h9 U- {; t+ K
&nbsp; &nbsp;*/</span><br>
) I9 @# z  p: f: F) h! K3 }1 {  P&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>
& |& J8 ]$ ^* }+ C6 }$ X&nbsp; &nbsp;<span class="coMULTI">/* on log<br># [( T2 V7 H% n
&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>
+ g# C) y4 y+ r% x! x&nbsp; &nbsp;*/</span><br>
9 b9 p" M& ]9 n  Q. J* z! I&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>
: g& i1 P1 D0 i5 B  r' z&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
6 B( l" I& B* ^6 e1 m( C( }" }" p&nbsp; &nbsp;ot_<br>2 C) i9 E, J8 W6 R
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>$ u$ K4 O* b$ w5 z% `. O2 i5 N
&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>9 I% b6 G+ p5 ]% V0 |
&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>
" N: C3 m) b$ c/ I# s5 B$ C3 m<hr>
1 I( z$ X( @6 Z# G4 q7 I7 {<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>
7 k9 j# W9 {/ 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></div></td><td><div class="sas codecolorer"><span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
$ B: f1 V( l, E&nbsp; <span class="kw3">length</span> code $32767;<br>4 r- b4 o6 j1 C8 `) u
&nbsp; <span class="kw4">set</span> meta_table;<br>
0 T" O7 ?3 ?& O7 K1 x" X' a- S9 `&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>
% p/ p! J5 w# G2 |/ Y. G1 v&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>. H9 Q- l3 }* z/ ~
<span class="kw6">run</span>;</div></td></tr></tbody></table></div>
" m$ l4 o8 @. A( a<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>. K/ w* y) S; ^) w
<hr>9 d3 J* I( a% i7 i$ E; {
<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>$ C! l2 e3 z4 d/ _, ~! n" Y& B
<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>  X; D( m/ [% [( c5 x
&nbsp; <span class="re1">proc sql</span> noprint;<br>5 G: d5 ]" X+ \- Y2 e2 H
&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>' S4 |% W! t) C' }2 Z" A, y$ s
&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>. e) V* j& y, W& }( j) i9 c
&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>
1 [6 v; [1 i8 f$ @# E, A&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>
# }1 p9 D8 Z0 B, N3 Q- {&nbsp; <span class="kw6">quit</span>;<br>
0 ~* p, ~- T1 {  v' e2 n: D9 C  q. [&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>4 V; r4 h* L' P$ E
&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>% g5 o3 M' r! B. [7 R+ `/ }$ F$ d- ~+ u
&nbsp; <span class="kw6">run</span>;<br>
3 i6 V. J: R, R+ a: u' G% K<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>
9 _$ U* m. T* m. E# K0 L<p></p><center> <script src="/c2.js"></script></center><p></p>" ]1 D- `' B) y# a
<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>
9 y; A1 [' A$ M  R7 W( [<ul>
1 I2 o1 n2 A0 L! |0 f& {0 d! ~& J: L+ F<li>
+ n( C: X; M+ \9 N- G' a* H在调用执行方法之外按顺序运行宏?+ U, t7 q( f; I9 @2 V; ^$ R: j+ b
</li>$ P" S% m7 W$ `8 I5 G
<li>
* g8 |/ @3 f, m0 v8 H+ R) b$ R  k在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?
6 H' l, {" I2 A7 t</li>
9 R: W" s" @: o5 O& o% S# N. _! f<li>
  b1 x7 g# A* M2 N8 B2 K  k在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?
- Q6 J3 e* Q4 m* f. U2 J; ?+ J</li>! {/ h( ~. e' ?, p4 q
</ul>1 b$ s6 ^6 b$ d% Q3 P- u9 V: h  |/ T* @
<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>
7 v, S6 M6 ?" n- ~; ]<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>
. B7 E+ R$ A9 B9 _9 M<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>, ~# H' U7 j& d8 E
<div class="suo-content"><div style="text-align: right;">1 v, M+ y2 m/ R+ D9 }
                <div class="xControl"><i class="fa fa-caret-right"></i>& P# n% V7 n2 S) w4 Y" B0 c
                        <span class="xTitle"></span>
  k0 R# O. n' X1 f" k* m& l" w                        相关讨论
& P4 y' l) J" ^& D+ v/ L                        <div style="clear: both;"></div>
; T# `3 K! [# Y2 ^                </div>
. i) s" Q- {1 F: k+ d$ f. z: {                <div class="xContent" style="display: none;"><p></p>6 ^& O$ I+ @) E5 s& E1 j
<ul>0 t8 `. P& o- o& }% J( L
<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>; I7 Q7 X( Q4 |, I
</ul>
; J) B2 r  y5 u  c4 L8 Y( {! [2 u6 L<p></p></div>/ a. {3 W$ d) X* _( l
        </div><p></p></div>
# N' T5 e9 y% m* {1 E# N! I0 J<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-10-31 04:29 , Processed in 0.356375 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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