自动将逻辑向量转换为整数的问题
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 个字节)
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 个字节)