在函数中使用时,在函数警告中

时间:2016-02-05 12:30:46

标签: r

我写了一个函数来计算圆形通道中的临界水深 而流量(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

2 个答案:

答案 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