Rcpp:将元素存储到向量的子集

Rcpp:将元素存储到向量的子集,r,rcpp,R,Rcpp,我仍然在思考来自R上下文的Rcpp逻辑,所以请耐心等待我!从以下代码: Cjplus <- c(0,0) Kseq <- c(1,2) cand <- c(0,1) cppFunction("NumericVector test(NumericVector Cjplus, NumericVector Kseq, NumericVector cand, int i) { NumericVector A = as<Numer

我仍然在思考来自R上下文的Rcpp逻辑,所以请耐心等待我!从以下代码:

Cjplus <- c(0,0)
Kseq <- c(1,2)
cand <- c(0,1)
cppFunction("NumericVector test(NumericVector Cjplus, NumericVector Kseq,
                   NumericVector cand, int i) {
  NumericVector A = as<NumericVector>(Cjplus[Kseq-1]);
  int B = cand[i-2];
  as<NumericVector>(Cjplus[Kseq-1]) = A + B;
  return Cjplus[Kseq-1];
}")
test(Cjplus, Kseq, cand, 3)

Cjplus我不明白您为什么尝试使用子集赋值

Cjplus <- c(0,0)
Kseq <- c(1,2)
cand <- c(0,1)

cppFunction("NumericVector test(NumericVector Cjplus, NumericVector Kseq,
                   NumericVector cand, int i) {
  NumericVector A = Cjplus[Kseq-1];
  double B = cand[i-2];
  A = A + B;
  return A;
}")
test(Cjplus, Kseq, cand, 3)
#[1] 1 1
library(Rcpp)
cppFunction("NumericVector test(const NumericVector Cjplus, NumericVector Kseq,
                   NumericVector cand, int i) {
  NumericVector C = clone(Cjplus);
  NumericVector A = C[Kseq-1];
  double B = cand[i-2];
  A = A + B;
  C[Kseq-1] = A;
  return C;
}")
test(Cjplus, Kseq, cand, 3)
#[1] 1 1

一般来说,您不应该一次做太多的事情(在您的示例中,子集赋值和向量与整数的相加是循环的)。如果要修改输入值,也应始终复制输入值。否则,函数会修改通过引用传递的值(在示例中为
Cjplus
)作为副作用。应该避免副作用,除非这些副作用是为了性能优化和精心管理。坦率地说,“你从哪里来”并不重要,重要的是你了解编译语言和静态链接语言是如何工作的,这是完全不同的。有很多非常好的C++书籍(而且C++是很好的)。浏览代码时,您会错误地从值中减去-1,从位置中减去-1。也许可以打印更多的调试语句(并切换到
sourceCpp()
,以便于编辑)。我添加了一个subset-assignment示例。感谢您提供这两个版本!这对我理解C++中的R是如何基本的有帮助。