Пользовательская функция SAS с дополнительными параметрами - PullRequest
0 голосов
/ 11 мая 2018

Есть ли способ создать пользовательскую функцию, используя PROC FCMP, которая допускает необязательные параметры?

Например, я написал простой udf в SAS, который проверяет, является ли строка числовой или нет,

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 голосов
/ 12 мая 2018

К сожалению, невозможно определить дополнительные параметры с помощью fcmp.Это настоящий позор!

Самое близкое, что вы можете придумать, это определить ваше последнее значение как массив (значений), используя аргумент varargs.Основная проблема заключается в том, что все значения должны быть одного типа.

Подробнее см. документация .

0 голосов
/ 12 мая 2018

Не уверен, что вы пытались сделать с =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;
...