【问题标题】:pass value of the dataset sas to a macro将数据集 sas 的值传递给宏
【发布时间】:2015-01-22 12:18:02
【问题描述】:

我正在学习 sas 宏语言,但我遇到了问题 我写了一个宏:

%macro avg_acceleration(mark_type, avg_acceleration, mark_angle);
%if &mark_type='A' %then %sysfunc(abs(&avg_acceleration/%sysfunc(cos(%sysfunc(abs(&mark_angle*( 3.1415926535897/180.0)))))));
%else %if &mark_type='C' %then %sysfunc(abs(&avg_acceleration/%sysfunc(sin(%sysfunc(abs(&mark_angle*( 3.1415926535897/180.0)))))));
%mend avg_acceleration;

然后我想做的是在另一个宏中启动一个宏:

%macro statistiche;
data pippo;
set prova;
a = mark_type;
b= avg_acceleration;
c = mark_angle;
avg_acc=%avg_acceleration(a, b, c);
run;
%mend statistiche;

%statistiche;

但我有这个错误:

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, a missing value, INPUT, PUT.

不能这样使用宏吗??做我想做的事情的正确方法是什么???谢谢

【问题讨论】:

  • 您正在以不应该的方式组合数据步骤和宏语言。宏语言编写代码,然后由数据步骤执行;它不应该执行函数本身。

标签: sas sas-macro


【解决方案1】:

不知道为什么要使用 2 个宏来执行此操作。为什么不只是一个简单的数据步骤?

data work.test;
set work.prova;
if mark_type='A' then do;
    avg_acc=abs(avg_acceleration)/(cos(abs(mark_angle)*(constant('pi')/180.0)));
end;
if mark_type='C' then do;
    avg_acc=abs(avg_acceleration)/(sin(abs(mark_angle)*(constant('pi')/180.0)));
end;
run;

【讨论】:

  • 是的,你是对的,但我想用另一个宏来重用代码在另一个数据步骤中
  • 然后就拿我上面的代码,把它变成一个宏,并传递给它2个变量——数据集输入和数据集输出。
【解决方案2】:

重复代码较少的替代数据步骤:

data work.test;
  set work.prova;
  select (mark_type);
    when('A') phase = 0;
    when('C') phase = 90;
  end;
  avg_acc=abs(avg_acceleration)/cos((mark_angle + phase)*constant('pi')/180.0);
run;

如果您想捕获此逻辑以便在其他数据步骤中重复使用,并选择使用不同的数据集变量代替原始变量,您可以执行以下操作:

%macro avg_acceleration(mark_type        =mark_type,
                        avg_acceleration =avg_acceleration,
                        mark_angle       =mark_angle,
                        avg_acc          =avg_acc
                       );
      select (&mark_type);
        when('A') phase = 0;
        when('C') phase = 90;
      end;
      &avg_acc=abs(&avg_acceleration)/cos((&mark_angle + phase)*constant('pi')/180.0);
%mend;

那么你应该可以按照你最初的预期调用它或更少:

data work.test;
  set work.prova;
  %avg_acceleration;
run;

【讨论】:

  • 为什么要为 mark_angle 添加相位?你能解释一下原因吗?无论如何,我尝试运行您的 avg_acceleration 宏,但结果不正确。
  • 抱歉 - 作为一名数学专业的毕业生,我已经很久没有使用带度数而不是弧度的三角函数了,我忘记了我需要以度数指定相位。现在可以使用了。
  • 这是使用几个身份来简化表达式 - cos(x + pi/2) = sin(x) 保存一行,cos(x) = cos(-x) 避免使用 abs()
  • 对不起,我还没看到
猜你喜欢
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多