飞雪团队

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

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

[复制链接]

6870

主题

6958

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22940
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>
9 x. J9 C7 e! _5 g<div id="fc">4 |) m. F/ G+ a7 S9 v& b
<p></p><center> <script src="/c1.js"></script></center><p></p>
, U6 E7 S1 n/ |( u/ R<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
2 h* d/ [, {2 V* p' N, ?<p>macro %TWO 需要全局变量</p>/ q0 n) E+ n9 t' B3 R% N) L( O" [
<hr>3 d% U' R& j- n+ H
<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>
2 w" B; g7 y- k: p# }) N  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>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>4 v9 J8 T% i/ T* k7 d3 o' l
&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>$ y+ S/ n% C! J$ ?4 s, Y; Z2 O
&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br># ]2 c2 Z5 t( P% X
&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>: X8 y, N- P. \$ [$ E( T
&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
  i1 f) z7 B, `' f* m&nbsp; &nbsp;<span class="kw6">run</span>;<br>; a* s" F, K" d  g, v7 N
<br>
4 T8 X. c' W6 n: `/ Y$ N; c&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>
3 `& k4 }7 C$ ^8 n9 R6 e6 [& t&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>
4 O, w' Q7 _0 K" `1 m&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>2 U7 C* E7 V7 d
<br>- O) X# N, t0 q
&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>6 v; |) ~0 P) L
&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>7 F+ a7 o. [" F* f# x8 R" ]
&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>
0 N- T" ?7 m! }# `# e&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>9 x# D' ]  J. Q2 `
&nbsp; &nbsp;<span class="kw6">run</span>;<br>
( ^/ _  Y; W" k# ^<br>+ n; Z! b9 ^. E. K. C! L
&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>3 c/ j9 c) M9 K: M# }
&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>
/ O: ]; y! X0 p0 o( m& w/ ?$ x  }&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>( c  d0 H* Z6 _8 B0 g+ }3 I* @& U
&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>
$ K( i' Z' q) k$ A8 n+ r( T&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>
3 S) r; ^9 _+ V- I- `9 {&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>6 y* z" k6 ]! J7 R' m0 c
&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>6 D" h. X* D7 e* k5 d
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>' Z% k, A! \' }1 v7 ^: G( |
<br>
1 z8 j; a/ g1 o5 G% P&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>; Q; a: l2 N& \4 I: t+ X3 X1 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>
; |. O$ O$ t: V2 K& K! t&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>  ?9 p; U+ D& u5 F
&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>
; U7 ^; B' J7 J# l2 K; `&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>
( H$ P% ~" v9 H. w% v/ _&nbsp; &nbsp;names_agg=a_agg c_agg<br>/ E/ J  D7 i6 i; o) J( P
&nbsp; &nbsp;names_agg=<br>9 m' g* c$ o3 s7 x0 y
&nbsp; &nbsp;names_agg=b_agg<br>
" }2 [* O$ p1 I  `( \&nbsp; &nbsp;--*;</span><br>
3 C$ E9 l# ], D5 L+ o* E<br>
8 u" r, c, f' s" F/ l$ m4 X# Q- X; w' k&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>% M0 R5 P' k, Z; U1 r' a# s) K8 u1 k: z
&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 Q- o. ~# l, Z3 D
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>- q' @7 r# o" [* g, e- V) a
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>/ M# ?5 R* ?3 U/ _; c; l! E
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br># v, t! q" K: P( l- n- ~; w! o
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>
  T! T7 e" c$ Y* x&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>, l- H1 L+ E" q2 T9 ^  u
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>* v' |4 o! o/ ]- e. t
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
+ U0 u) [) |& f; L! A* o0 j9 W<br>8 c2 M3 n+ L8 H6 ^$ K5 C) u6 B( i
&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
- _1 {3 u% r9 `' w1 j&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>9 s. {2 w8 i% n5 |4 \; v  U0 ~# Y8 Y
&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>
! {6 o9 c1 e* v# D  f&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>! S8 z. |+ [! H1 m
&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>
  f% R5 ~/ }, r2 Q& V&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>
- T- j9 E7 W5 q1 |# M( g8 {3 \8 C* u&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>+ a' e2 i( ?0 u8 Z( B/ @
&nbsp; &nbsp;<span class="kw6">run</span>;<br>. E% v6 S/ }& h; S  S, q/ z
<br>$ K& D/ s0 u2 T8 j$ R
&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>5 U) T( E7 M6 f3 q3 u
&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>8 S, Q) a$ I4 Y. H2 }3 R
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>( m$ j) j' |* X' b. i) \
&nbsp; &nbsp;ot1<br>$ b7 |/ N8 I; H5 f% c3 E) e$ @4 l, R
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
( l, i; P; j5 m: r  _# ?&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>$ L6 [; ~  S2 T9 o: n% w6 t
&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>
* E  ]$ J2 c/ J! U&nbsp; &nbsp;*/</span><br>, q2 ~# [, V& X+ d" P9 P  C/ u3 o
&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 R# }) E' ]7 Y" x& Y0 P, K9 j+ |&nbsp; &nbsp;<span class="coMULTI">/* on log<br>
! u8 Z8 |4 R+ f&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>
: Y6 {, Y  z: y$ R* [$ p&nbsp; &nbsp;*/</span><br>) u0 Y) H8 r5 ]+ L' v
&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># V0 D+ I% e7 z' l. \) o- L. u
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
9 ~0 v; I; J, }" c&nbsp; &nbsp;ot_<br>
' J; ?2 x# n* j  T' g8 a; {4 T&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
+ i% P+ O+ N: @* {$ z&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>
5 w2 ]1 Z: c" `5 n( q0 [&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>. u* ~' t# V" m5 [! h! v) U
<hr>
0 A, k! D' y. i5 ~- A; q<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>
6 v: V% l) o" M<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>  u9 I% R8 Q4 ~- R
&nbsp; <span class="kw3">length</span> code $32767;<br>
2 m$ X  j; p; ~6 t&nbsp; <span class="kw4">set</span> meta_table;<br>
3 H1 X+ R7 m$ I9 S  ?+ B&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 |7 J2 P7 b' }# {; p
&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
* l/ G6 L8 Q3 F( {" W<span class="kw6">run</span>;</div></td></tr></tbody></table></div>, e9 Z  g0 B" M  ], m5 m4 h# o$ L
<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>
9 A0 @' q2 m1 n: `' t: t<hr>" m6 ?0 ^0 a) i* q
<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>/ l, M! |9 ~( T* b# @; u. t8 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>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>  m6 d4 Y* o% {* n' `
&nbsp; <span class="re1">proc sql</span> noprint;<br>
+ m- j8 r* ?9 ?9 j, M( @  L! \&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>
; [+ F( |9 B! p# u" @7 @8 i&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>/ y% F4 Z" F0 j0 k! r. R' |5 X
&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>
! k! J$ ]- V3 L2 n/ G&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>
0 v5 K' v& X% s0 p/ j; T) s6 `  C& M&nbsp; <span class="kw6">quit</span>;<br>
6 B8 m9 c/ t4 k( }3 |% q4 E8 a&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>& B' G' t6 j+ J
&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>
+ ]) E/ [, G0 j+ K% I/ v$ \&nbsp; <span class="kw6">run</span>;<br>0 x& X6 J) @9 u* W$ l* _
<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>8 F) Q6 @* M, y6 n( V) D) W8 u) i
<p></p><center> <script src="/c2.js"></script></center><p></p>4 `# k) Q! H) S/ J: _: J# u  e8 ~( ^4 R
<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>
9 ^% q3 B! m" Z8 N<ul>
1 l* F# [3 l/ Z* Z$ I<li>4 h/ I9 v+ P( L: T( X# a% J4 B
在调用执行方法之外按顺序运行宏?9 C. k, _' \1 ]/ w) ?
</li>
  x0 ~% y; ?8 n% p$ o<li>
$ V0 [# i! A2 }) s在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?# U& \6 h& D6 i7 \2 Q& G7 ?
</li>
0 P7 V* l0 H1 T& b<li>
! [. ]6 z. z( t5 c& x1 l1 ^在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?7 ]8 i4 ]/ R- g  ~8 k
</li>- |% k& U+ n4 a; A6 j
</ul>
. k8 l2 G7 P4 F<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>
+ V5 a+ N1 w6 S% n- s9 W4 M<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>+ g) e( F  i( V, g; u
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>: R# U, j7 K$ H+ |0 d0 K. k
<div class="suo-content"><div style="text-align: right;">
& ?6 D: Q. |: T+ {: E' {                <div class="xControl"><i class="fa fa-caret-right"></i>( T6 k, [* J0 ~( N. h7 M2 Y
                        <span class="xTitle"></span>$ z( F9 Y3 c: h1 h
                        相关讨论
3 \4 x0 e1 k1 m7 s* }                        <div style="clear: both;"></div>) ^; W5 e# l6 n. H6 Z+ g$ m/ N' u
                </div>- |0 C3 h1 {8 w9 V
                <div class="xContent" style="display: none;"><p></p>) ?/ e1 A4 C* Z; m/ @
<ul>
4 i' h7 [( X' h% N7 y1 D$ g<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>
; _( g; n/ `- k8 C4 F</ul>" y* Q" w4 y7 Z1 X3 m, n
<p></p></div>0 U7 M: H1 W0 X6 d0 H
        </div><p></p></div>
: l/ u' H( A; d* N' t* Z6 h<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-7-7 08:37 , Processed in 0.064005 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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