(SAS)将函数作为参数传递给函数(或宏)

时间:2018-08-31 09:46:41

标签: sas sas-macro

以现代语言(例如python),您可以做类似的事情

def do_a_thing(foo,bar):
    thing = (... do a thing to foo(bar) ...)
    return thing

在SAS中如何做到这一点(或足够类似的东西)?在我的具体应用程序中,我定义了一堆函数,并且需要对它们全部执行相同的操作,因此我认为最好有一个将函数作为参数的函数,然后执行该操作到该函数,然后在需要的地方应用它。例如,“显而易见的”解决方案不起作用在proc fcmp中这样做:

function do_a_thing(foo,bar);
    thing = (... do a thing to foo(bar) ...)
return(thing);
endsub;

此操作失败,因为SAS不知道任何称为foo的功能,并引发了错误。

我希望答案涉及一些宏技巧,但我发现宏系统有些不透明,无法完全弄清楚。最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

显示有关定义了一堆函数的代码

宏是其核心,是具有副作用的文本生成系统。宏可以使用间接解析来执行类似于处理的分派-请参阅答案Invoke a Macro Using A Macro Variable Name

如果您尝试编写可从DATA Step,SQL,%SYSFUNC或DS2调用的通用函数的代码,则Proc FCMP和DS2都可以创建用户定义的函数(UDF)。要调用(或调度或APPLY)的方法(或函数)名称可能必须作为字符串传递给所述UDF。

您还需要研究DOSUBDOSUBL

  

详细信息

  使用DOSUBL函数可以在传递文本字符串后立即执行SAS代码。在执行提交的代码期间创建或更新的宏变量将被导出回调用环境。   

如果能够执行SAS代码,则DOSUBL返回零值;如果无法执行SAS代码,则返回非零值。

对于现代... SAS SCL早在CALL时就已适用-遗憾的是,SCL从未将其应用于Foundation产品或逃脱了SAS的限制。

答案 1 :(得分:1)

您还没有真正显示可能需要(甚至有用)的示例。

但是通常在SAS中,您将使用代码生成来实现这种类型的错误定向。例如,您的第二个“函数”可以是语句样式宏。那是宏,它仅发出要包含在要创建的实际SAS程序中的语句的一部分。

%macro do_a_thing(function,arglist);
  &function(&arglist)
%mend;

然后您可以在程序中使用它

data want ;
  set have ;
  mean = %do_a_thing(mean,of _numeric_);
  std = %do_a_thing(std,of _numeric_);
run;

对于更复杂的事情,您将遇到更多麻烦。新颖的DOSUBL()函数可能会有所帮助,因为它们可以允许您在单独的执行空间中运行多个步骤。但是对于大多数事情来说,性能成本可能太高了,以至于不值得花点时间。

答案 2 :(得分:0)

对SAS并不太了解,但是一般来说,您需要某种方法来区分调用函数和传递参数。

在Google搜索此问题的标题后,我找到了这里,也许对您有帮助:

https://communities.sas.com/t5/SAS-Procedures/how-to-pass-a-parameter-with-macro-variables-into-macro/td-p/330627#messageview_4