0

我是 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

v1 和 v2 的结果相同。v3 是我想要的。但是为什么我不能只使用 v1 或 v2 的命令呢?为什么它们不同?有没有办法稍微修改 v1 或 v2 以获得所需的结果?提前非常感谢!

4

2 回答 2

1

这里的问题是您的函数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]会给你第一个元素,ydata.frame(y)[1]会给你第一列:

> y[1]
[1] 1
> data.frame(y)[1]
  X1
1  1
2  2
3  3
4  4
于 2013-11-07T22:43:02.927 回答
1

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

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

f2 <- function(x,y) x+y[,1]+y[,2]
f2(x,y)
[1]  7 10 13 16
于 2013-11-07T22:34:19.703 回答