r - 使用 Rcpp 就地编辑后 sum 函数出现问题

标签 r sum rcpp

如果修改 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/#812Rcpp/#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/

相关文章:

sql - 需要计算百分比

excel - 不同表的动态范围总和

r - 将 boost 多精度与 RcppEigen 结合使用

python - 尝试通过网状包在 R 中使用 Python Gekko 时出错

python - 来自多维数组的 Numpy Sum?

r - R中所有CRAN中所有软件包的列表和描述

c++ - 模板继承 : Symbol not found

r - 迭代 S4 对象槽 Rcpp

引用 R 中 data.table 中的前一行,有一个条件

R - 使用 rvest 包进行抓取