Как повторить For L oop в R? - PullRequest
1 голос
/ 26 февраля 2020

Я пытаюсь создать для l oop и в каждой итерации заменять значения в aux_j.

В примере моя функция в диапазоне от 1 до box_size [1] * ninbox2 [1] вычисляет значения в векторе aux_j [1] и (вы можете сделать это вручную, запустив код ниже) передает значение в j = 1 + 1 = 2 и, повторяя шаги, вычисляет для aux_j [2].

Может показаться странным, но мне нужно это заменить значения на каждом шаге. Последний «aux_j» будет содержать только значения для итерации [22].

aux_j<-0
box_size<-c(4,5,6,7,8,9,10,11,12,14,16,18,20,22,24,27,30,33,36,40,44,48)
ninbox2 <-c(50,40,33,28,25,22,20,18,16,14,12,11,10,9,8,7,6,6,5,5,4,4)

j<-1 # up here only need run one time

for(i in 1:(box_size[j]*ninbox2[j])){ 


  if(i==1){

    aux_j[1]<- box_size[j] 

  }

  else if(i>=2){
    aux_j[i] <- aux_j[i-1]+ box_size[j]


  }

}

    j<-j+1




aux_j

1 Ответ

1 голос
/ 27 февраля 2020

Попробуйте следующее.

Первый способ вычисления aux_j заключается в двойном for l oop, но каждый раз, когда он проходит через самый внутренний l oop, значения aux_j будут перезаписываться. Это просто упрощенный код.

aux_j_size <- max(box_size*ninbox2)
aux_j <- numeric(aux_j_size)
for(j in seq_along(ninbox2)){
  for(i in 1:(box_size[j]*ninbox2[j])){ 
    aux_j[i] <- box_size[j] 
    if(i >= 2){
      aux_j[i] <- aux_j[i - 1] + aux_j[i]
    }
  }
}
aux_j

Второй способ также использует двойной l oop, внешний lapply l oop и внутренний for l oop. Векторы aux_j вычисляются в for l oop, и каждый из них сохраняется в списке aux_list. В итоге участникам списка присваиваются имена aux_01, aux_02, et c.

aux_list <- lapply(seq_along(ninbox2), function(j){
  aux_j <- numeric(box_size[j]*ninbox2[j])
  for(i in seq_len(box_size[j]*ninbox2[j])){ 
    aux_j[i] <- box_size[j] 
    if(i >= 2){
      aux_j[i] <- aux_j[i - 1] + aux_j[i]
    }
  }
  aux_j
})

names(aux_list) <- sprintf("aux_%02d", seq_along(ninbox2))
aux_list
...