Ich möchte einen Datenrahmen in einer Rcpp Funktion erstellen, aber wenn ich es bekomme, ist es nicht wirklich sehen wie ein Datenrahmen aus. Ich habe versucht, Vektoren usw. zu schieben, aber es führt zu der gleichen Sache. Überlegen Sie:
%Vor%in R:
%Vor%Kurz gesagt:
DataFrames sind tatsächlich genau wie Listen mit der zusätzlichen Einschränkung, dass sie eine gemeinsame Länge haben müssen, so dass sie Spalte für Spalte am besten konstruiert sind.
Der beste Weg ist oft, nach unseren Komponententests zu suchen. Ihr inst/unitTests/runit.DataFrame.R
gruppiert Tests für die Klasse DataFrame
neu.
Sie haben auch die Funktion .push_back()
in Rcpp gefunden, die wir zur Vereinfachung und Analogie hinzugefügt haben mit der STL. Wir warnen davor, dass dies nicht empfohlen wird: Aufgrund von Unterschieden in der Art, wie R-Objekte konstruiert werden, müssen wir im Wesentlichen immer vollständige Kopien machen.% Co_de% ist nicht sehr effizient .
Obwohl ich hier häufig antworte, bietet die .push_back
einen besseren Platz für Rcpp Fragen.
Mit den Informationen aus der Antwort von @ baptiste ergibt sich schließlich ein wohlgeformter Datenrahmen:
> %Vor%Ich denke, der Punkt bleibt, dass dies aufgrund von push_back (wie vorgeschlagen von @Dirk) und dem zweiten ineffizient sein könnte Sprachanruf-Auswertung Ich habe die rcpp unitTests nachgeschlagen und konnte mir noch nichts Besseres einfallen lassen. Hat jemand irgendwelche Ideen?
Aktualisierung:
Mit @ Dirks Vorschlägen (Danke!) scheint dies eine einfachere und effizientere Lösung zu sein:
%Vor%Ich stimme mit joran überein. Die Ausgabe einer C-Funktion, die innerhalb von R aufgerufen wird, ist eine Liste aller ihrer Argumente, sowohl "in" als auch "out", so dass jede "Spalte" des Datenrahmens im C-Funktionsaufruf als Argument dargestellt werden könnte. Sobald das Ergebnis des C-Funktionsaufrufs in R ist, besteht alles, was zu tun ist, darin, diese Listenelemente unter Verwendung der Listenindizierung zu extrahieren und ihnen die geeigneten Namen zu geben.