【问题标题】:How to catch "need at least two non-NA values to interpolate"如何捕捉“需要至少两个非 NA 值进行插值”
【发布时间】:2012-11-30 03:42:34
【问题描述】:

来自Find x-intercept and y-intercept of a loop in R 我得到了这个不错的解决方案。但是如果没有像这个例子中那样的拦截,它会崩溃:

x <- sin(seq(0,2*pi,0.2) + rnorm(1))
y <- cos(seq(0,2*pi,0.2) + rnorm(1))

intercepts(x,y+10)


intercepts <- function(x,y) {
  x.s <- approxfun(x[y<=0], y[y<=0])(0)
  x.n <- approxfun(x[y>=0], y[y>=0])(0)
  y.w <- approxfun(y[x<=0], x[x<=0])(0)
  y.e <- approxfun(y[x>=0], x[x>=0])(0)

  list(x.s, x.n, y.w, y.e)
}

如何防止函数崩溃并返回NAs如果找不到拦截

到目前为止我尝试的是:

getIntercept <- function(x,y) {

  xydf <- data.frame(x,y)
  xy.n <- subset(xydf,y>=0)
  xy.s <- subset(xydf,y<=0)
  xy.e <- subset(xydf,x>=0)
  xy.w <- subset(xydf,x<=0)

  if ((length(xy.n$y) * length(xy.s$y) >=1) & (length(xy.e$y) * length(xy.w$y) >=1)) {
   ## interception in north and south
    Ra <- approxfun(xy.n$x,xy.n$y)(0)
    Rb <- approxfun(xy.s$x, xy.s$y)(0)

   ## interception in east and west
    Ca <- approxfun(xy.e$x,xy.e$y)(0)
    Cb <- approxfun(xy.w$x,xy.w$y)(0)
    return(data.frame(Ra,Rb,Ca,Cb,
                      Rmean=mean(Ra,-Rb), Rerr=(Ra+Rb)/2,
                      Cmean=mean(Ca,-Cb), Cerr=(Ca+Cb)/2))
  } else { return(data.frame(Ra=0,Rb=0,Ca=0,Cb=0, Rmean=0, Rerr=0, Cmean=0, Cerr=0));  }
}

【问题讨论】:

    标签: r


    【解决方案1】:

    简单的解决方案,在任何错误的情况下返回 NA:

    intercepts <- function(x,y) {
      x.s <- tryCatch(approxfun(x[y<=0], y[y<=0])(0), error=function(e) NA)
      x.n <- tryCatch(approxfun(x[y>=0], y[y>=0])(0), error=function(e) NA)
      y.w <- tryCatch(approxfun(y[x<=0], x[x<=0])(0), error=function(e) NA)
      y.e <- tryCatch(approxfun(y[x>=0], x[x>=0])(0), error=function(e) NA)
    
      list(x.s, x.n, y.w, y.e)
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 2014-10-13
      相关资源
      最近更新 更多