如果在 Rcpp 中修改 IntegerVector 的值:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void test(IntegerVector x) {
x[5] = 77;
}
test()
在 R 中运行函数后:
x <- 10:1
test(x)
print(x) # 10 9 8 7 6 77 4 3 2 1
sum(x) # 55
sum 函数返回原始数组的值10:1
。我怎么解决这个问题?
使用 eg 时没有问题x <- sample(10L)
。
@F.Privé 的怀疑是正确的。这是 ALTREP 的问题,Rcpp 尚不支持,参见Rcpp/#812和Rcpp/#906。我们可以通过检查变量更明确地看到这一点x
:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void test(IntegerVector x) {
x[5] = 77;
}
/*** R
x <- 10:1
.Internal(inspect(x))
test(x)
.Internal(inspect(x))
print(x) # 10 9 8 7 6 77 4 3 2 1
sum(x) # 55
x <- 10:1
.Internal(inspect(x))
x[6] <- 77L
.Internal(inspect(x))
print(x) # 10 9 8 7 6 77 4 3 2 1
sum(x)
*/
第一个块给出:
> x <- 10:1
> .Internal(inspect(x))
@55f79a9d6c58 13 INTSXP g0c0 [NAM(3)] 10 : 1 (compact)
> test(x)
> .Internal(inspect(x))
@55f79a9d6c58 13 INTSXP g0c0 [NAM(3)] 10 : 1 (expanded)
> print(x) # 10 9 8 7 6 77 4 3 2 1
[1] 10 9 8 7 6 77 4 3 2 1
> sum(x) # 55
[1] 55
虽然第二个块给出:
> x <- 10:1
> .Internal(inspect(x))
@55f79b1f9018 13 INTSXP g0c0 [NAM(3)] 10 : 1 (compact)
> x[6] <- 77L
> .Internal(inspect(x))
@55f7a096e5e8 13 INTSXP g0c4 [NAM(1)] (len=10, tl=0) 10,9,8,7,6,...
> print(x) # 10 9 8 7 6 77 4 3 2 1
[1] 10 9 8 7 6 77 4 3 2 1
> sum(x)
[1] 127
所以在改变向量中的一个值后,它仍然声称是10 : 1
,为此sum
使用了一个捷径。有关ALTREP 的进一步阅读(包括参考资料),请参见此处。
目前唯一的解决方案似乎是避免更改函数参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句