创建一系列等距的对

Create a sequence of pairs equally spaced

我想创建一个由 N 对实数组成的向量,其中每对由一个值 S 分隔,并且该对的两个元素由一个值 iS 分隔,可以这样写:

V=[(X,X+iS)_1, (X+S+iS,X+S+2*iS)_2, ...  ]

所以如果我们从 X=1 开始,使用 S=1iS = .5 它应该 return:

V=[1.0,1.5,2.5,3.0,4.0,4.5]

我创建的这个函数完全符合我的要求:

myseq<-function(x,n,sep,isep){
  res=c(x,x+isep)
  for(i in 1:(n-1)){
      prev=res[length(res)]
      res=c(res,c(prev+sep,prev+sep+isep))
  }
  return(res)
}

与之前相同的例子:

> myseq(1,3,1,.5)                                                             
[1] 1.0 1.5 2.5 3.0 4.0 4.5

但我确信它可以用更简单和更 "functional" 的方式编写,但我想不出来。 如果你有什么想法?

这是一个使用 seq

的想法
myseq <- function(x, n, sep, isep) {
  v1 <- seq(x, n*2, sep)[c(rep(TRUE, 2), rep(FALSE, (isep/sep)-1))]
  return(v1[1:(n*2)])
  }

myseq(1,3, 0.5, 1)  
#[1] 1.0 1.5 2.5 3.0 4.0 4.5

这是另一种方法,您可以创建 2 个不同的向量,然后交替组合它们以获得所需的序列。

myfun=function(i,x,y,n){
    c(rbind(seq(i,by = x+y, length.out = n), seq(i+x,by = x+y, length.out = n)))
}

myfun(1,0.5,1,3)
[1] 1.0 1.5 2.5 3.0 4.0 4.5

在查看我的问题后,我意识到我接受的答案可能不是最好的,@alexis_laz 在他的评论中提出了一个简短而更好的解决方案。 我又把它们放在这里了,经过基准测试后似乎

我原来的版本:

original<-function(x,n,sep,isep){
    res=c(x,x+isep)
    for(i in 1:(n-1)){
        prev=res[length(res)]
        res=c(res,c(prev+sep,prev+sep+isep))
    }
    return(res)
}

先前接受的答案:

accepted <- function(x,isep,sep,n){
    c(rbind(seq(x,by = isep+sep, length.out = n), seq(x+isep,by = isep+sep, length.out = n))) 
}

亚历克西斯的评论:

alexcomm <- function(x,n,sep,isep){
    cumsum(c(x, rep_len(c(isep, sep), (n * 2) - 1)))
}

和基准:

                      expr        min          lq        mean      median
 alexcomm(x, n, sep, isep)     99.657    105.0090    149.4527    109.1745
  accepted(x, isep, sep, n)    130.090    137.7555    193.6189    163.2150
  original(x, n, sep, isep) 251176.761 258936.2820 268247.7626 270124.8435

因此评论中提出的解决方案不仅短而且速度稍快。