带有 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.
请确保使用最新版本的文档,在本例中为 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 函数。
在研究 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.
请确保使用最新版本的文档,在本例中为 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 函数。