带有 VARARGS 的 FCMP 没有按预期工作?

FCMP with VARARGS not working as expected?

在研究 FCMP 以帮助回答此处的另一个问题时,我对 proc fcmp 在使用 VARARGS 选项时如何工作感到有点困惑,以便能够使用可变数量的参数。 The sas support page for the FUNCTION statement 提供了以下示例,并明确指出 “该示例暗示可以按如下方式调用求和函数:sum = summation(1, 2, 3, 4, 5);。”。 =32=]

options cmplib=sasuser.funcs;

proc fcmp outlib=sasuser.funcs.temp;
function summation (b[*]) varargs;
    total = 0;
    do i = 1 to dim(b);
        total = total + b[i];
    end;
return(total);
endsub;
sum=summation(1,2,3,4,5);
   put sum=;
run;

运行 这似乎运行良好,并生成了一个显示 sum=15 的输出报告,这似乎表明按预期方式调用函数 summation(1,2,3,4,5)

但是,如果我随后尝试在数据步骤中以相同的方式使用该函数

data _null_;
test=summation(1,2,3,4,5);
run;

我在日志中收到错误

ERROR 72-185: The summation function call has too many arguments.

ERROR 707-185: Expecting array for argument 1 of the summation subroutine call.

这让我很困惑。我是否漏掉了一些明显的东西?

第二条错误消息说该函数需要一个数组作为参数 1。忘记了在 fcmp 过程中以这种方式调用函数似乎有效并且 SAS 支持似乎表明这就是重点;期待一个确实可以是不同长度的数组,实际上与接受可变数量的参数不同,一个数组是一个参数

If you specify VARARGS, then the last argument in the function must be an array.

稍后:

Note: When calling this function from a DATA step, you must provide the VARARGS as an array.

http://documentation.sas.com/?docsetId=proc&docsetTarget=n10vesidziklh1n1l7kidq4dqd0r.htm&docsetVersion=9.4&locale=en

请确保使用最新版本的文档,在本例中为 9.4。除非你碰巧卡在 9.2 版本上。 这对我有用——请注意,这不是我期望的那样……但它确实有效:)。

data demo;
    array test(4) (1, 2, 3, 4);
    check = summation(test);
    put check=;
run;

只是根据您的评论进行澄清 "What's the point of providing a way to define a function that takes a variable number of arguments but that can only be used as such within the very proc fcmp where it is defined?"。

FCMP 可以使用 inlib= proc 选项或选项 CMPLIB 加载函数。由于 FCMP 知道如何调用可变参数函数,您仍然可以使用该选项,只是来自其他 proc fcmp 步骤或 fcmp 函数。