我是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以获得所需的结果?非常感谢提前!
答案 0 :(得分:1)
问题来自您f
的实施。矩阵子集的工作方式意味着您返回相同的矩阵,并始终为x中的每个值选择前两个元素。
如果以更加矢量化的方式编写它,它将按照您的意图运行:
f2 <- function(x,y) x+y[,1]+y[,2]
f2(x,y)
[1] 7 10 13 16
答案 1 :(得分: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]
将为您提供y
的第一个元素,而data.frame(y)[1]
将为您提供第一列:
> y[1]
[1] 1
> data.frame(y)[1]
X1
1 1
2 2
3 3
4 4