【问题标题】:SAS User-Defined Function with Optional Parameters具有可选参数的 SAS 用户定义函数
【发布时间】:2018-05-11 20:02:36
【问题描述】:

有没有办法使用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;

运行上面的代码会报错。我在网上搜索过,但找不到任何东西。可选参数甚至可能吗?如果不是,最好创建一个带有两个必需参数的函数,还是创建两个单独的函数?我倾向于拥有一个功能,但我想我会提出这个问题。

【问题讨论】:

  • PROC FCMP 文档是怎么说的?通常要确定一个字符串是否是一个数字,你可以用 COMMA 信息读取它,如果它返回非缺失,你就很好。负责 1.4E5 之类的事情。
  • 错误信息是什么?它没有编译吗?还是在你尝试使用的时候出错了?
  • @tom 当我尝试编译(可能不是正确的词)函数时,它给了我Syntax error, expecting one of the following: $, (, ), ',', HASH, HITER, [, {. 但我认为@allan 是正确的,他们只是不允许这样做,用数组参数的“异常”。
  • @data_null_,感谢您的提示,我会记住的。虽然这实际上只是一个示例函数,所以我可以掌握在 SAS 中创建 udf 的窍门。

标签: sas user-defined-functions


【解决方案1】:

很遗憾,无法使用 fcmp 定义可选参数。真是太可惜了!

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

请参阅documentation 了解更多信息。

【讨论】:

  • 感谢您确认我的想法。 SAS 文档并不总是最清晰的,至少对我来说不是。
【解决方案2】:

不确定您试图对函数定义中的 =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;

【讨论】:

  • 我认为使用 =0 他试图创建一个可选参数并给它一个默认值,就像使用宏语言关键字参数一样。 FCMP不可能吗?从一个快速的谷歌,它看起来并不乐观。例如communities.sas.com/t5/Base-SAS-Programming/…
  • @Quentin 是正确的。我可以轻松删除=0,但是当我希望创建一个可选参数时,这将导致该参数是必需的。
  • 不确定添加=0 对参数是否为required 有何影响。我认为编码到函数中的逻辑决定了参数是否需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多