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
最后,是否有可能克服这种从逻辑到整数的严格转换?
答案 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个字节)