全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
14015 13
2014-06-23
偶然情况下载help里面看到的一个过程步proc fcmp;就到网上查了些资料,原来SAS也可以编写自己的function并调用,可以使复杂的函数瞬间变简单有木有!!!

复制代码
恭喜大家,这样已经定义了一个属于你自己的函数了,名字叫做change,储存在function.funcsol.conversion 里面;需要注意的是储存的文件夹,也就是function.funcsol.conversion 一定是由三个目录组成的,WHY?
大家可以定义了这个函数之后自己去打开文件看一下,首先是主文件夹function(相当于work), 然后是funcsol(相当于数据集),
而conversion就相当于数据集里的索引了,我个人觉得SAS储存函数还是与储存数据是一样的,把编译了的函数储存在数据集里相当于,个人理解,希望大神指正,这样想便于理解嘛;

语法方面并不是很复杂,我就随便说一下;
相当于do循环有end;
function 有 endsub;如果大家会VB的话,对sub肯定不陌生吧?打VBA天天打有木有~~~
剩下的就简单了,定义一个变量,计算,然后返回计算出来的值,函数结束;


接下来就和format一样,(或者是matlab里面的path),你要告诉SAS到哪里去找你定义的函数;

复制代码
OK, 这样子SAS应该已经知道到哪里去找了;
接下来试一下效果:
复制代码


这样我们就成功的调用了自己定义的函数;

最简单的例子就是这样了,接下来是进阶教程:
复制代码
这个是什么?和前面不同的只有一点,就是return的不是一个数值型变量而是一个字符型变量;
SO,和定义变量一样,加一个 $ 就好;
其他的语法都是一样的,只是一个catt的连接函数而已;

复制代码
一样的,试一下;

复制代码
OK,两个自变量,right?


接下来两个例子我觉得写得爆赞,可以一窥函数定义的妙处所在;
复制代码
几个重要一点的point;
1、 subroutine 这里可以把自变量和return值放在一起;然后通过 outargs来确定输出值是哪一个;看看例子大家一定会明白吧,所以用一个 call function 就可以完成对输出值的赋值;

复制代码
没有错,函数里面是可以用逻辑语句的,想怎么编就怎么编,接下来大家可能会想怎么样才能够做的更复杂,接下来的例子就是在函数里引入macro, macro本来就是为了使语句更加简化而生的,碰上个一样目的的函数过程步,不能再简化了有木有~~

复制代码
这里有一个错误使用macro的误区,我来说说我的看法吧,如果你在fcmp里面使用%macro来调用宏的话,就会存在一个编译错误的问题,具体的机制我也不甚清楚,但是可以肯定的是,这样子的宏是没法编译的,因为编译函数我觉得可能在编译宏之前,那样函数的编译就会出错;

所以使用run_macro ('printit',...);
来输入宏和宏变量;

剩下两个例子我个人觉得有点鸡肋,不过用处还是有的,如果你想定义非常复杂的format的话,这个还是有用的吧;
复制代码
大家看到了,就是起到了一个定义format里面格式的作用,把所有的格式都定义为change里面的return值,但是数据集里的值是不变的;

当然,fcmp是可以输出多个值得,用subroutine就好了不是么?
复制代码


%sysfunc 和 %call,能调用普通函数的工具当然也能调用我们定义的函数;
复制代码

最后一点,定义的函数怎么去除,easy, delete 掉就好(deletefunc)
复制代码

定义了的函数可以一直调用而且也可以给别人使用;
但是根据我自己的试验,这个因为是储存成字符,英文版和中文版定义的函数是不能通用的哦~~~~希望大家能把自己的code写的越来越简单,越来越漂亮~~~~

翻译自:https://bbs.pinggu.org/thread-3102197-1-1.html ——Arthur:L.Carpenter(希望我理解的木有错)
















二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-6-23 23:50:16
第一次知道还有这个功能,谢谢分享
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-6-24 16:30:01
哇,这个好
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-11-19 10:39:18
好东西,感谢分享~~~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-1-6 12:06:02
正需要,非常感谢
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-11-18 10:02:21
你好~请问索引要事先建立好吗?如果别人要用我的函数,那逻辑库数据集索引是不是也要改成别人SAS里的?重新启动SAS要重新定义函数吗?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群