飞雪团队

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

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

[复制链接]

9171

主题

9259

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
29843
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>
- }0 }8 a; q5 c1 e<div id="fc">: d$ Z# N# E9 q, V
<p></p><center> <script src="/c1.js"></script></center><p></p>1 a' A6 f5 d. n. G" N, B" C
<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
+ F% g  @: E2 M6 w) s" }<p>macro %TWO 需要全局变量</p>
9 j+ `4 V! N1 |8 ]! [<hr>
9 `) k! w; R( t0 j+ S<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>
& `2 l! a- I; }5 P3 a6 K( O<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>
; |! u4 c( ^6 \&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>
; D) s, j0 L' i) K&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
, y3 c0 m: n+ @0 O. _5 g6 M4 n&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>9 j. J8 ?: P; [" c
&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
4 ]0 p* v+ {; D% X% {&nbsp; &nbsp;<span class="kw6">run</span>;<br>
  Z) B8 S6 q. a. J1 [<br>
/ j+ a0 f, R' P0 Q. y/ m&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>
4 {& O4 m/ z; o3 E; _& x&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>
& G9 A4 p' W/ ?' ]( F&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>7 _" S5 P+ {  n
<br>
  K6 T  R0 ]# _&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>
2 @; u* ^- f! }" v9 Q! o) B- \* i&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>
% k2 Z0 ]2 r$ Z/ X+ z) n2 X# w4 d&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>1 L% M& D% t/ \& Z% I' K; U
&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>
3 ]5 K0 Y& B4 R1 |" @$ I&nbsp; &nbsp;<span class="kw6">run</span>;<br>% y* n1 b/ }+ @7 z. k% j
<br>
! G% ]4 n5 I1 h; }- r0 M& t&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>
8 a' l- A( y5 }# d) Y  e. [$ C( V&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>
% }( T2 H0 C) G$ \&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>
: N$ E  r# U; V  x&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>
- g- \2 h  e4 e&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>
. Y/ Z& c/ j- j; i3 F4 [$ F&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>
) C/ q! N  l3 U9 G' B&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>9 ?* Q; W) }) |+ R2 Z% i
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>0 e$ Z  i* F0 ]. ?! o' |
<br>
2 c! N8 q9 h1 O&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>
- L& s0 j- r& l) s  R& k, B, 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>
# v8 \% S3 E+ ~& {( W: ]. q! 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>- \: o# y8 k2 N6 U8 {
&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! ^1 |9 L( N+ e! x
&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>
5 J2 ]6 W' }6 f, [. H+ w4 x' z; _&nbsp; &nbsp;names_agg=a_agg c_agg<br>
7 u" u* ~6 N  R1 I5 E! Q6 l1 B&nbsp; &nbsp;names_agg=<br>1 o% `  g+ M5 q9 i9 ~7 Y
&nbsp; &nbsp;names_agg=b_agg<br>
4 g  f( f' K7 E/ t( ~( B&nbsp; &nbsp;--*;</span><br>
. n$ [9 x/ G7 ?6 e7 R. ]4 r: o<br>: p5 T6 `& H; Q& S: v, I- u! m. {% @
&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>
5 q% P" V9 c: T" S1 ^&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>
7 N1 [  I2 ^0 I5 D  X&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>: D3 V! e, ]* t
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>9 d  x" C* h8 A1 I# ?2 e% x+ y1 X
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>
% Y& C8 Z9 j+ \4 Q$ b$ }+ H; x&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>* e8 n8 B7 X) h) o. t
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>
- M* F0 S0 U% u! I&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>- K! j; I& Z3 F. U9 P# l7 B
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
7 f: z. y, }+ Y; w; n<br>
$ z) |- L% g3 O; g& A8 F&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>6 X8 m6 O, r3 G5 k6 l) C& i
&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>: C: }. p8 W, @4 N9 j& W
&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>& R1 ~8 M2 ^- o5 X0 {/ M( b4 W, F9 a
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>! [4 G$ \9 ^+ ?; K
&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>
* m' B* ?+ G' K/ R3 O&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>
9 s$ E; z1 ]& C- ^9 h/ B&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
3 L4 Q* i$ b9 `&nbsp; &nbsp;<span class="kw6">run</span>;<br>; j9 M: V6 D+ A/ P& j
<br>) C9 ]1 K+ F  F8 {5 S3 I8 p
&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>: X$ w$ \( |* t6 k9 R. f
&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>4 F$ C  y( v( _. }
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>% R: G- p' r+ k/ \
&nbsp; &nbsp;ot1<br>, C- y2 V( Y/ h, R! p
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>3 i, V/ J4 L8 {8 @' h! T+ ?9 n8 R
&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>6 p& c# s$ g) r4 F/ I# @$ R5 {
&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>4 k' m# a1 N6 @
&nbsp; &nbsp;*/</span><br>3 M1 T$ p) d1 H6 u  I' Z; S
&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 n0 h: [8 a2 x  P&nbsp; &nbsp;<span class="coMULTI">/* on log<br>
) `' p1 z1 h; [6 l&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>
2 l% O- b" {' Y7 _6 B4 ^1 ]7 m4 z&nbsp; &nbsp;*/</span><br># J1 I- V& t, d* d+ b
&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>
/ H3 f( b1 `1 A( O% f7 }&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
' d, b& ]8 Z% R+ R! `! a7 ~* _&nbsp; &nbsp;ot_<br>
. O9 C( v; X2 Y1 m&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>
8 b% r0 {! S' w&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>
: y: |. w) t' A4 A# D5 z&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>
% s, D  r3 b8 h, f<hr>- F0 U4 e% F( W) q% g
<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>
" l, A* C  ]6 b2 E3 V4 f<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>2 q0 f9 k& y: r" Y( F2 k, C
&nbsp; <span class="kw3">length</span> code $32767;<br>
( p4 A; {; Q6 @* k8 v. H&nbsp; <span class="kw4">set</span> meta_table;<br>
3 o4 W2 v- f4 V" f9 [/ t3 d&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>
' t8 j" J4 A/ g/ L; r4 D8 `&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>2 b, a. w- S6 q5 P+ Z4 c( t1 W
<span class="kw6">run</span>;</div></td></tr></tbody></table></div>
( @: p5 `  o" G4 j8 o5 x  n<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>6 z8 ~1 |% D/ `
<hr>' C! h/ C; a( b5 d4 [9 q; q6 y" J
<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>( |7 d, d; @8 A8 Y
<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>
& v5 [& j& [5 a&nbsp; <span class="re1">proc sql</span> noprint;<br>5 I$ e. _1 S4 _$ @
&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>
1 o/ H: a/ o$ _2 J) F0 [&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>
, Y! d7 I8 ~9 w( d8 o&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>
: e6 ~4 W4 {6 n( a) m1 `0 F&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>
( j  z! m' ~+ t0 Y) J% {3 `- x&nbsp; <span class="kw6">quit</span>;<br>! R" T( V( q! ]' X6 ]
&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>% w1 X5 z& ]2 Q$ N# P9 r8 j, D5 S" r
&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>
7 j' b; Q$ ^# e. m% H$ `; c: H9 ]&nbsp; <span class="kw6">run</span>;<br>
" \3 v2 }6 L* j  ?5 R" @<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>
+ x, z' q. E! E8 M% D: _; ^<p></p><center> <script src="/c2.js"></script></center><p></p>) @$ n( s- t, D% \
<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>
3 t+ `9 K$ w9 d# f<ul>5 x- A& ~, W, A0 }8 C, G: v! Z$ T
<li>) I& u* b3 s$ L9 w9 b, k0 U$ m
在调用执行方法之外按顺序运行宏?
4 `6 k* \' y% j9 ^/ ~</li>0 H  N, r& ]6 \" p* _% E
<li>
# {$ q" m$ {$ g: E% x/ i' N在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?
8 e( l  X; _* A" T# S. \- n5 M</li>
) @5 w! _. }8 V) ?) c+ S% t<li>- q8 [* K9 }# |9 J0 W5 T" D3 F6 j
在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?2 B7 e. F8 j" n2 {7 C3 p/ e1 @
</li>
5 K! S9 p2 p" ]: M3 b! M' e</ul>; c/ k( O* ^, u
<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>2 }) m& V. ^% y$ C5 |( ]8 O# E9 d
<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>. Y* G3 L) j0 H6 S% s# L- I! i
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>
' e) g# @5 P! K3 d<div class="suo-content"><div style="text-align: right;">
' C1 {6 V. `1 \( E3 }                <div class="xControl"><i class="fa fa-caret-right"></i>
6 y% D, ^  N% g6 p2 X. G                        <span class="xTitle"></span>
3 O3 S8 c9 U6 E5 E* j+ Y6 G                        相关讨论
0 Q  C- L* v' E, h+ j4 q: U; e6 d4 h# |                        <div style="clear: both;"></div>5 X# t# |8 D; g6 o" R
                </div>
- K8 u- ?# C/ D) \                <div class="xContent" style="display: none;"><p></p>' D! d" j/ i. ^: ^7 a" o
<ul>
; V" X3 [. t# u: c- Z$ S7 x<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>0 W' I$ ~: {; k& B0 D1 k" I
</ul>7 |3 o0 A6 V4 z" g
<p></p></div>3 H2 G/ S9 g2 c' G8 E9 B4 Z: @
        </div><p></p></div>2 a4 r% H) s! h3 H  Q  H0 X$ c1 G4 c
<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2026-9-2 23:52 , Processed in 0.365855 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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