Wie kann ich einen NA-Wert von Rcpp an R in einem 64-Bit-Vektor übergeben?
Mein erster Ansatz wäre:
// [[Rcpp::export]]
Rcpp::NumericVector foo() {
Rcpp::NumericVector res(2);
int64_t val = 1234567890123456789;
std::memcpy(&(res[0]), &(val), sizeof(double));
res[1] = NA_REAL;
res.attr("class") = "integer64";
return res;
}
Aber es gibt nach
#> foo()
integer64
[1] 1234567890123456789 9218868437227407266
Ich benötige
#> foo()
integer64
[1] 1234567890123456789 <NA>
NA_REAL
nach dem nicht verwenden,memcpy
da das Bitmuster an diesem Punkt das von a istint64
.NA_real
das, worum es in Ihrer Frage nicht geht.sizeof(double)
), oder? Sores[0]
bekommt 64 Bits ausval
und dann Einstellenres[1] = ...
Anwendungen die nächsten 64 Bits. Ich bin mit dem Ergebnis einverstanden, aber folge deinem ersten Kommentar nicht wirklich.int64_t
das lediglich wird als „geparkt“ in einemdouble
Vektor (akaNumericVector
). Es gibt keine magische Logikkopie. Jems erledigt die ganze harte Arbeit von Hand. Einschließlich Mapping-NAs.int64
und sehen Sie, was sie tun.Antworten:
Okay, ich glaube ich habe eine Antwort gefunden ... (nicht schön, aber funktionierend).
Kurze Antwort:
was in ... resultiert
Längere Antwort
Überprüfen, wie
bit64
einNA
Erstellt am 23.04.2020 durch das reprex-Paket (v0.3.0)
wir sehen, dass es ein ist
10000...
. Dies kann mit neu erstelltRcpp
werdenint64_t val = 1ULL << 63;
. Die Verwendungmemcpy()
anstelle einer einfachen Zuweisung mit=
stellt sicher, dass keine Bits geändert werden!quelle
#define
Anweisung, ein Bitmuster (häufig entwedermin
odermax
) als NA-Wert zu deklarieren .Es ist wirklich viel, viel einfacher. Wir haben das Verhalten eines
int64
in R, das von (mehreren) Add-On-Paketen angeboten wird, von denen das Beste darin bestehtbit64
, uns dieinteger64
S3-Klasse und das damit verbundene Verhalten zu geben.Und es definiert die NA intern wie folgt:
Und das ist alles was es gibt. R und seine Pakete sind in erster Linie C-Code und
LLONG_MIN
existieren dort und gehen (fast) bis zu den Gründervätern zurück.Hier gibt es zwei Lektionen. Die erste ist die Erweiterung von IEEE, die NaN und Inf für Gleitkommawerte definiert . R geht tatsächlich weit darüber hinaus und fügt hinzu
NA
für jeden seiner Typen hinzu . So ziemlich wie oben: durch Reservieren eines bestimmten Bitmusters. (In einem Fall ist dies der Geburtstag eines der beiden ursprünglichen R-Schöpfer.)Die andere besteht darin, die Menge Arbeit zu bewundern, die Jens mit dem
bit64
Paket geleistet hat , sowie alle erforderlichen Konvertierungs- und Bedienerfunktionen. Die nahtlose Konvertierung aller möglichen Werte, einschließlich NA, NaN, Inf, ... ist keine leichte Aufgabe.Und es ist ein ordentliches Thema, das nicht zu viele Menschen kennen. Ich bin froh, dass Sie die Frage gestellt haben, denn wir haben jetzt eine Aufzeichnung hier.
quelle