飞雪团队

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

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

[复制链接]

6379

主题

6467

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
21461
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2># e9 c3 Q4 l) ~" x9 p2 `6 c
<div id="fc">
7 `1 _9 M6 L; X: w<p></p><center> <script src="/c1.js"></script></center><p></p>
. l, q6 L5 `8 A6 o3 N<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>5 ?- m! q1 M, Q. Y# ~$ \7 D: w
<p>macro %TWO 需要全局变量</p>
, n6 s  n6 J- q$ N0 o' x<hr>
) x" A0 T0 m' r: ~<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>3 l5 e" l; A% i2 ]8 \5 j
<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>
' s! f' M2 e( V. j; k% Z&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>( M: ?2 t- g  X$ N
&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>. e$ z+ b' |% u6 F3 j' W( ]& j8 P
&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>
1 J9 o% _/ @+ R* a" ^: O( v' ]3 V&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
8 f7 B+ S0 D& {: D1 p4 Z- K/ H6 f&nbsp; &nbsp;<span class="kw6">run</span>;<br>
5 ]7 Z/ l; d: P0 ~5 A) U$ i6 K: ^<br>5 N* X% l) K1 L' k% K% e
&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>
' c9 h2 ^, D. N&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>! ]; v0 J% w- {0 \) q
&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>
, l2 x5 A+ J, A( p: B0 V<br>
  u4 f, ~9 n$ L% b: |# K+ \* |3 [" B&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>
/ J1 C0 c" c$ n& R&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>
7 b+ B' l$ M8 b" ]&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>1 X, b. f. f% c5 l
&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>4 t4 q2 G" e9 Z/ f
&nbsp; &nbsp;<span class="kw6">run</span>;<br>2 M6 {6 d# P+ X
<br>
- }* p! J5 y! V# Q&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>! g" i  E; @9 \& u0 r- T- {
&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>5 |" z% T) B  G5 H8 Z1 ?
&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>
2 r! J. T" y* j5 X4 b/ Q&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>
: |( Y/ t; m" [1 q&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>
! K  P- e  |, Z2 g) K&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>1 ?4 l, g/ _8 X: _" r
&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>  z8 d7 c+ I7 G1 Z+ E7 i
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>' h3 a& x; o8 S  ~9 z
<br>& @9 n  Z8 |7 y& V) j+ }; J; D
&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>
2 Y6 W* w8 P$ ^5 M5 y&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>2 ~- ^; v9 M! p4 Q  _( D* T7 O
&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># l, Z7 z. d! m% n6 n
&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>
; |! L. [& {) d8 |. K&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>
7 r6 F! V. M/ y. e: W% O' Y&nbsp; &nbsp;names_agg=a_agg c_agg<br>6 Y  @( d; z+ o6 `! e% Q- C( F
&nbsp; &nbsp;names_agg=<br>3 |0 t7 Z7 F, M2 ?3 D' f  ?
&nbsp; &nbsp;names_agg=b_agg<br>
) m* V2 v- S$ X/ j$ Z&nbsp; &nbsp;--*;</span><br>
; g- u; ~$ G& N. \) o<br>; H9 L* G' A3 }6 ?$ d! {. w! K: [( h
&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>5 ?* x& U, \$ N$ j0 q6 J
&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>9 A6 y6 M  a/ N8 p- ~
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>
. q7 A6 L6 i0 O& h# [7 Z&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br># D  G! [# ^7 }# u
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>5 `/ G  U: b0 M2 H! H" Y0 k
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>
$ N& U( H2 O$ a' Z6 J! V$ D&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>
+ p1 L: g' t* u; g4 R( _&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>
, I: D; ~. x. b&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
4 g4 u! Y5 p* f) d! @$ I8 n" k<br>
; C' I( A( l/ c$ O# o2 N&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
( {8 I* O/ Q7 O' K- H7 l) R&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>
! e: h2 p1 z1 @2 L( z( @&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>) l7 ]! g0 X* r2 B" T6 F" a( n" y: o
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>* v" w2 t0 t- p; S, W" Q
&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>9 w) j' U2 k# O! k# F$ Q5 t
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>
/ |8 l$ u# O& W9 C" D&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>% h, K7 K: l% ~, m) x" |
&nbsp; &nbsp;<span class="kw6">run</span>;<br>
/ h2 c: Q4 E& o) I% {1 n<br>
7 u: D% h) i. A&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>
+ b! G7 t6 x. k7 m% H. V8 {&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>
$ d! B1 W8 \# Z: G- s' [&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
+ m, ^: I6 R# E&nbsp; &nbsp;ot1<br>
+ E% k- t0 r( Y( H' K; ]7 E&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
. R. ]! g( h0 W6 g&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>, y. g- X. h4 u" o3 T' u5 d2 Z
&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>
: t* |0 J# x) ?&nbsp; &nbsp;*/</span><br>
. _# \: v- p/ K: K, u&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>0 c, |# v# r. E# q
&nbsp; &nbsp;<span class="coMULTI">/* on log<br>
# [0 w8 ?" p4 v$ n&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>
  N6 ?  v7 @/ o, i) n, W&nbsp; &nbsp;*/</span><br>1 G* [. O, V7 u3 H' G
&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>
, r- h* l$ r7 X* G) L( B&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
/ o5 T- L& E" R+ F! q  K2 z) h% I&nbsp; &nbsp;ot_<br>( M0 u( C/ N  L# h- \
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>4 \+ x' ^9 w2 h8 N
&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>5 H3 @! A( k9 \! x  G; E( p
&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>) }/ w0 a5 x6 V& ^
<hr>
+ c' m3 S5 o. a( u4 _<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>( `1 q: i$ A6 m0 Z5 H
<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>* i$ }: [2 U6 m0 X5 C- M5 t
&nbsp; <span class="kw3">length</span> code $32767;<br>
! p, L( g: }9 l&nbsp; <span class="kw4">set</span> meta_table;<br>
6 C/ O& h9 M4 n1 A- K: A: Y# @&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>8 D8 \) l7 d* R" m+ H
&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
; r& n; _! n- p<span class="kw6">run</span>;</div></td></tr></tbody></table></div>
( C$ h! D6 i+ j. V6 S<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>
) `7 Y1 Y2 `7 e( E9 A<hr>
( [. D* B" M7 }<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>+ u8 t- W" E: t# B/ H
<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>
( \1 E% _! d& a: R&nbsp; <span class="re1">proc sql</span> noprint;<br>1 i& l1 e5 T4 r
&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>: ~* Y: K, H' n* W/ W7 o# _$ L* k! y
&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>
  \% P" X- p" i( E+ `+ b5 h' |, T# c&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>* u9 C% L, E5 [6 Z
&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>% ?2 [- c5 A8 l# p$ Z2 w: R
&nbsp; <span class="kw6">quit</span>;<br>4 y5 V3 {1 C8 m, R
&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>
5 H3 I. f% e; a&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>
* y9 ]1 A& |) K) S# L7 [+ c6 q8 h&nbsp; <span class="kw6">run</span>;<br>1 U- X3 p$ v+ h) |2 u4 t$ g
<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>
2 [' O/ N- o7 h8 l# R# s<p></p><center> <script src="/c2.js"></script></center><p></p>6 X. U7 M+ U' K, J
<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>( ~1 m+ n4 c8 o! u( D5 N
<ul>  t0 C" Q: |  L: b# d
<li>8 k6 e$ @5 F; T: |' z
在调用执行方法之外按顺序运行宏?4 R! x& N8 U6 z; B
</li>; V. `  g6 }9 I. D8 q' v' d( l, t
<li>6 }) d/ Q8 c, I1 ?+ G; v! s3 ^
在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?
% g+ q, G. M' i/ d1 A' n. @! V</li>2 X0 L# w$ \+ m. V; r& \
<li>/ Z4 F7 f6 D% j/ x9 E1 w2 E5 S9 U
在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?1 X3 P% S6 _% ]) z
</li>8 c: x: h% z9 n: H8 o/ a; {) a
</ul>
: h+ N! H% A: \9 M3 L<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p># v4 @1 l" y. |; {! Y: \0 d
<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>% _  `& L7 |. l, P6 t: S
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>+ c9 G5 A) {2 l5 |" h
<div class="suo-content"><div style="text-align: right;">
* P, h! D" I1 M' K                <div class="xControl"><i class="fa fa-caret-right"></i>
1 d& b. {+ }; L                        <span class="xTitle"></span>) v' ^+ I$ y& V3 g) A
                        相关讨论6 W* p9 e! L- w% S8 t
                        <div style="clear: both;"></div>
/ |: d0 `& V2 R6 I" h/ H                </div>8 j: g8 m$ w$ r- e7 v
                <div class="xContent" style="display: none;"><p></p>
( [4 `3 j" P2 I2 h/ s+ o<ul>% T5 \6 _, G1 F& A* k
<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>9 q& j9 q' `3 }$ j
</ul>7 S+ s4 y" \6 O8 x
<p></p></div>- k6 }$ r9 o: N1 s
        </div><p></p></div>
2 Z0 R) c% B) Y3 u<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-4-17 14:50 , Processed in 0.064342 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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