2016-08-15 1 views
1

nehme ich folgendes:ein Listenelement in O Abrufen (1) in R

a <- vector('list',50) 

for(i in 1:50) 
{ 
    a[[i]] <- list(path=paste0("file",sample(0:600,1)),contents=sample(1:5,10*i,replace=TRUE)) 
} 

nun beispielsweise; Ich möchte den Inhalt von file45 (vorausgesetzt, es existiert in diesen zufällig generierten Daten) so schnell wie möglich abrufen.

Ich habe versucht, die folgenden:

contents <- unlist(Filter(function(x) x$path=="file45",a),recursive=FALSE)$contents 

jedoch die Liste der Suche Overhead macht aus dem Speicher noch langsamer als das Lesen direkt von der Festplatte zu lesen (zu einem gewissen Grad).

Gibt es eine andere Möglichkeit, den Inhalt in etwas schneller als das Lesen von der Festplatte im Idealfall O (1) abrufen?

edit: davon aus, dass es keine doppelten filepaths in meinen Teil-Listen ist und dass es weitgehend mehr als 50 Sublisten

+0

Erwarten Sie Duplikate in der Pfadvariablen? – James

+0

@James gibt es keine Duplikate im Gegensatz zu dem, was mein schlecht geschriebenes Beispiel vermuten lässt. Angenommen, "sample (0: 600,1)" würde keine Duplikate über die 50 Iterationen zurückgeben, d. H. Keine doppelten Dateipfade. – Imlerith

Antwort

2

Verwenden names Attribut um die Elemente zu verfolgen stattdessen:

a <- vector('list',50) 

for(i in 1:50) 
{ 
    a[[i]] <- list(contents=sample(1:5,10*i,replace=TRUE)) 
} 

names(a) <- paste0("file",sample(1:600,50)) 

a[["file45"]] 
NULL 
a[["file25"]] 
$contents 
[1] 3 1 3 1 2 5 1 5 1 2 3 1 4 1 1 4 1 5 1 5 1 4 5 2 5 2 2 5 1 1 
+0

bevorzugen. Sie müssten es als 'Namen (a) [i] <- ...' machen – James

0

versuchen Sie Folgendes:

a[sapply(a, function(x) x$path == "file45")][[1]]$contents 
+0

Leider ist dies immer noch langsamer als das Lesen aus einer Datei. vielleicht wäre das besser, wenn ich eine wirklich große Datei hätte. Trotzdem würde ich etwas in der Nähe von O (1) – Imlerith