r中复杂迭代循环的矢量化

r中复杂迭代循环的矢量化,r,vectorization,R,Vectorization,我通常对r中的矢量化没有问题,但在下面的例子中,我遇到了困难,因为for循环中既有迭代的,也有非迭代的组件 在下面的代码中,我有一个计算,我必须基于一组常数(Dini),一个值向量(Xs),其中输出向量(Ys)的第I个值也取决于I-1值: Dini=128 #constant Xs=c(6.015, 5.996, 5.989, 5.911, 5.851, 5.851, 5.858, 5.851) Y0=125.73251 #starting Y value Ys=c(Y0) #starting

我通常对r中的矢量化没有问题,但在下面的例子中,我遇到了困难,因为for循环中既有迭代的,也有非迭代的组件

在下面的代码中,我有一个计算,我必须基于一组常数(Dini),一个值向量(Xs),其中输出向量(Ys)的第I个值也取决于I-1值:

Dini=128 #constant
Xs=c(6.015, 5.996, 5.989, 5.911, 5.851, 5.851, 5.858, 5.851)
Y0=125.73251 #starting Y value

Ys=c(Y0) #starting of output vector, first value is known
for (Vi in Xs[2:length(Xs)]){
  ytm1=Ys[length(Ys)]
  y=(955.74301-2*((Dini+ytm1-Vi)^2-ytm1^2)^0.5+2*ytm1*acos(ytm1/(Dini+ytm1-Vi)))/pi/2
  Ys=c(Ys, y)
} 
df=data.frame(Xs, Ys)
df

    Xs       Ys
1 6.015 125.7325
2 5.996 125.7273
3 5.989 125.7251
4 5.911 125.7036
5 5.851 125.6859
6 5.851 125.6849
7 5.858 125.6868
8 5.851 125.6850
在这种情况下,在For循环中混合了迭代和非迭代组件,我的思想在一个非矢量化的结中扭曲


有什么建议吗

在这种情况下,您可能需要研究如何使用
Reduce
。比如说

Ys<-Reduce(function(prev, cur) { 
  (955.74301-2*((Dini+prev-cur)^2-prev^2)^0.5 + 2*prev*acos(prev/(Dini+prev-cur)))/pi/2
}, Xs, init=Y0, accumulate=T)[-1]

YsNice。请您添加一些信息,说明您正在使用
Reduce()
做什么,以及为什么它是这项工作的最佳工具?这对未来的读者和OP都有帮助。你可以使用
data.table
;创建一个附加列,使Ys移位1。@sheffien,但Ys在循环之前不存在。只有一个值。我不确定我是否理解你的建议。你能把它变成一个有效的答案吗?@flick先生你说得对。。。我错过了。