具有可选参数的SAS用户定义函数

时间:2018-05-11 20:02:37

标签: sas user-defined-functions

有没有办法使用允许可选参数的PROC FCMP来创建用户定义的函数?

例如,我在SAS中编写了一个简单的udf来检查字符串是否为数字。

PROC FCMP OUTLIB = fcns.functions.all; 
   FUNCTION isNumeric(string $);
      result = ifn(verify(string, " -0123456789") = 0, 1, 0);
      RETURN(result);
   ENDSUB;
QUIT;

现在,我想检查通常与数字相关联的符号,例如$,.,但仅限用户指定。像这样:

PROC FCMP OUTLIB = fcns.functions.all; 
   FUNCTION isNumeric(string $, symbols=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;

运行上面的代码会出错。我在网上搜索过,但一直无法找到任何内容。甚至可以选择参数吗?如果它们不是,那么创建一个具有两个必需参数或两个单独函数的函数会更好吗?我倾向于拥有一个功能,但我想我会打开这个问题。

2 个答案:

答案 0 :(得分:2)

不幸的是,无法使用fcmp定义可选参数。这真是一种耻辱!

最接近的是使用varargs参数将最后一个值定义为数组(值)。这个问题的主要问题是所有值必须是相同的类型。

有关详细信息,请参阅docs

答案 1 :(得分:0)

不确定您在函数定义中尝试使用=0,但这是导致它无法编译的原因。

376     FUNCTION isNumeric(string $, symbols=0);
                                            -
                                            22
                                            200
ERROR 22-322: Syntax error, expecting one of the following: $, (, ), ',', DICTIONARY, DNARY, HASH, HITER, VARCHAR, [, {.
ERROR 200-322: The symbol is not recognized and will be ignored.

所以只需删除它。

proc fcmp outlib = work.functions.all;
function isnumeric(string $, symbols);
  if symbols then
    result = ifn(verify(string, " -0123456789$,.") = 0, 1, 0);
  else
    result = ifn(verify(string, " -0123456789") = 0, 1, 0);
  return(result);
endsub;
quit;