对于列表R的每个元素,从1:n开始lappy

对于列表R的每个元素,从1:n开始lappy,r,functional-programming,vectorization,apply,lapply,R,Functional Programming,Vectorization,Apply,Lapply,我正在尝试编写一个函数,如果列表元素小于列表中的任何先前值,则该函数将向另一个列表添加一个列表元素。我有一个非矢量化的版本可以工作: myList <- c(14, 35, 12, 54, 67, 8, 32, 3, 78) minVec <- function(x){ # Return a list of all numbers from x which are less than any previous number in the list outList <- l

我正在尝试编写一个函数,如果列表元素小于列表中的任何先前值,则该函数将向另一个列表添加一个列表元素。我有一个非矢量化的版本可以工作:

myList <- c(14, 35, 12, 54, 67, 8, 32, 3, 78)

minVec <- function(x){
# Return a list of all numbers from x which are less than any previous number in the list
  outList <- list(x[1])
  for(i in 2:length(x)){
    if(x[i] < min(x[1:i - 1])){
      outList <- c(outList, x[i])}
  }
  return(unlist(outList))
}

minVec(myList)
myList您正在寻找:

unique(cummin(myList))
编辑一些解释: 对于列表的每n,子集x[1:n-1]的min是列表的累积最小值 名单。由于
cummin
是矢量化的,因此结果具有与输入列表相同的大小,因此我们需要
unique
来删除不复杂的内容

同样的解决方案可以推广到:

  • 累积最大值:
    cummax
  • 累计总和:
    cumsum
  • 累计产品:
    cumprod
您正在寻找:

unique(cummin(myList))
编辑一些解释: 对于列表的每n,子集x[1:n-1]的min是列表的累积最小值 名单。由于
cummin
是矢量化的,因此结果具有与输入列表相同的大小,因此我们需要
unique
来删除不复杂的内容

同样的解决方案可以推广到:

  • 累积最大值:
    cummax
  • 累计总和:
    cumsum
  • 累计产品:
    cumprod

天哪,这真的减少了浪费的时间!那真是太好了,谢谢。如果我需要应用除min、max、sum等以外的函数,是否有更通用的解决方案?这很有趣,但我想问您是否可以在您的方法中添加任何补充信息(如果可能)。它只包括三个部分,
myList
cummin(myList)
,以及
unique(cummin(myList))
@TomR您可以将任意函数而不是
min
插入到:
sapply(seq_沿着(x),function(i)min(x[1:i])
,但这将是一个非常慢的过程,这真的减少了浪费的时间!那真是太好了,谢谢。如果我需要应用除min、max、sum等以外的函数,是否有更通用的解决方案?这很有趣,但我想问您是否可以在您的方法中添加任何补充信息(如果可能)。它只包括三个部分,
myList
cummin(myList)
,以及
unique(cummin(myList))
@TomR您可以将任意函数而不是
min
插入到:
sapply(沿(x)的顺序,函数(i)min(x[1:i])
,但速度会慢得多