Anexar Elementos a uma Lista em R

Gustavo du Mortier 30 janeiro 2023
  1. Anexar a uma lista em R Com a função length
  2. Definição de um limite superior para a lista
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.

Artigo relacionado - R Loop