我是SAS新手并尝试创建一个涉及proc sql的用户定义函数,该函数的简化版本如下;
proc fcmp outlib=work.funcs.test;
function calculate(table1, var1, motherTable);
proc sql noprint;
create table table1 as
select var1
from motherTable;
quit;
return();
endsub;
然而,当我运行程序时,我得到以下内容:
ERROR: Subroutine 'calculate' was not terminated with ENDSUB.
ERROR: File WORK.MOTHERTABLE.DATA does not exist.
我用endsub()终止了这个函数,我知道motherTable不存在,因为它是一个尚未定义的函数的参数。有谁知道是什么问题?非常感谢你!
答案 0 :(得分:3)
首先,你在做什么可能在宏中做得更好。这就是你在SAS中大部分时间都这样做的事情。
%macro calc_func(in_table=, out_table=, var=);
proc sql noprint;
create table &out_table. as
select &var.
from &in_table.
;
quit;
%mend calc_func;
其次,你可以在用户定义的函数中执行此操作(或者用户定义的调用例程,更可能的是,因为这里没有返回任何内容);但如果我的理解是正确的话,你必须通过宏来完成它。
查看this paper了解详情,或参阅以下示例。
%macro calc_func();
%let table1=%sysfunc(dequote(&table1.));
%let var1=%sysfunc(dequote(&var1.));
%let motherTable=%sysfunc(dequote(&motherTable.));
%put _all_;
proc sql;
create table &table1. as (
select &var1.
from sashelp.&motherTable.)
;
quit;
%mend calc_func;
proc fcmp outlib=work.funcs.test;
function calculate(table1 $, var1 $, motherTable $);
rc = run_macro('calc_func', motherTable, table1, var1 );
return(rc);
endsub;
quit;
options cmplib=work.funcs;
data _null_;
x = calculate('newclass', 'age', 'class');
put x=;
run;
基本上,RUN_MACRO
将宏名称作为参数,然后允许FCMP使用FCMP变量(或传递的参数)的名称创建宏变量。但是,你必须删除他们的报价,这是......恼人的。我认为,除非确实有必要,否则不要这样做的理由很充分。
答案 1 :(得分:0)
The PROC SQL statement is ending the PROC FCMP compilation. You should just write that as a macro.
%macro calculate(table1, var1, motherTable);
proc sql noprint;
create table &table1 as
select &var1
from &motherTable
;
quit;
%mend calculate;