3.2.2 函数
函数是一组组合在一起以执行特定任务的语句,用户向函数输入外部参数,该函数将依据语句的逻辑返回一个值。事实上,R语言使用的一切都是对象,所做的一切操作都是函数。或者说,函数也是一个对象,使用的“+”“-”等运算符本质上来说也是函数。
R语言具有大量内置函数,还有数千个第三方包,在日常操作中,这些函数已经足够使用。但如果在数据分析中需要重复某些逻辑或操作,或者需要完成高度定制化的操作,创建函数就是最佳的选择。R语言解释器不仅将控制传递给函数,也将必要的输入参数传递给函数。该函数依次执行任务并将控制结果返回到解释器,同时也存储中间变量。
1.创建函数
每一个R函数都包括三个部分:函数名、程序主体以及参数集合。在编写自定义R函数时,需要将三个部分各自储存在一个R对象中。这里需要使用function函数,例如:
其中,My_function是函数名;(x,y)指定了函数的参数;x+y是程序主体。该函数没有调用return函数,函数计算的最后一个表达式的值为返回值,My_function函数返回x和y的和。调用My_function可以看到函数的具体内容,具体如下:
调用函数时,若不命名参数,则R按照位置匹配参数。因此,在上述代码中,“2”对应形式参数“x”,“3”对应形式参数“y”。若要改变传递参数的顺序,则可以传入命名参数:
上述代码为函数的参数设置了默认值,当调用函数时,如果没有为参数传递相应的值,那么函数将自动使用默认值作为函数代码块执行的当前值:
上述函数没有设置参数值,函数自动使用当前默认值作为参数返回执行结果。当需要函数运行过程的其他数据时,可以使用return()函数指定要返回的值。return()函数除了可以指定函数的返回值之外,还能使函数退出,不再继续执行后面的代码:
2.函数的动态类型
R的函数非常灵活,无需检查输入对象的数据类型即可进行运算。函数最初用于标量运算,但是在R中,它可以自动扩展到向量运算甚至其他类型数据的运算,例如:
3.参数(…)
在数据分析中,有时输入的参数数量会发生改变,这时使用(x,y)的传参方式无法满足需求。但是可以注意到的是,R中一些函数可以接受任意数量的输入,那么,这些函数是如何实现的呢?
R提供了一个特殊的运算符(…),该运算符允许函数具有任意多个参数,并且不需要在函数定义中指定。这个运算符可以将它捕获的参数传递给另一个函数。当函数作为另一个函数的变量时,这种方式可以将所有参数捕获并传递给其他函数。下面对str_c()函数重新进行包装:
上述代码中,commas函数中包含rule()、title()、width()和cat()等多个函数,通过使用特殊运算符(…),commas函数允许包含的多个函数具有任意多个参数,从而方便函数的封装与结果输出。cat()函数则将输出打印到控制台,可以看到的是,输出占满了控制台的整行,这就是get Option(“width”)的作用。