如何完成以下R代码

时间:2018-03-03 07:49:00

标签: r

我想用这个函数来计算cusum的arl 但是我遇到了一个问题 当我运行代码 它显示" if(r [i]> h1)中断的错误:缺少值,其中需要TRUE / FALSE"对我来说。 我不知道如何编写正确的代码

myfun2<-function(c1,h1){
r=rep(0,500)
for (i in 1:499){
r[i+1]<-max(0,c1[i]+0.85*r[i])
(arl<-i)
if(r[i]>h1) break 
}
result<-arl
}
m=sapply(c,h=0.1865,myfun2)

2 个答案:

答案 0 :(得分:0)

@jogo已经指出了这个问题。 sapply正在浏览c的每个元素。由于您的示例不是完全可重现的,因此很难知道c是什么,但如果它是一个向量,那么这就是问题(注意打印语句):

> myfun2 <- function(c1, h1) {
+   r <- rep(0, 500)
+   for (i in 1:499) {
+     print(sprintf("c1[i]: %s, h1: %s, r[i] %s", c1[i], h1, r[i]))
+     r[i + 1] <- max(0, c1[i] + 0.85*r[i])
+     arl <- i
+     if (r[i] > h1) break 
+   }
+   arl
+ }
> 
> set.seed(357)
> c1 <- rnorm(10)
> m <- sapply(c1, h = 0.1865, FUN = myfun2)
[1] "c1[i]: -1.24111730713255, h1: 0.1865, r[i] 0"
[1] "c1[i]: NA, h1: 0.1865, r[i] 0"
[1] "c1[i]: NA, h1: 0.1865, r[i] NA"
Error in if (r[i] > h1) break : missing value where TRUE/FALSE needed
Error during wrapup:

答案 1 :(得分:0)

现在我已经知道如何编辑,为了使代码更有效,我编辑代码。

myfun2<-function(n1,h1){
  r=0
  i=0
  for (x in n1){
  b<-max(0,x+0.85*r)
  r=b
  if(r>h1) break
    i<-i+1
  }
  return(i)
}
arl=myfun2(ny,0.1865)