R、 为什么这些作业是';结果不同

R、 为什么这些作业是';结果不同,r,function,matrix,assignment-operator,R,Function,Matrix,Assignment Operator,我是R的初学者。我对下面的代码有一个问题 f <- function(x,y){ x+y[1]+y[2] } y <- matrix(1:8, ncol=2);y x <- 1:4 i <- 1:4 v1 <- f(x[i], y[i,]) v2 <- NULL; v2[i] <- f(x[i], y[i,]) v3 <- NULL; for(i in 1:4){v3[i] <- f(x[i], y[i,])} v1; v2; v3

我是R的初学者。我对下面的代码有一个问题

f <- function(x,y){
  x+y[1]+y[2]
}

y <- matrix(1:8, ncol=2);y
x <- 1:4
i <- 1:4
v1 <- f(x[i], y[i,])
v2 <- NULL; v2[i] <- f(x[i], y[i,])
v3 <- NULL; for(i in 1:4){v3[i] <- f(x[i], y[i,])}
v1; v2; v3

f问题来自于
f
的实现。矩阵子集的工作方式意味着您将返回相同的矩阵,并且始终为x中的每个值选择前两个元素

如果您以更矢量化的方式编写,它将按照您的意愿工作:

f2 <- function(x,y) x+y[,1]+y[,2]
f2(x,y)
[1]  7 10 13 16

f2这里的问题是函数
f
在第二个参数中没有矢量化。如果显式计算函数中的加数,可以看到发生了什么:

> x[i]
[1] 1 2 3 4
> y[i,][1]
[1] 1
> y[i,][2]
[1] 2
所以你可以看到,
f(x[i],y[i,])
与计算
1:4+1+2
:

> 1:4 + 1 + 2
[1] 4 5 6 7
> f(x[i],y[i,])
[1] 4 5 6 7
如果在第二个参数中需要一个矩阵,则可以编写该函数的向量化版本,如@James所述。另一个选项是将
y
转换为数据帧:

> f(x,data.frame(y))
  X1
1  7
2 10
3 13
4 16
其工作原理是,数据帧表示为列列表,而矩阵表示为具有维度属性的数组。因此
y[1]
将为您提供
y
的第一个元素,而
data.frame(y)[1]
将为您提供第一列:

> y[1]
[1] 1
> data.frame(y)[1]
  X1
1  1
2  2
3  3
4  4