如果修改 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
的值。
我怎么解决这个问题?
使用例如时没有问题x <- sample(10L)
相反。
最佳答案
@F.Privé 的怀疑是正确的。这是 ALTREP 的问题,Rcpp 尚不支持,c.f. 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)
*/
第一个 block 给出:
> 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
而第二个 block 给出:
> 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
使用了快捷方式。请参阅here有关 ALTREP 的进一步阅读(包括引用资料)。
目前唯一的解决方案似乎是避免更改函数参数。
关于r - 使用 Rcpp 就地编辑后 sum 函数出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54856924/