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

时间:2019-02-28 21:38:36

标签: r rcpp

R api允许直接通过指针处理SEXP,从而简化了依赖于转换非原始数据类型的所有处理。 例如,我们可以使用unsigned int来处理带有卷轴或整数类型的SEXP。问题是R提供了强制转换的能力 自动从逻辑到整数SEXP。内部R标头将逻辑定义为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女巫块就地交换也存在相同的问题。例如:

// [[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

最后,是否有可能克服这种从逻辑到整数的严格转换?

1 个答案:

答案 0 :(得分:1)

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

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

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

77的整数并不意味着任何逻辑上的含义,因为它不可能在基本操作中发生。因此,实际上,R在您施加不可能值时的作用基本上是未知的。

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

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