1

我从没想过要使用Reduce,但我有一个问题,我认为它会很好。我想确保向量的每个迭代元素的大小等于或大于前一个元素。我可以做到这一点,sapply但我的尝试Reduce失败了。我怎么能用这个Reduce

#This works
y <- c(1,2,3,2,4,4)
sapply(seq_along(y)[-length(y)], function(i) y[i] <= y[i+1])

#attempts
Reduce('<', c(1,2,3,2,4,4)), accumulate = TRUE)
Reduce('<', c(1,2,3,2,4,4)))
4

4 回答 4

5

diff()函数在这里是一个合乎逻辑的选择(其他人已经很好地解释了为什么Reduce()不合适)。它已经设置为比较向量元素之间的差异并且已经向量化。

> !diff(y) < 0
[1]  TRUE  TRUE FALSE  TRUE  TRUE
于 2012-11-02T09:10:25.523 回答
3

无聊至极?我曾是:

myFun <- function(x,z){
  if(is.null(names(z))) names(z) <- z
  if(is.null(names(x))) names(x) <- x
  if(as.numeric(names(x)) < as.numeric(names(z))) res <- TRUE else res <- FALSE
  names(res) <- names(z)
  return(res)
}
as.logical(Reduce(myFun, y, accumulate = TRUE)[-1])
# [1]  TRUE  TRUE FALSE  TRUE  TRUE
于 2012-11-02T10:55:41.237 回答
2

这是我的理解?ReduceReduce比较了第一个和第二个元素。既然1 < 2回报1. 它将重用1,然后将其与第三个元素进行比较,依此类推。这意味着您将始终比较1 < y[3:length(y)]结果总是正确的。或者,您可以尝试:

head(y,-1) < tail(y, -1)
于 2012-11-02T07:37:33.697 回答
2

我不认为它可以像Reduce通常那样使用f(f(x[1],x[2]),x[3]),所以你对第三个元素的比较将是TRUE < 3.

identical(y,sort(y))

对于这个问题,似乎是一个更有效的解决方案。

于 2012-11-02T08:29:35.960 回答