jsonlite
中的一个主要性能瓶颈证明是适用的,所以我想知道是否有更有效的替代方法在矩阵的行或列上应用函数。
对于一维结构,vapply
通常比lapply
或sapply
快得多,因为它可以在开始时分配输出空间,而不是试图简化输出列表。端:
> x <- runif(5e6)
> system.time(y1 <- sapply(x, sqrt))
user system elapsed
7.231 0.142 7.370
> system.time(y2 <- vapply(x, sqrt, numeric(1)))
user system elapsed
1.314 0.095 1.410
但是vapply
不适用于矩阵结构。 apply
家族是否有类似的功能?目前,apply
的输出类型取决于FUN
,例如:
#returns vector
apply(volcano, 1, mean)
#returns matrix
apply(volcano, 1, fivenum)
#returns list
apply(volcano, 1, function(x){list(mean=mean(x), sd=sd(x))})
此script有一个apply
正在运行的简单示例。