熟悉python的函数后,这里只总结一些R函数的独特之处。
R的函数没有显式的return,而是自动返回the last value that is calculated.
如果函数的body部分只有1行,可以省略花括号。这里貌似有点像python中的lamda函数?
> getp <- function(x,y) t.test(x,y)$p.va
> getp(rnorm(100),rnorm(100)+.1)
[1] 0.03057276
查看一个函数的arguments,可以使用formals() args() formalArgs()3个函数。3者分别返回1个list,打印出函数的arg部分,1个含有参数names的字符串向量。
查看函数的body,直接使用body().
R中的特殊argument ...,能够接受all the arguments that aren't matched by position or name.通常用在向function中的sub-function传递参数时。
do.call()是向函数传递参数的另一种方法,它的基本结构是:
do.call(what, args, quote = FALSE, envir = parent.frame())
#what是函数名或者函数本身,意味着我们可以anonymously现场定义一个函数
#args是以list形式组装的参数
> do.call(function(x,y) t.test(x,y)$p.va , list(rnorm(100),rnorm(100)+1 ))
[1] 8.580803e-15
书中还提到了ecdf(empirical cumulative distribution function)这个函数,它输出的就是一个函数。这个函数属于ecdf class,自带plot等多个method。
函数的定义域(scope)也存在继承关系。某函数的subfunction可以调用到主函数的scope中的变量。而所有函数的scope最终都能追溯到global()中。换言之,在global()中定义的变量能够被各个函数调用,这既是便利,也可能带来麻烦。