我正在寻找一个从我提供的起点开始对向量进行简单爬坡的函数。更正式地讲:给定像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/