在Matloff的R编程艺术中,他使用下面的函数(z12
)来演示矢量值函数的使用。
我的问题是:将该功能应用于1:8
时,为什么会返回1 2 3 4 ... 1 4 9 16 ...
而不是1, 1, 2, 4, 3, 9 ...
?毕竟,返回语句中的z^2
旁边不是z
吗?
答案 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