如何在 R 中的列表的每个向量(不同长度)中附加第一个和最后一个元素,而不会使代码变慢?

How to append first and last element in each vector (of a different length) of a list in R, without making the code slow?

我是 R 和 Whosebug 的新手。因此,如果我遗漏了什么,请告诉我。我正在研究模拟非均质过程以更好地理解神经行为。我的代码以我的方式工作,比如 20 次试验,每次持续 2 秒(每次试验代表一个尖峰列车)。然后列表 SpikeTimes 给了我一个 20 向量的列表,其中每个向量对应于特定试验中尖峰发生位置的时间戳。 [例如,SpikeTimes[1] 看起来像这样,0.002250802 0.053934034...1.971574170 2.023090384 表示在第一个 Spike Train 中,尖峰出现在 0.0022508020.053934034 等等。我不知道为什么它还会显示超出我的 2 秒时间限制的时间戳,但我稍后会处理]。我的代码看起来像这样--

nTrials=20
t_max=2.0000000


LambdaInv<- function(x){ifelse( x< 15, x/30,
                    ifelse(x >= 15 & x < 38, ((x-15)/46)+0.5,
                           ifelse(x >= 38 & x <53, ((x-38)/30)+1.0,
                                  ifelse(x >= 53 & x< 67.4, ((x-53)/72)+1.5, 
                                         ((x-67.4)/30)+1.7))))}

 t = 0 
 s = 0
 X = numeric(0)


 NonHomoSpikes <- function(t_max){
  while(t <= t_max){
    u <- runif(1)
    s <- s-log(u)
    t <- LambdaInv(s)
    X <- c(X,t)
       }
    return(X)
   }


SpikeTimes <- lapply(1:nTrials, function(x) NonHomoSpikes(2))

我的问题是,对于列表中的每个向量 SpikeTimes;它给出了尖峰的时间戳,我还想包括尖峰列车的开始(即 0)和结束(即 2)。所以我想附加这个列表,让每个向量包含第一个条目 0 和最后一个条目 2.

我的 SpikeTimes[1] 看起来像 0 0.002250802 0.053934034...1.971574170 2,其他 SpikeTimes[i] 看起来也很相似。我尝试 SpikeTimes <- c(0, SpikeTimes) 在开始时输入 0 但它只使列表有 21 个向量而不是 20 个向量 0 作为第一个元素(我的意思是我明白为什么会这样) .我怎样才能以不会使我的代码变慢的方式来做到这一点?我是 R 的新手,在互联网上阅读对解决这个特殊问题没有帮助。我将不胜感激任何类型的输入。

解决方法:将NonHomoSpikesreturn语句改为return(c(0, X, 2)).

到'manually'停止if t < 2(如评论所述):

NonHomoSpikes <- function(t_max){
  while(t <= t_max){
    u <- runif(1)
    s <- s-log(u)
    t <- LambdaInv(s)
    if(t > 2) break
    X <- c(X,t)
       }
    return(c(0,X,0))
   }