Wir hängen ein Objekt zu einer Liste in R in amortisiert konstanter Zeit, O(1)?

Wenn ich einige R-Liste mylist können Sie hängen ein Element obj zu es so auf:

mylist[[length(mylist)+1]] <- obj

Aber sicherlich gibt es einige mehr kompakt. Wenn ich war neu an der R, habe ich versucht zu schreiben lappend() etwa so:

lappend <- function(lst, obj) {
    lst[[length(lst)+1]] <- obj
    return(lst)
}

aber natürlich nicht, die Arbeit wegen der R-call-by-name-Semantik (lst ist effektiv kopiert beim Aufruf, so dass änderungen an lst sind nicht sichtbar außerhalb des Anwendungsbereichs der lappend(). Ich weiß, Sie tun können, Umwelt-hacking in eine R-Funktion zu erreichen außerhalb des Bereichs der Ihre Funktion und mutieren die aufrufende Umgebung, aber das scheint wie ein großer hammer auf das schreiben einer einfachen append-Funktion.

Kann jeder jeden schlagen, ein schöner Weg, dies zu tun? Bonus Punkte, wenn es funktioniert für beide Vektoren und Listen.

  • R hat die unveränderliche Daten, Merkmale, die Häufig in funktionalen Sprachen, hasse es dies zu sagen, aber ich denke, Sie müssen nur mit ihm zu beschäftigen. Es hat seine vor-und seine Nachteile
  • Wenn Sie sagen, "call-by-name" Sie wirklich meinen "call-by-value", richtig?
  • Nein, es ist definitiv kein call-by-value, ansonsten wäre das kein problem. R eigentlich mit call-by-need (en.wikipedia.org/wiki/Evaluation_strategy#Call_by_need).
  • Eine gute Idee ist, die pre-teilen Sie Ihre vector/list: N = 100 mylist = vector ("list", N) for (i in 1:N) { #mylist[[i]] = ... } Vermeiden Sie 'wächst' objects in R.
  • Ich habe versehentlich die Antwort hier, stackoverflow.com/questions/17046336/... So schwer zu implementieren, so dass einfache Algorithmus!
  • ok, aber das ist nicht allgemein anwendbar, es funktioniert nur in Szenarien, in denen können Sie wissen, die genaue endgültige Länge im Voraus (oder vielleicht Quietschen durch in können Sie eine Obere Schranke ist).
  • die lappend Ansatz hat den Vorteil, das Auffüllen einer leeren Liste (in der Regel innerhalb einer Schleife). l1 = list(l1, l2), beginnend mit einer leeren Liste, der stellt ein leeres element als erstes element.
  • Kurze Antwort: R hat keine built-in-Daten-Struktur, die unterstützt das Ziel, bereits im Titel. Siehe JanKanis Antwort für eine benutzerdefinierte Implementierung.

InformationsquelleAutor Nick | 2010-03-13
Schreibe einen Kommentar