【发布时间】:2020-04-23 11:35:01
【问题描述】:
如何在 64 位向量中将 NA 值从 Rcpp 传递给 R?
我的第一个方法是:
// [[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;
}
但它会产生
#> foo()
integer64
[1] 1234567890123456789 9218868437227407266
我需要得到
#> foo()
integer64
[1] 1234567890123456789 <NA>
【问题讨论】:
-
您不能在
memcpy之后使用NA_REAL,因为此时位模式是int64之一。 -
我还要编辑标题。 默认 64 位 NA 只是
NA_real,这不是您的问题所在。 -
但是 memcpy 只复制 64 位 (
sizeof(double)) 对吗?所以res[0]从val获得64 位,然后设置res[1] = ...使用接下来的64 位。我同意结果,但不要真正遵循您的第一条评论。 -
重点是向量的内容然后逐位成为
int64_t,它只是“停放在”@ 987654333@ 向量(又名NumericVector)。没有神奇的逻辑副本。 Jems 正在亲手完成所有繁重的工作。包括映射 NA。 -
那个。是。什么。我有。到过。试。到。解释。例如,查看现有 NA 定义的 R 源。查看一些使用
int64的包,看看它们做了什么。