我正在寻找一个从我提供的起点开始对向量进行简单爬坡的函数。更正式地讲:给定像y <- c(1,2,3,1,1)这样的向量,我想要一个hill(y, x0)函数,使hill(y, 1) == 3(从左爬到顶部)和hill(y, 5) == 5(向左和向右移动,但发现它处于平稳状态,只是返回起始值)。我很难相信这是不存在的,但是到目前为止还无法找到它。有人带头了吗?

最佳答案

这是来自https://gist.github.com/3000200的递归解决方案。为了简洁起见,省略了测试。

climb <- function(y, x0) {
  x <- index(y)
  n <- length(y)

  if (n == 0) { return(NA) }

  if (x0 < min(x) | x0 > max(x)) {
    warning(sprintf("x0 of %f lies outside data range [%f, %f]", x0, min(x), max(x)))
  }

  # TODO: beautify this.
  w <- which.min(abs(as.numeric(x - x0)))
  i <- x[w]
  ii <- index(x)[w] # 1-based index
  l <- x[ii-1]
  r <- x[ii+1]
  yl <- if (ii == 1) { -Inf } else { as.numeric(y[l]) }
  yr <- if (ii == n) { -Inf } else { as.numeric(y[r]) }
  yi <- as.numeric(y[i])

  # At a maximum?
  if (yl <= yi && yr <= yi) {
    return(i)
  }

  # Nope; go in the direction of greatest increase, breaking ties to the right.
  if (yl > yr) {
    return(climb(y, l))
  } else {
    return(climb(y, r))
  }
}

关于r - 从给定的起点如何在R中爬山?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11215344/

10-12 13:54