《Learning R》笔记 Chapter 9 上 隐式循环 in Lists

R的精华部分就在这一章。
这一章需要明确的是不同的apply函数拥有不同的输入输出格式。

简单重复

replicate可以直接将某个函数重复进行n次,输出结果默认为一个array:

replicate(n, expr, simplify = "array")

List内循环

书中的例子使用了unique函数,可以输出某vector中所有unique的元素。
lapply()接受一个list作为输入,输出一个list,输出list的names等于原list。

lapply(X, FUN, ...)

如果lapply输出的结果全部都是同样长度的话,可以用简化版的vapply()。输出的就是一个vector或者array,名称依然来自输入的list。vapply额外接受一个参数来描述输出结果的形式。一旦输出结果的长度不一致就会报错。

vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)
#R对FUN.VALUE的**长度**敏感。如果length()为1,则返回1个vector.
#如果length()大于等于2,则返回一个matrix,其nrow为length(),ncol为原list的length()。

sapply()则是一个lapply的简化版/wrapper,它不需要FUN.VALUE这样的模板。如果输入的X长度不为零,而且每个隐循环输出结果长度一致,就会自行尝试简化输出结果,简化输出的结果格式会被强行一致化:the output type is determined from the highest type of the return values in the hierarchy NULL < raw < logical < integer < double < complex < character < list < expression, after coercion of pairlists to lists。换言之,sapply的输出结果会被强行转换为array(通常是matrix),而array内的元素只能有一种type。这一特性有时可能会造成不便和意料之外的输出。

sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)

可以发现在lapply、vapply和sapply的参数列表中都有“...”,这意味着我们可以额外向FUN中传递其他的参数。如果要传递进更多的参数,应当尝试自定义函数:

> sapply(1:6, rep.int , times=2:7)
Error in FUN(X[[i]], ...) : invalid 'times' value
> sapply(1:6, rep.int , times=2)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    1    2    3    4    5    6

另外还有用的较少的eapply和rapply。

你可能感兴趣的:(《Learning R》笔记 Chapter 9 上 隐式循环 in Lists)