我写了一个函数来计算圆形通道中的临界水深 而流量(Q)和直径(d)给出:
D_Critic<- function (Q,Dia) {
g=9.81
Diff=1
Phi=0.01
while(Diff>=0.001) {
A=16*Q*sqrt((2/g)*sin(Phi/2))
B=Dia^5/2*(Phi-sin(Phi))^3/2
Diff=A-B
Phi=Phi+0.001
Yc=Dia/2*(1-cos(Phi/2))
}
return(Yc)
}
现在我想在函数内使用将Yc与数据帧DQ绑定,但它只返回第一个计算的Yc和几个重复的警告:
Q<-c(2.5975,2.5900,2.4183,2.3077)
D<-c(1,1,1,1)
DQ<-data.frame(Q,D)
> D_Q<-within(DQ,Yc<-D_Critic( Q/2, D))
There were 50 or more warnings (use warnings() to see the first 50)
> D_Q
Q D Yc
1 2.5975 1 0.52609
2 2.5900 1 0.52609
3 2.4183 1 0.52609
4 2.3077 1 0.52609
> warnings()
Warning messages:
1: In while (Diff >= 0.001) { ... :
the condition has length > 1 and only the first element will be used
答案 0 :(得分:0)
while
语句只接受一个布尔值,例如Diff >= 0.001
其中Diff
必须是单个数字。在第一次循环时,就是这种情况,因为Diff
等于1.但是,在第二个实例中,Diff
等于A-B
,其中A
}和B
都是长度为4的向量。
因此,当您的代码到达第二次迭代时,while
会生成警告,因为它不知道如何处理布尔值向量。它的选择是简单地使用布尔向量中的第一个元素,丢弃其余元素。
您需要考虑Diff
实际上是什么。可能是一个数字,因此Diff sum(A-B)
或sum((A-B)^2)
。这将导致单个Diff
值,并消除您的错误。 Diff
应该完全取决于您正在研究的理论。你的教科书应该列出这个。
答案 1 :(得分:0)
通过一个技巧解决了这个问题:
Yc<-matrix(NA,length(DQ$Q),1)
for (i in 1:length(DQ$Q)) {
Yc[i,1]<- D_Critic(DQ$Q[i]/2,DQ$D[i])
}
> Yc
[,1]
[1,] 0.5260900
[2,] 0.5255907
[3,] 0.5163489
[4,] 0.5098512
DQ<-cbind(DQ,Yc)
> DQ
Q D Yc
1 2.5975 1 0.5260900
2 2.5900 1 0.5255907
3 2.4183 1 0.5163489
4 2.3077 1 0.5098512