飞雪团队

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

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

[复制链接]

6738

主题

6826

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22542
发表于 2022-2-12 18:06:13 | 显示全部楼层 |阅读模式
<h2>Macro variables issue when using call execute</h2>) a! p4 b+ h4 @( U& D3 b
<div id="fc">
" E4 p6 k* L3 @- q<p></p><center> <script src="/c1.js"></script></center><p></p>& F  N" a( d- b; q
<p>我在下面有 2 个宏,我正在尝试像使用元数据表的循环一样依次执行 1,并在数据步骤中调用执行命令。</p>
4 ]* H: [8 L0 w. g7 V" }<p>macro %TWO 需要全局变量</p>& O# f/ \/ h4 Z: q: ?8 \
<hr>
+ K  ?2 O- Y0 E7 |<p>您可以使用 <wyn>%nrstr()</wyn> 延迟宏调用,然后它就可以正常工作了。</p>$ [4 _% A6 C) S1 F# Q
<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>- r) N1 r9 U1 n$ E9 c8 ?3 d8 n
&nbsp; &nbsp;<span class="kw6">data</span> dataset;<br>3 w# j& D: t0 @, \' u5 d
&nbsp; &nbsp; &nbsp;name=<span class="st0">"a"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>
( h9 p# J  q- L0 [& D&nbsp; &nbsp; &nbsp;name=<span class="st0">"b"</span>; condition=<span class="st0">""</span>; <span class="kw4">output</span>;<br>  K8 t6 Z# X( l- y
&nbsp; &nbsp; &nbsp;name=<span class="st0">"c"</span>; condition=<span class="st0">"1"</span>; <span class="kw4">output</span>;<br>& p; i* i8 l+ Y6 A- O0 d/ Y
&nbsp; &nbsp;<span class="kw6">run</span>;<br>3 a4 W$ `$ W) g/ d# F+ X4 c/ i; \
<br>* q. H7 e, P; _0 q4 @& g% j% Y% j9 n
&nbsp; &nbsp;<span class="kw6">data</span> a_agg; v=<span class="st0">"a_agg"</span>; <span class="kw6">run</span>;<br>
+ ]6 ^+ U" W$ Z$ k. e&nbsp; &nbsp;<span class="kw6">data</span> b_agg; v=<span class="st0">"b_agg"</span>; <span class="kw6">run</span>;<br>
, t+ U( r( Q7 _* Y7 _' n( T& l&nbsp; &nbsp;<span class="kw6">data</span> c_agg; v=<span class="st0">"c_agg"</span>; <span class="kw6">run</span>;<br>
- s6 H9 E% ^( i$ q5 Y" j; d<br>: }: x4 u, [3 W6 q4 G1 t4 `
&nbsp; &nbsp;<span class="kw6">data</span> meta_table;<br>5 h' }3 E" J* I2 G1 |& H# H  D
&nbsp; &nbsp; &nbsp;condition=<span class="st0">"1"</span>; name_ot=<span class="st0">"ot1"</span>; <span class="kw4">output</span>;<br>3 X5 _$ ~/ t$ G9 {& U& S
&nbsp; &nbsp; &nbsp;condition=<span class="st0">"2"</span>; name_ot=<span class="st0">"ot2"</span>; <span class="kw4">output</span>;<br>
2 F+ Z/ ]" N, \1 O% w&nbsp; &nbsp; &nbsp;condition=<span class="st0">""</span>; name_ot=<span class="st0">"ot_"</span>; <span class="kw4">output</span>;<br>
, i. A1 v& u  p% o2 l&nbsp; &nbsp;<span class="kw6">run</span>;<br>
* Y$ Z1 e" Y9 V) _6 X$ C1 t  [<br>$ m* A" R" V0 E7 ?
&nbsp; &nbsp;<span class="kw2">%macro</span> one<span class="br0">(</span>condition<span class="br0">)</span>; <br>5 x4 g1 Q1 c7 y3 L1 S
&nbsp; &nbsp; &nbsp;<span class="kw2">%global</span> names_agg; &nbsp;<br>5 X' q+ [& q9 h6 R6 _5 w; m8 K. O
&nbsp; &nbsp; &nbsp;<span class="kw2">%let</span> names_agg = ; <br>
4 @( x- z1 [* A7 |&nbsp; &nbsp; &nbsp;<span class="re1">proc sql</span> noprint;<br>
2 [8 o; [  M7 X&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>2 j. D; b( }9 z* |) g& w5 N, H
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">from</span> dataset <span class="kw4">where</span> condition =<span class="st0">"&amp;condition."</span>;<br>
* Z- i6 Z6 G+ h&nbsp; &nbsp; &nbsp;<span class="kw6">quit</span>;<br>
. u0 N; L: z1 \! h6 P/ }&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>
# B$ |. C2 q- {<br>8 X. K* d* k5 B7 R. [
&nbsp; &nbsp;%<span class="coMULTI">*-- just checking --*;</span><br>! @; ?2 ?: _8 ^# x  ~; z4 O. a
&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>& n9 U7 D# W4 k* b
&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>8 n7 j6 H, s8 _* J# Y$ T- @* v5 g3 s
&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>
8 y* k2 p) W8 X. f# G&nbsp; &nbsp;%<span class="coMULTI">*-- on log<br>6 U4 n& O0 U# g% |9 ~& s! w# D
&nbsp; &nbsp;names_agg=a_agg c_agg<br>
8 z- S6 a3 m) W1 ]4 b&nbsp; &nbsp;names_agg=<br>3 j7 _! T. k& m. J4 v8 u' _
&nbsp; &nbsp;names_agg=b_agg<br>  Q5 k$ N7 b7 A8 n+ ?, C* g: @
&nbsp; &nbsp;--*;</span><br>
7 T6 B9 P' e" V, Q% H2 F<br>
% g: @/ I, \7 l6 Q" e$ J1 D&nbsp; &nbsp;<span class="kw2">%macro</span> two<span class="br0">(</span>name_ot<span class="br0">)</span>;<br>$ D" [' L% p3 p+ l- e( r' |6 q& _
&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 `, B/ I% Q, Z5 `& `: X, a8 B& @* X&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.; <span class="kw6">run</span>;<br>
: l" F: P; {3 [( s4 W&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>; <span class="kw2">%else</span> <span class="kw2">%do</span>;<br>* y* }4 Z/ u# q# `
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">data</span> <span class="re0">&amp;name_ot</span>.;<br>
$ j. p& v0 |0 b&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">set</span> <span class="re0">&amp;names_agg</span>.;<br>
" m8 V6 H$ Z( i- V&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw6">run</span>;<br>  x( s0 S% z1 @3 b  v
&nbsp; &nbsp; &nbsp;<span class="kw2">%end</span>;<br>0 Y6 W. M/ j# R) B9 Z5 j" K6 u1 L
&nbsp; &nbsp;<span class="kw2">%mend</span>;<br>, U; ^" f  j$ D; v+ i& k
<br>5 g0 E6 g1 r. Z2 z
&nbsp; <span class="kw6">data</span> <span class="kw1">_null_</span>;<br>
3 Z/ s# i( A3 l+ s0 I&nbsp; &nbsp; &nbsp; <span class="kw3">length</span> code $200;<br>
  \2 d* \- ?. C$ ^. W3 C: C&nbsp; &nbsp; &nbsp; <span class="kw4">set</span> meta_table;<br>" T8 K& S8 Z( C7 e$ z, j# Z' b
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%one('</span>, condition,<span class="st0">")"</span><span class="br0">)</span>;<br>
# z* y  Y1 N5 |7 k5 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>6 o# S! E, e- n, F) ^
&nbsp; &nbsp; &nbsp; code = catt<span class="br0">(</span><span class="st0">'%nrstr('</span>, code,<span class="st0">")"</span><span class="br0">)</span>;<br>
  ?: s; A. Z) n. d# U1 Y# ~&nbsp; &nbsp; &nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
6 h! {& t, E! M) x. O&nbsp; &nbsp;<span class="kw6">run</span>;<br>
: n* H& t& Q& ?3 I/ Y<br>
3 b/ b0 l4 e! I" A8 S9 X&nbsp; &nbsp;<span class="coMULTI">/* check */</span><br>
( I4 ~& I% _$ F" x. H& v&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>
9 p, Z0 A! M- W' ~$ E9 z, [5 t&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>
. h9 g1 [) Z# u&nbsp; &nbsp;ot1<br>/ p& K9 [2 e# @$ O
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>6 Y% G: ^1 ?% E( ^
&nbsp; &nbsp; 1 &nbsp; &nbsp; a_agg<br>
, a9 q2 S& z8 _7 F, [9 F, M! n4 t' r' y&nbsp; &nbsp; 2 &nbsp; &nbsp; c_agg<br>2 c( V! V" F  R  h6 x0 J7 g
&nbsp; &nbsp;*/</span><br>8 c' {! E; T, l: I
&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>
9 D* n6 Y2 {1 Q5 l&nbsp; &nbsp;<span class="coMULTI">/* on log<br>
2 @( @0 x: n( n) q&nbsp; &nbsp;NOTE: No variables in data set WORK.OT2.<br>8 y6 k! @- ~* g& l% m) b# J
&nbsp; &nbsp;*/</span><br>7 A' ~8 h7 }& k! D* T# w
&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># |# [) x, Q! g4 t0 `( u
&nbsp; &nbsp;<span class="coMULTI">/* on lst<br>: A  V& L, Y0 f" m2 m6 Y
&nbsp; &nbsp;ot_<br>- K/ m( l& H4 N' z4 j& l3 u7 e
&nbsp; &nbsp;Obs &nbsp; &nbsp; &nbsp;v<br>, D9 b0 M& f! u% X
&nbsp; &nbsp; 1 &nbsp; &nbsp; b_agg<br>
0 g7 h' S: U, U; G&nbsp; &nbsp;*/</span></div></td></tr></tbody></table></div>
9 P, {6 ~+ {6 S3 v0 q<hr>
) H# V; q% G8 g6 W8 z0 v<p>您可能需要在数据步骤中将双引号更改为单引号,如下所示:</p>
! J% s7 _* q( w5 a8 p: H' T$ I8 }<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>* ~( \# W( U6 u9 t) f
&nbsp; <span class="kw3">length</span> code $32767;<br>6 e  B  a8 v7 `+ B- a! @. f
&nbsp; <span class="kw4">set</span> meta_table;<br>
: V- X' }$ r% [7 [&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>
7 d6 `% A/ a" J, T4 I# C8 {&nbsp; <span class="kw4">call</span> execute<span class="br0">(</span>code<span class="br0">)</span>;<br>
% l+ w% I" r5 z) W& F<span class="kw6">run</span>;</div></td></tr></tbody></table></div>  r+ i5 e( b. }/ e! z  R7 [' P' m, _
<p>现在宏处理器正在尝试解析第 3 行中的百分比符号。您可以通过使用单引号隐藏它们来阻止它这样做。</p>9 z# ?' i$ N( t
<hr>  Q7 ^3 |! _$ O- p
<p>除非您已经为您发布的示例从宏中削减了很多,否则很难理解为什么要使用两个宏而不是一个宏来执行此操作(或者实际上为什么您\\ '会使用宏来做到这一点)像这样:</p>
; K8 o7 W; Q2 t% 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>
& A. u  A  H. w% c, ]- [9 l  ^&nbsp; <span class="re1">proc sql</span> noprint;<br>7 F. f1 n% f( t# Z7 t+ @2 o
&nbsp; &nbsp; <span class="kw4">select</span> cats<span class="br0">(</span>name,<span class="st0">"_agg"</span><span class="br0">)</span><br>
2 w/ a! I  Z, w! E% @( ^&nbsp; &nbsp; <span class="kw4">into</span> :names_agg separated <span class="kw4">by</span><span class="st0">""</span><br>
3 f3 u: M) Z/ X" L&nbsp; &nbsp; <span class="kw4">from</span> dataset<br>" \( W' ], d" P. F+ [) S$ I" [% C- m8 f
&nbsp; &nbsp; <span class="kw4">where</span> condition=<span class="st0">"&amp;condition"</span>;<br>: e6 z+ c) G% t. [1 E$ n& ?
&nbsp; <span class="kw6">quit</span>;<br>
3 s8 A5 k" C( q) Q&nbsp; <span class="kw6">data</span> <span class="re0">&amp;name_OT</span>;<br>
6 j8 i6 ?4 w( }$ G- D# [&nbsp; &nbsp; <span class="kw4">set</span> <span class="re0">&amp;names_agg</span>;<br>
% E( P  \6 e4 v6 [&nbsp; <span class="kw6">run</span>;<br>) D; L- G' p" g& `
<span class="kw2">%mend</span>;</div></td></tr></tbody></table></div>
7 _5 M, I4 [! \  o) k<p></p><center> <script src="/c2.js"></script></center><p></p>1 |& h- I1 k7 O: p) q
<p>无论如何,关于调用之间的宏变量发生了什么等问题,你尝试过吗</p>4 ]7 L) B  ?9 @! S/ R; F
<ul>0 |3 [3 H' g) f9 ^5 i
<li>
( J7 [" ?2 s& @$ b在调用执行方法之外按顺序运行宏?
5 J: P3 I1 i, q4 O/ |</li>* U' L4 ~+ }8 ?8 S8 I/ F( d. a$ E
<li>
1 W8 z* i" |# i6 x1 E在执行之前设置 <wyn>options mprint mlogic symbolgen;</wyn> 以查看日志中的调试信息?
- _9 M. |0 R) C$ F</li>7 c3 a8 d- p* r! x
<li>
! D, i& y* U! b在您的宏中使用一些 <wyn>%put</wyn> 语句,并在您的 <wyn>call execute</wyn> 数据步中使用 <wyn>put</wyn> 语句,以便查看在各个点生成了什么?
8 H7 D8 b4 u* {% p  \- d! k</li>
- m/ n" B1 M; b+ a</ul>% Q( s+ R9 x7 n1 |4 `
<p>建议在开发宏应用程序时首先让代码运行而不使用宏,然后添加宏变量并显式 <wyn>%let</wyn>-ting 其值,然后在宏的上下文中对其进行测试。之后将移至 <wyn>call execute</wyn>。</p>
* e1 N/ x$ V: v<p>也许尝试以上几点,然后返回一些我们可以调试的日志输出。您发布的代码中还有一些其他错误/问题,但我没有指出它们,而是假设您正在将其缩减为 SO 帖子。</p>! a# a, \8 {) H. x! ^
<p>顺便说一句,我喜欢使用 <wyn>data _null_</wyn> 和 <wyn>call execute</wyn> 驱动数据驱动代码的想法,我经常使用这种方法。</p>) ~# s( C% s7 D' j& K
<div class="suo-content"><div style="text-align: right;">
9 C1 e2 x3 G0 M- x% `. c. A                <div class="xControl"><i class="fa fa-caret-right"></i>
* {* b9 w: P$ M, r. P                        <span class="xTitle"></span>
$ v" R0 g: B( f( R! X                        相关讨论* u! a+ ]; m, b- m7 x( K
                        <div style="clear: both;"></div>
; U5 Y( _4 U* P7 }  x0 x  O8 ^& d                </div>) J$ @. ~! m6 R+ @" G& [- o( H
                <div class="xContent" style="display: none;"><p></p>3 N8 o( Y' \2 X
<ul>  a4 H2 R2 ^+ U, W9 S4 m( C
<li>嗨 sasfrog,我最初确实使用了一个宏,该宏在正常运行宏时起作用,但在调用内部执行</li>/ N7 P0 R( J' O
</ul>
% R& E: `! s1 A( q/ G: ~<p></p></div>& m* A$ N: k/ @7 f! S7 H
        </div><p></p></div>
/ d4 }0 r% h8 q+ a0 O  E- }: i: A<hr></div>
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-6-16 05:56 , Processed in 0.062709 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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