BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
natmaks
Calcite | Level 5

I am trying to write my first macro and I am having problems manipulating the parameters inside macro. This is the code:

%macro SecondDerivative_New (parlambda, parepsilon);

    m=%sysevalf(&parlambda+&parepsilon); /* this gives an error ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The                                                                  condition was:    lambda+epsilon  */

    result1=%FirstDerivative(parlambda=m);

%mend;

%macro FirstDerivative (parlambda=);

    10/&parlambda+24*(exp(-1*&parlambda))/(1-exp(-1*&parlambda))-28.52;

%mend;

/* call macro */

data;

lambda=0.799;

epsilon=0.001;

%SecondDerivative_New(lambda,epsilon);

Thank you

1 ACCEPTED SOLUTION

Accepted Solutions
PaigeMiller
Diamond | Level 26

I assume that you have greatly simplified things from a much more complex situation.

Based on what you have shown, macros are completely unnecessary here, but maybe they are needed in a more complex situation...

You cannot add data set variables using %SYSEVALF. You can only add macro variables using %SYSEVALF.

So, &parlambda resolves to lambda (which is not a macro variable, it is a datastep variable). &parepsilon resolves to epsilon (which is not a macro variable, it is a datastep variable).

If your macro is always going to have arguments that resolve to datastep variables, then you simply say

m=&parlambda + &parepsilon;

But as I said, using macros and macro variables in this simple situation is completely unnecessary.

--
Paige Miller

View solution in original post

2 REPLIES 2
PaigeMiller
Diamond | Level 26

I assume that you have greatly simplified things from a much more complex situation.

Based on what you have shown, macros are completely unnecessary here, but maybe they are needed in a more complex situation...

You cannot add data set variables using %SYSEVALF. You can only add macro variables using %SYSEVALF.

So, &parlambda resolves to lambda (which is not a macro variable, it is a datastep variable). &parepsilon resolves to epsilon (which is not a macro variable, it is a datastep variable).

If your macro is always going to have arguments that resolve to datastep variables, then you simply say

m=&parlambda + &parepsilon;

But as I said, using macros and macro variables in this simple situation is completely unnecessary.

--
Paige Miller
natmaks
Calcite | Level 5

thank you. Yes, it is just a simplified piece.

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 2 replies
  • 1252 views
  • 0 likes
  • 2 in conversation