将向量值函数应用于向量。结果与预期不符

时间:2017-11-16 16:43:06

标签: r vectorization

在Matloff的R编程艺术中,他使用下面的函数(z12)来演示矢量值函数的使用。

vector-valued function

我的问题是:将该功能应用于1:8时,为什么会返回1 2 3 4 ... 1 4 9 16 ...而不是1, 1, 2, 4, 3, 9 ...?毕竟,返回语句中的z^2旁边不是z吗?

3 个答案:

答案 0 :(得分:3)

c()是连接运算符。它端到端地连接两个向量。你可以做到

c(1, 2)
# [1]  1  2
c(1:3, 9:11)
# [1]  1  2  3  9 10 11

所以你定义的功能正在运行

c(1:8, (1:8)^2)
# [1]  1  2  3  4  5  6  7  8  1  4  9 16 25 36 49 64

因此c()在向量扩展后将它们放在一起。不是扩展正在发生。

答案 1 :(得分:2)

我们可以将功能更改为

z12 <- function(z) c(rbind(z, z^2))
z12(x)
#[1]  1  1  2  4  3  9  4 16  5 25  6 36  7 49  8 64

答案 2 :(得分:1)

另一种方法是使用rep和回收。

zN <-  function(x) rep(x, each=2)^c(1:2)

现在,试一试。

zN(1:8)
 [1]  1  1  2  4  3  9  4 16  5 25  6 36  7 49  8 64

或者,按照所需的顺序

zN2 <-  function(x) x^rep(1:2, each=length(x))
zN2(1:8)
 [1]  1  2  3  4  5  6  7  8  1  4  9 16 25 36 49 64