自动将逻辑向量转换为整数的问题

Problem with automatically cast Logical vector to integer

R api 允许直接通过指针处理 SEXP,这简化了所有依赖于转换非原始数据类型的处理。 例如,我们可以使用 unsigned int 来处理 SEXP 的 reel 或 integer 类型。问题是 R 赋予了施法的能力 自动从逻辑到整数 SEXP。内部 R header 将逻辑定义为 C 整数类型原因-我认为-非逻辑 状态。例如,如果我使用此代码:

// [[Rcpp::export]]
SEXP test(SEXP x){
  int* arr= INTEGER(x);
  arr[0]=77;
  return x;
} 

我 运行 在 R:

x<-NA             ## by default NA is logical vector
is.logical(x)  ## return TRUE
test(x)            ## return TRUE 
is.logical(x)  ## return TRUE
print(x+0L )   ## normaly will return  TRUE but it gives 77
 max(x)          ## gives 77 !

最基本的功能将 x 视为整数和、最大值、最小值... Rcpp 块 in-place 交换也有同样的问题。例如:

// [[Rcpp::export]]
IntegerVector test1(IntegerVector x){
  x[0]=77;
  return x;
} 

使用 R :

x<-NA 
test1(x)  ## x still NA
x<-as.integer(x)
test1(x) ## edit to 77

最后,是否有可能克服从逻辑到整数的关键转换?

R 中的逻辑每个元素的字节数与整数(4 个字节)相同。这与 C 不同,其中 bool 有 1 个字节*,而 int 有 4 个字节。 R 这样做的原因可能是因为在这种方法中,向上转换逻辑到整数是瞬时的,逻辑和整数之间的向量乘法没有开销。

在这两种情况下,您所做的是访问指向向量开头的指针,并将前 4 个字节设置为对应于 77 的值。

在 R 端,名为 "x" 的变量仍然指向相同的底层数据。但是由于您更改了基础数据,x 数据的值现在具有对应于 77 的 int 的字节。

77 的整数在逻辑上没有任何意义,因为它不可能在基本操作中发生。所以说真的,当你强制一个不可能的值时 R 做了什么基本上是未知的。

R中的逻辑只能有三个值:TRUE(对应值为1)、FALSE(对应值为0)和NA(对应值为-2147483648)。

*(技术上,实现已定义,但我只将其视为 1 个字节)