R 将向量值函数应用于向量。结果出乎意料
在马特洛夫的《R编程的艺术》中,他使用下面的函数(R 将向量值函数应用于向量。结果出乎意料,r,vectorization,R,Vectorization,在马特洛夫的《R编程的艺术》中,他使用下面的函数(z12)来演示向量值函数的使用 我的问题是:当将函数应用到1:8,为什么返回1 2 3 4。。。1 4 9 16…而不是1、1、2、4、3、9…?毕竟,在return语句中,z^2不是紧挨着z吗?我们可以将函数改为 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 z12我们可以将函数更改为 z1
z12
)来演示向量值函数的使用
我的问题是:当将函数应用到
1:8
,为什么返回1 2 3 4。。。1 4 9 16…
而不是1、1、2、4、3、9…
?毕竟,在return语句中,z^2
不是紧挨着z
吗?我们可以将函数改为
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
z12我们可以将函数更改为
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
z12c()
是串联运算符。它将两个向量首尾相连。你能行
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()
将向量扩展后放在一起。不是在扩展发生时。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()
将向量扩展后放在一起。不是因为扩展正在进行。另一种选择是使用rep
和回收
zN <- function(x) rep(x, each=2)^c(1:2)
或者,按照所需的顺序
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
zN2另一种选择是使用rep
和回收
zN <- function(x) rep(x, each=2)^c(1:2)
或者,按照所需的顺序
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
zN2谢谢您的解释。我不知道为什么我期望函数在向量的单个元素上运行。再次感谢:)谢谢你的解释。我不知道为什么我期望函数在向量的单个元素上运行。再次感谢:)