2011-11-21 14 views
10

Estoy tratando de entender los conceptos básicos del lenguaje de programación R y lo encuentro difícil ya que R está orientado a las estadísticas en lugar de la programación de propósito general. No puedo encontrar nada similar a punteros/referencias. ¿Cómo implementaría una lista vinculada, árbol de búsqueda, etc. dentro del lenguaje R?¿Lanza su propia lista/árbol vinculado en R?

Nota: Entiendo que si en realidad está generando sus propias estructuras de datos autorreferenciales en R, probablemente haya una forma mejor de lograr lo que está tratando de lograr. Sin embargo, creo que una respuesta me ayudará a comprender mejor la estructura general y los conceptos del lenguaje.

Editar: En relación con el comentario de Matt Shotwell, el objetivo de esta pregunta es que estoy buscando para escribir listas y árboles vinculados limpia, dentro de R, no como una extensión escrita en C o algún otro idioma. Hacerlo como una extensión o robar con detalles arcanos del intérprete frustra el propósito.

+0

Aquí hay un par de pistas: 1)? Parilist 2) busca 'referencia débil' y 'puntero externo' en el manual 'R Internals' y en el manual 'Writing R Extensions'. –

Respuesta

15

Una lista vinculada en R se puede representar como un vector, generalmente un list. No necesita escribir un código especial para hacer referencia a los artículos siguientes y anteriores, porque R lo hace por usted a través de la indexación.

Para agregar un nuevo elemento a la lista, solo haga un seguimiento de su longitud y asigne el siguiente en la línea.

lst <- list() # creates an empty (length zero) list 
lst[[1]] <- 1 # automagically extends the lst 
lst[[2]] <- 2 # ditto 

Esto puede ser ineficiente para largas listas debido a la forma R se encarga de la memoria. Si es posible, cree la lista con anticipación y asigne sus contenidos a medida que estén disponibles.

lst <- list(1, 2, 3, 4, 5) # a list of 5 items 

lst <- vector("list", 10000) # 10000 NULLs 
lst[[1]] <- 1 
lst[[10000]] <- 10000 # lst now contains 1, NULL, ..., NULL, 10000 

Eliminar un elemento de la lista se puede lograr con índices negativos.

lst <- list(1, 2, 3, 4, 5) 
lst <- lst[-2] # now contains 1, 3, 4, 5 

Un árbol es solo una lista que contiene otras listas.

tree <- list(list(1, 2), list(3, list(4, 5))) 

# left child: list(1, 2) 
tree[[1]] 

# right child 
tree[[2]] 

# right child of right child:list(4, 5) 
tree[[2]][[2]] 

Por defecto no hay incorporada en la aplicación de la estructura, por ejemplo, sólo dos niños por cada nodo de un árbol binario. Los enfoques más estructurados están disponibles a través de las clases S4, pero esto hará el trabajo en un apuro.

+1

+1 Muy buena respuesta. – Iterator

+3

En el nivel interno, una 'lista' es simplemente un tipo de vector. Un 'pairlist' es una verdadera lista vinculada. –

+0

@Joshua: cierto, pero para la mayoría de las cosas que querría una lista vinculada, una 'lista' regular funcionará bien y será menos oscura, especialmente para alguien nuevo en R. –

Cuestiones relacionadas