Anexar Elementos a uma Lista em R
Há muitas maneiras de utilizar um laço para adicionar um número arbitrário de elementos a uma lista em R. Alguns deles podem tornar-se lentos quando o número de elementos é elevado. Este tutorial introduzirá as formas mais eficientes de acrescentar elementos a uma lista num laço em R.
Uma forma comum de implementar tal algoritmo seria criar um laço while
e utilizar o comando c
(concatenar) dentro do laço. Dentro de cada iteração, um elemento é adicionado utilizando a função c
. Neste exemplo, um valor (i*3
) é adicionado a uma lista até a variável de índice atingir 10.000:
i <- 1
mylist <- c()
while (i<10) {
mylist <- c(mylist, i*3)
i <- i+1
}
cat(mylist)
Resultado:
3 6 9 12 15 18 21 24 27
O problema com o exemplo anterior é que cada vez que a concatenação é executada, a lista inteira é copiada. Quando se trabalha com grandes conjuntos de dados, o tempo necessário para adicionar todos os elementos pode ser tremendo.
Anexar a uma lista em R Com a função length
Uma abordagem mais eficiente para anexar um número arbitrário de elementos a uma lista dentro de um laço é utilizar a função length
em cada iteração. Com a função length
, é possível obter o número de elementos na lista e atribuir cada novo elemento ao índice por trás do último elemento: length(mylist)
.
O exemplo abaixo faz o mesmo que o anterior, mas de forma mais eficiente.
i <- 1
mylist <- c()
while (i<10) {
mylist[[(length(mylist) + 1)]] <- i*3
i <- i+1
}
cat(mylist)
Resultado:
3 6 9 12 15 18 21 24 27
Definição de um limite superior para a lista
Se souber com antecedência quantas vezes o seu laço irá iterar, em vez de aumentar uma lista de elementos, pode definir um vector de comprimento fixo e utilizá-lo para segurar todos os elementos. Por exemplo, se souber que o seu laço irá iterar 10.000 vezes, pode inicializar o vector desta forma:
mylist <- vector("list", 10000)
Depois disto, pode utilizar um laço for
e definir o valor de cada elemento pelo seu índice:
i <- 1
for (i in 1:10000) {
mylist[[i]] <- i*3
}
Se não souber o número de iterações, mas tiver um limite superior para elas, pode definir o vector com este limite superior. Mais tarde, quando o laço tiver terminado a execução, poderá escolher apenas os elementos não-nulos. Por exemplo, se souber que o seu laço não irá iterar mais de 10.000 vezes, pode inicializar o seu vector com 10.000 elementos, mesmo que não os utilize a todos.