在Rcpp中声明一个变量作为引用

时间:2018-01-21 02:22:00

标签: rcpp rcpp11

在C ++中,我们可以将变量声明为引用。

int a = 10;
int& b = a;

如果我们设置b=15a也会更改。

我想在Rcpp中做类似的事情。

List X = obj_from_R["X"];
IntegerVector x_i = X[index];
x_i = value;

我想通过在其向量之一中插入一个值来更新R中名为X的对象。上面的代码不起作用,所以我尝试了这个:

IntegerVector& x_i = X[index];

并收到错误。

error: non-const lvalue reference to type 'IntegerVector'
      (aka 'Vector<13>') cannot bind to a temporary of type 'Proxy' (aka 'generic_proxy<19>')

1 个答案:

答案 0 :(得分:7)

这个问题在不同的变体中被提出了很多问题。

以下是一些受欢迎的答案:

  1. Within C++ functions, how are Rcpp objects passed to other functions (by reference or by copy)?
  2. Update Rcpp::NumericMatrix passed by reference using RcppArmadillo submat()
  3. Rcpp pass by reference vs. by value
  4. Passing by reference a data.frame and updating it with rcpp
  5. Rcpp Update matrix passed by reference and return the update in R
  6. Passing large matrices to RcppArmadillo function without creating copy (advanced constructors)
  7. Rcpp: Inconsistent behavior with proxy model
  8. Why is my Rcpp implementation for finding the number of unique items slower than base R?
  9. 更多细节......

    我写的FAQ条目 Rcpp changed the (const) object I passed by value

      

    Rcpp 对象是底层 R 对象的包装器。 SEXP或S表达式。 SEXP是一个指针变量,用于保存 R 对象数据存储位置 R:Internals 。也就是说,SEXP不包含 R 对象的实际数据,而只是对数据所在位置的引用。为 R 对象创建新的 Rcpp 对象以输入 C ++ 时,此对象将使用为原始 R提供动力的相同SEXP 对象如果类型匹配,则必须创建新的SEXP以确保类型安全。本质上,底层SEXP对象通过引用传递,而不将显式副本转换为 C ++ 。我们将此安排称为代理模型。

    所以,&只是视觉糖,因为 Rcpp 对象已经作为参考。

    因此,以下将显示结论:

    #include <Rcpp.h>
    
    // [[Rcpp::export]]
    void show_references(Rcpp::List X, 
                         Rcpp::IntegerVector y, 
                         int index = 0) {
      X[index] = y;
    }
    

    示例:

    y_vec = c(-1L, 8L, 12L)
    X_list = list(a = c(0L, 2L, 3L), b = c(42L, 50L, 30L))
    X_list
    # $a
    # [1] 0 2 3
    #
    # $b
    # [1] 42 50 30
    
    show_references(X_list, y_vec)
    X_list
    # $a
    # [1] -1  8 12
    #
    # $b
    # [1] 42 50 30
    

    我创建的以下 Rcpp 代理模型幻灯片应该进一步说明发生了什么

    enter image description here enter image description here

    enter image description here enter image description here

    来源:https://twitter.com/axiomsofxyz/status/938881541396197377