用小于符号减少

时间:2012-11-02 07:08:30

标签: r higher-order-functions

我从不认为使用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 个答案:

答案 0 :(得分:5)

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

> !diff(y) < 0
[1]  TRUE  TRUE FALSE  TRUE  TRUE

答案 1 :(得分: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

答案 2 :(得分:2)

?Reduce的理解是Reduce比较第一和第二要素。由于1 < 2返回1。它将重用1,然后将其与第三个元素进行比较,依此类推。这意味着您将始终比较1 < y[3:length(y)],结果总是如此。或者你可以尝试:

head(y,-1) < tail(y, -1)

答案 3 :(得分:2)

我不认为它可以用作Reduce通常会以f(f(x[1],x[2]),x[3])之类的方式结束,因此您对第三个元素的比较将是TRUE < 3

identical(y,sort(y))
对于这个问题,

似乎是一种更有效的解决方案。