飞雪团队

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

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

[复制链接]

6865

主题

6953

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22925
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>
( X1 L: W% v# P7 T<div id="fc">
4 [' @# ]8 ]1 l% S5 \7 K<p></p><center> <script src="/c1.js"></script></center><p></p>
0 F* J# i, ?6 e6 x* W<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
% i3 \: P: c) `1 K<p>macro %TWO 需要全局变量</p>
0 T: q8 v! j& Y0 d<hr>
, r9 n: s& X2 F2 F<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>9 a) w3 V. u7 J7 c- B  Q' a0 E8 ^
<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 w. l1 V( Y, z
&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br># a* I# u' E& a. T0 _% Y, V
&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>: k' f) N- I+ z" c
&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>3 X6 F9 g3 ?9 S
&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
' G& f' N# I, Z: v5 O2 A1 [  |&nbsp; &nbsp;<span class="kw6">run</span>;<br>: ?3 y5 K! ?, R9 V+ z! k
<br>% I6 f* N8 s& H0 \! s: t8 g
&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>
! Z$ H) w$ I- D4 |5 e6 p&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>/ |/ V6 r7 {6 g* p
&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>
/ r* |& Q7 Z& X# A( S8 o<br>* o. d+ a9 J) ~
&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>
; j. A* t3 [: i&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>; x0 J- I) }4 s: Q9 B9 J8 D
&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>
# q: P3 ?1 H" b&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>) v* s, F. b' U* V
&nbsp; &nbsp;<span class="kw6">run</span>;<br>( r- Z  ~, L& u9 m' M/ @2 {
<br>9 R5 {2 R  M. v3 K, ?
&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>5 |1 z! y) v3 ?" o
&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>1 b' x, d$ a8 B# M  U: b. `/ u, ]
&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>
' P: Z  P1 I" r1 l1 }) s5 E&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>$ k& Z5 s$ C# H$ M+ }
&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>7 b. d9 X4 L- a6 J1 H" Y; D- s
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>
* U* i4 q5 R' p3 G2 l&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>
* A# ?7 _' r; x! e( y( l& V7 {&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
+ q" v" X9 c) K7 `; O( p8 T<br>
) k; R6 p6 J! d( f&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>: }# V7 \0 I6 E% c. C: a( s
&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>
+ c* w5 B$ j9 X* u; Q) \: I&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>
  M& r3 l( B- H. W: g9 e. R&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>
0 a" m4 ?" G& f/ `: G; x&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>
8 F5 T1 r* B4 I$ d# r5 v&nbsp; &nbsp;names_agg=a_agg c_agg<br>; H; Q9 E, m2 e7 d, V( R
&nbsp; &nbsp;names_agg=<br>
/ x6 {9 R! {# e; ]1 X* U&nbsp; &nbsp;names_agg=b_agg<br>, I0 U  L& N# t6 _( y* Y
&nbsp; &nbsp;--*;</span><br>0 G* f3 d5 v* i' i0 D
<br>
0 D9 L' Q' b6 A7 ]# l" L&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>
( v0 O5 M" }  l&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>* k" }  O" l# A/ a
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>$ F, F% l+ E7 Z: O. W+ [
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>0 g3 G4 a0 X4 u) E: R7 S
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>8 h6 e) [# m1 n. @
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>
: L. e( k/ O' \$ W7 E! J&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>. G; l2 c6 m! d
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>
: i& k4 r6 }5 k, y3 {&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>6 g, e6 }0 h" I# o( V/ T' `  ?# k3 W7 c- X
<br>
0 P( O+ O$ @7 j) |&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
* k: U9 f/ ?7 ]9 _&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>
8 l3 G" Z, |' E- [# D/ U4 v&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>
. s5 i+ U% g, U% I/ J" v6 j&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>5 j0 ~) G5 X7 l, z9 F0 {
&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>
7 S( S& C7 q, @' d5 W&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>
& w5 F1 X6 w. r' [3 t" G! l$ S&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>- |. v! v8 e# _1 D
&nbsp; &nbsp;<span class="kw6">run</span>;<br>9 e  U( @  T  T0 T
<br>
0 y6 e3 N5 ]; `) p/ G- }1 v4 {&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>
: Q$ l! y/ _* w/ T4 y7 X&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>
& e) `; U" Z# R7 e0 T3 r&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
, |4 I: V: \  _$ g9 b&nbsp; &nbsp;ot1<br>
7 Z; d: z# ]3 q6 E- i1 q3 L; c% U&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>0 ?* F1 p3 R$ o' n' p
&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>
% D2 u) L4 N" o" [# B& q& z&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>' U  B+ p! P0 `, j. ~  F0 d1 ?
&nbsp; &nbsp;*/</span><br>
1 `$ ?" @# ?$ [+ ^  c&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>  e  K8 |' X% _/ B
&nbsp; &nbsp;<span class="coMULTI">/* on log<br>8 `1 N7 {+ O% T' E' q# b
&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>
$ P( E9 X1 R5 d7 ]# K&nbsp; &nbsp;*/</span><br>
+ H1 d9 }/ e( A* O& }: T% Q5 @1 d&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>
& I- I3 [/ f" Y&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>. y6 B5 m+ `6 Y/ `5 D1 d5 f6 l
&nbsp; &nbsp;ot_<br>1 @& A5 z# N5 {, @% @5 S
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
+ q- N3 p# w5 y. j+ U) z&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>5 G- z7 a0 l6 l2 M- h% y" d
&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>
8 `" Y8 B) {4 U: x2 F0 P. O/ W5 U, y<hr>! a1 o. a1 K4 ~" }- E$ E9 t3 L8 P
<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>/ ^7 P" W; b5 |. J! Y" 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>8 S$ C- f  M$ N& _# X/ f9 S
&nbsp; <span class="kw3">length</span> code $32767;<br>* F! @$ y# h/ u) I
&nbsp; <span class="kw4">set</span> meta_table;<br>
7 U; q& Y2 c, V) ?% \&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>2 d3 V' \9 \: S2 g9 ^
&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>+ @+ f& _; P/ A1 m8 K# h$ G0 Y& O
<span class="kw6">run</span>;</div></td></tr></tbody></table></div>
) p0 ^- m5 P: W! Y<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>
% b9 U/ q$ n- }, c: Q3 f<hr>
* z# z3 n7 V, p) D$ g<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>
" s) J3 \9 V& H% D% E<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>
4 s  ^% [8 ?2 x0 }* K  A6 ?) _&nbsp; <span class="re1">proc sql</span> noprint;<br>- v6 q8 F$ A5 h3 T7 v! m% F
&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>
, y3 o% m- a& D- v&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>  |% d& h  D- w) W+ t3 z  ~+ W: I# Y
&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>" h- i7 E; k+ G$ D+ v
&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>
( {& @( Z& _9 O6 ?  W3 ]" p' a( \&nbsp; <span class="kw6">quit</span>;<br>' p) N; b$ U" L# D* R9 r6 I5 r% _
&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>2 B+ A! a( |+ m0 F, d
&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>
  v% O2 y7 \+ J% J/ @: ?/ @& w. F9 e&nbsp; <span class="kw6">run</span>;<br>8 l, }1 l) S' x8 [% R0 Z( q: e
<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>* r; }4 P8 y" h/ F0 H6 J
<p></p><center> <script src="/c2.js"></script></center><p></p>
* o. b( o( r- ]& ~$ j9 H<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>; t) [+ J3 E0 N9 Q, w2 v
<ul>
; P( I% v( s" K  b8 h<li>, ?1 t  Z7 o( q2 ]( L9 C% E7 {* X
在调用执行方法之外按顺序运行宏?7 u% p- a3 U: f; `9 A
</li>
$ G' X: v1 N6 e( s9 ~: j" g! M<li>- t8 ^( z" i& i
在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?) o% Q, f2 c* c0 y; ^
</li>, b  F# i0 @5 t7 s
<li>* f" |$ M" \- b) e! d% j
在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?
/ ?7 W- ^* h  R3 {0 r  I' ~</li>. W3 c& s7 R$ v/ B1 `; ]0 W
</ul># c; X/ ]$ K7 s) r; r5 {
<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>2 q2 Z* J! L- }* K8 }
<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>
- X; S' U' d4 |* Z* [* d<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>6 p5 _7 L4 ]* I5 S+ B* J
<div class="suo-content"><div style="text-align: right;">
. O! G0 u" J4 e2 I# S                <div class="xControl"><i class="fa fa-caret-right"></i>
  A! C" ?$ o/ K* y5 [' t                        <span class="xTitle"></span>4 E- `* v6 \, w2 J
                        相关讨论
$ X- b* L* v0 X: l4 z- i- a; k# o: _                        <div style="clear: both;"></div># G  a& @8 o- _3 h4 p
                </div>
' A, _, i; U. v/ v                <div class="xContent" style="display: none;"><p></p>: v; J/ \# m' s) l
<ul>
1 `- P. E  _& D<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>
# q! {, f, G( Z& X</ul>7 o2 B6 A: h5 Z
<p></p></div>. I! d9 H4 H3 a3 z- l
        </div><p></p></div>
, a" |: a2 P7 I$ {# v7 k<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-7-3 15:49 , Processed in 0.073961 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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