标签: bit64

Rcpp 和 int64 NA 值

如何在 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)

r rcpp na bit64

11
推荐指数
2
解决办法
180
查看次数

如何将integer64值的数据帧转换为矩阵?

我有一个完全由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)

问题似乎是 …

r bit64

9
推荐指数
1
解决办法
2765
查看次数

integer64 和 Rcpp 兼容性

在不久的将来,我的包中将需要 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)?对于最后一个问题,我猜转换不是基于位到位的复制。

r rcpp data.table bit64

6
推荐指数
0
解决办法
362
查看次数

Why does min(200, 300) returns 300 for integer64 class

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)

r bit64

6
推荐指数
2
解决办法
80
查看次数

bit64与fst的整数

我在包含长整数的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

r data.table bit64

5
推荐指数
1
解决办法
145
查看次数

标签 统计

bit64 ×5

r ×5

data.table ×2

rcpp ×2

na ×1