在研究FCMP以帮助回答另一个问题时,我对proc fcmp
使用VARARGS
选项的工作方式使我有些困惑,以便能够使用可变号来调用该函数论点。函数语句的SAS支持页面提供了以下示例,并明确指出示例暗示可以称为求和函数如下:sum = sumpation(1,2,2,3,4,5);。&quot
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;
我在日志中发现错误
错误72-185:求和功能调用有太多参数。
错误707-185:期望sumpation子例程呼叫的参数1的数组。
这让我感到困惑。我想念明显的东西吗?
第二个错误消息说该函数正在期望数组作为参数1.忘记了以下事实:在fcmp
中以这种方式调用函数似乎有效,而SAS支持似乎表明这是这是全部要点这;期望一个数组确实可以长度不同,实际上与接受可变的参数并不相同,一个数组是一个参数
如果指定varargs,则该函数中的最后一个参数必须是数组。
及以后:
注意:从数据步骤调用此功能时,您必须提供varargs作为数组。
http://documentation.sas.com/?docsetId=proc& docsettarget=n10vesIdZiklH1N1L7KIDQ4DQD0R.HTM&htm&ampsetversion = 9.4&
在这种情况下,请确保使用最新版本的文档。除非不幸的是,除非您遇到了9.2版。这对我有用 - 请注意,这也不是我期望它的工作方式...但是它确实如此:)。
data demo;
array test(4) (1, 2, 3, 4);
check = summation(test);
put check=;
run;
只是根据您的评论澄清"提供一种方法来定义一个函数的方法是什么它是定义的吗?"。
fcmp可以使用inlib = proc选项或选项cmplib加载函数。由于FCMP知道如何调用varargs函数,您仍然可以使用该选项,仅来自其他Proc FCMP步骤或FCMP函数。