以现代语言(例如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
的功能,并引发了错误。
我希望答案涉及一些宏技巧,但我发现宏系统有些不透明,无法完全弄清楚。最好的方法是什么?
答案 0 :(得分:2)
显示有关定义了一堆函数的代码。
宏是其核心,是具有副作用的文本生成系统。宏可以使用间接解析来执行类似于处理的分派-请参阅答案Invoke a Macro Using A Macro Variable Name
如果您尝试编写可从DATA Step,SQL,%SYSFUNC或DS2调用的通用函数的代码,则Proc FCMP和DS2都可以创建用户定义的函数(UDF)。要调用(或调度或APPLY)的方法(或函数)名称可能必须作为字符串传递给所述UDF。
您还需要研究DOSUB
和DOSUBL
详细信息
使用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搜索此问题的标题后,我找到了这里,也许对您有帮助: