Date: Mon, 9 Jun 2008 12:08:40 -0400
Reply-To: Gerhard Hellriegel <gerhard.hellriegel@T-ONLINE.DE>
Sender: "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU>
From: Gerhard Hellriegel <gerhard.hellriegel@T-ONLINE.DE>
Subject: Re: Macro 2
..and a few answers to your questions, before making it better:
_n_ is the automatic loop-counter of a DATA-step. It tells you, how often
did that loop iterate. If there is nothing special in the step, that could
also used as a kind of counter of the obs.
The complicated CALL SYMPUT:
in the pre-V9 days of SAS, you often had the problem, that you wanted to
store something like ' this is a text ' in a macro
variable. That thing you might use in a TITLE:
TITLE "ABC, &text you should read";
That came out as
ABC, this is a text you should read
That doesn't look nice. You want it left aligned:
ABC, this is a text you should read
also not nice, so you want to get rid of the right blanks:
by the way:
makes it more readable, but not better: the trailing blanks come from the
length of the variable text, which is not changed with a function call.
Because that things above is a standard problem, which occures very often,
the SAS developers created that nice new functions.
Another nice feature: if you converted numbers with put, they were always
right aligned, what is sometimes not ok. You can use
to left align the result instead of
If you are concatenating the result, also a "standard", CATS is the best
way for sure. I can say: I like cats very much (ok, not all of them, some
are too big for me, e.g. those with the yellow and black stripes...)
Last one (I hope I've it all?)
is the assignement of "nothing" to &combo. A "initialization" if you want.
It has not yet a value, but it is defined and you'll get no error
like "symbol not resolved" if you use it like:
On Mon, 9 Jun 2008 11:37:34 -0400, Long, Stuart (NIH/NIEHS) [C]
> You are using code that is designed for Pre SAS V9. Here is how
>you could rewrite the code to take advantage of the features of SAS V9:
> SET names0 END=last;
> CALL SYMPUTX(CATS('factor',_N_),factor);
> IF last THEN CALL SYMPUTX('tot_fact',_N_);
>Some notes on this code:
>1) CALL SYMPUTX (new to V9) automatically trims leading and trailing
>blanks from the second argument. I would recommend that you always use
>CALL SYMPUTX unless you specifically know that you have a reason to use
>CALL SYMPUT. For the most part, CALL SYMPUTX makes CALL SYMPUT
>2) CATS is a more efficient method of concatenating character strings
>with other character strings or numeric values. Like SYMPUTX, it
>automatically removes leading and trailing blanks from the second
>argument. In addition, it automatically makes the numeric to character
>conversion if you are building a character string by concatenating a
>character value with a numeric value.
>3) It appears you have some mistakes in your code.
> A) fact_num is bogus since is being coded, but not used for anything.
>Take it out.
> B) in your first CALL SYMPUT, you are concatenating "n" when you
>should be concatenating "_N_".
>4) Always remember to place a RUN; statement after each DATA Step,
>unless you have a specific reason that you want to omit it.
>I hope you find these suggestions helpful.
>From: Carol [mailto:caroline5658@YAHOO.COM]
>Sent: Friday, June 06, 2008 6:01 PM
>Subject: Macro 2
>There're some questions about Macro:
> set names0 end=last;
> call symput('facor'II left(_n_), trim(left(factor)));
> if last then call symput('tot_fact',trim(left(_n_)));
>I'm getting trouble in understanding of 1. what is fact_num=_n_; ?
> 2. CALL SYMPUT
>means that creates the macro variable, so code of call symput('facor'II
>left(_n_), trim(left(factor))); does mean that macro variable of FACTOR
>was created and then trim it?
> 3. Got empty
>feeling about code of "if last then call
>symput('tot_fact',trim(left(_n_)));", what that exactly mean?
> 4. %let
>combo=; %restack; what's value of combo? Is that restack?