如何用SAS的PROC FCMP创建带可选参数的自定义函数?
关于PROC FCMP自定义函数可选参数的问题解答
首先明确说:PROC FCMP完全支持可选参数,只是你之前的语法用错了!FCMP里定义可选参数不能直接写symbols=0,而是要把可选参数放在所有必填参数的后面,并用DEFAULT=关键字指定默认值。
修正后的代码示例
你原来的代码只需要调整函数定义的语句,就能实现可选参数的效果:
PROC FCMP OUTLIB = fcns.functions.all; FUNCTION isNumeric(string $, symbols DEFAULT=0); IF symbols = 0 THEN result = ifn(verify(string, " -0123456789") = 0, 1, 0); ELSE result = ifn(verify(string, " -0123456789$,.") = 0, 1, 0); RETURN(result); ENDSUB; QUIT;
调用方式说明
修改后你可以两种方式调用这个函数:
- 只传字符串参数,此时
symbols会自动使用默认值0:data test; input str $20.; num_flag = isNumeric(str); datalines; 1234 -567 12a3 $1,234.56 ; run; - 手动指定
symbols参数的值,比如检查带符号的数值:data test2; input str $20.; num_flag = isNumeric(str, 1); datalines; $1,234.56 789.00 abc123 ; run;
单函数 vs 两个独立函数的选择
完全推荐你用单函数带可选参数的方案,原因很简单:
- 维护成本更低:不用重复写两套逻辑,后续要修改判断规则(比如新增支持的符号),只需要改这一个函数就行。
- 用户调用更灵活:使用者可以根据自己的需求选择是否传递第二个参数,不用记两个不同的函数名(比如
isNumeric和isNumericWithSymbols)。 - 逻辑更统一:本质上这是同一个功能的不同模式,放在一个函数里更符合代码的聚合性原则。
如果遇到多个可选参数的场景,只需要把所有可选参数依次放在必填参数后面,每个都用DEFAULT=指定默认值即可。
内容的提问来源于stack exchange,提问作者ddavidd
相关产品推荐
相关产品推荐

