R中出现意外的应用函数行为

geo*_*ory 5 r apply

我发现了一个令人惊讶的行为apply,我想知道是否有人可以解释.让我们采取一个简单的矩阵:

> (m = matrix(1:8,ncol=4))
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
Run Code Online (Sandbox Code Playgroud)

我们可以垂直翻转它:

> apply(m, MARGIN=2, rev)
     [,1] [,2] [,3] [,4]
[1,]    2    4    6    8
[2,]    1    3    5    7
Run Code Online (Sandbox Code Playgroud)

这将rev()迭代地将矢量反转函数应用于每列.但是当我们尝试逐行应用时,我们得到:

> apply(m, MARGIN=1, rev)
     [,1] [,2]
[1,]    7    8
[2,]    5    6
[3,]    3    4
[4,]    1    2
Run Code Online (Sandbox Code Playgroud)

..逆时针旋转90度!Apply使用相同的结果,FUN=function(v) {v[length(v):1]}因此绝对不是转速的错误.

对此有何解释?

ton*_*nov 2

该文档指出

如果每次调用 FUN 返回一个长度为 n 的向量,则 apply 返回一个维度为 c(n, dim(X)[MARGIN]) 的数组(如果 n > 1)。

从这个角度来看,这种行为无论如何都不是一个错误,这就是它的工作原理。

人们可能想知道为什么选择它作为默认设置,而不是保留原始矩阵的结构。考虑以下示例:

> apply(m, 1, quantile)
     [,1] [,2]
0%    1.0  2.0
25%   2.5  3.5
50%   4.0  5.0
75%   5.5  6.5
100%  7.0  8.0

> apply(m, 2, quantile)
     [,1] [,2] [,3] [,4]
0%   1.00 3.00 5.00 7.00
25%  1.25 3.25 5.25 7.25
50%  1.50 3.50 5.50 7.50
75%  1.75 3.75 5.75 7.75
100% 2.00 4.00 6.00 8.00

> all(rownames(apply(m, 2, quantile)) == rownames(apply(m, 1, quantile)))
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

持续的?确实,我们为什么还要期待其他事情呢?