如何在 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;
}
Run Code Online (Sandbox Code Playgroud)
但它产生
#> foo()
integer64
[1] 1234567890123456789 9218868437227407266
Run Code Online (Sandbox Code Playgroud)
我需要得到
#> foo()
integer64
[1] 1234567890123456789 <NA>
Run Code Online (Sandbox Code Playgroud) 我有一个完全由integer64列组成的数据框,我想将其转换为矩阵.
library(bit64)
(dfr <- data.frame(x = as.integer64(10^(9:18))))
## x
## 1 1000000000
## 2 10000000000
## 3 100000000000
## 4 1000000000000
## 5 10000000000000
## 6 100000000000000
## 7 1000000000000000
## 8 10000000000000000
## 9 100000000000000000
## 10 1000000000000000000
Run Code Online (Sandbox Code Playgroud)
不幸的是,as.matrix没有给出正确的答案.
(m <- as.matrix(dfr))
## x
## [1,] 4.940656e-315
## [2,] 4.940656e-314
## [3,] 4.940656e-313
## [4,] 4.940656e-312
## [5,] 4.940656e-311
## [6,] 4.940656e-310
## [7,] 4.940656e-309
## [8,] 5.431165e-308
## [9,] 5.620396e-302
## [10,] 7.832953e-242
Run Code Online (Sandbox Code Playgroud)
问题似乎是 …
在不久的将来,我的包中将需要 64 位整数。我正在研究基于该bit64包的可行性。data.table基本上,我计划在 S3类中包含一列或多列interger64,并计划使用 Rcpp 将此表传递给 C++ 函数。
以下来自Rcpp 图库的nanotime 示例清楚地解释了如何在 double 向量上构建 64 位 int 向量,并解释如何创建integer64从 C++ 到 R 的对象。
我现在想知道如何处理interger64从 R 到 C++ 的问题。我想我可以颠倒这个原则。
void useInt64(NumericVector v)
{
double len = v.size();
std::vector<int64_t> n(len);
// transfers values 'keeping bits' but changing type
// using reinterpret_cast would get us a warning
std::memcpy(&(n[0]), &(v[0]), len * sizeof(double));
// use n in further computations
}
Run Code Online (Sandbox Code Playgroud)
那是对的吗?还有其他方法可以做到这一点吗?我们可以使用包装器吗as<std::vector<int64_t>>(v)?对于最后一个问题,我猜转换不是基于位到位的复制。
I came across the following result that seems very un-intuitive to me:
library(bit64)
x = as.integer64(200)
y = as.integer64(300)
min(x, y)
integer64
[1] 300
min.integer64(x, y)
integer64
[1] 300
Run Code Online (Sandbox Code Playgroud)
Surely there is something obvious that I do not get but can someone point it out to me ?
> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Matrix products: default
BLAS: /usr/lib64/libblas.so.3.4.2
LAPACK: /usr/lib64/liblapack.so.3.4.2
locale:
[1] LC_CTYPE=en_US.utf8 LC_NUMERIC=C
[3] LC_TIME=en_US.utf8 LC_COLLATE=en_US.utf8
[5] LC_MONETARY=en_US.utf8 LC_MESSAGES=en_US.utf8 …Run Code Online (Sandbox Code Playgroud) 我在包含长整数的csv中有数据.我在csvs和fst文件之间交换这些数据.
例如,
library(bit64)
library(data.table)
library(fst)
library(magrittr)
# Prepare example csvs
DT64_orig <- data.table(x = (c(2345612345679, 1234567890, 8714567890)))
fwrite(DT64_orig, "DT64_orig.csv")
# Read and move to fst
DT64 <- fread("DT64_orig.csv")
write.fst(DT64, "DT64_fst.fst")
DT_fst2 <-
read.fst("DT64_fst.fst") %>%
setDT
# bit64 integers not preserved:
identical(DT_fst2, DT64)
Run Code Online (Sandbox Code Playgroud)
有没有办法使用包含整数的fst文件data.tablebit64