通过引用传递data.frame并使用rcpp更新它

sta*_*ant 11 r rcpp

看看rcpp文档和Rcpp::DataFrame库中我意识到我不知道如何通过引用修改DataFrame.谷歌搜索了一下我在SO上找到了这篇文章,这篇文章在档案上.没有什么明显的,所以我怀疑我会错过一些像"已经是这种情况因为"或"因为它没有意义"的大事.

我尝试了以下编译,但data.frame传递给updateDFByRefR 的对象 保持不变

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void updateDFByRef(DataFrame& df) {
    int N = df.nrows();
    NumericVector newCol(N,1.);
    df["newCol"] = newCol;
    return;
}
Run Code Online (Sandbox Code Playgroud)

Rom*_*ois 13

DataFrame::operator[]当你这样做时,实现的方式确实是利用副本:

df["newCol"] = newCol;
Run Code Online (Sandbox Code Playgroud)

要做你想做的事,你需要考虑数据框是什么,矢量列表,具有某些属性.然后你可以通过复制向量(指针,而不是它们的内容)从原始数据中获取数据.

这样的事情就是这样.这是一项更多的工作,但并不那么难.

// [[Rcpp::export]]
List updateDFByRef(DataFrame& df, std::string name) {
    int nr = df.nrows(), nc= df.size() ;
    NumericVector newCol(nr,1.);
    List out(nc+1) ;
    CharacterVector onames = df.attr("names") ;
    CharacterVector names( nc + 1 ) ;
    for( int i=0; i<nc; i++) {
        out[i] = df[i] ;
        names[i] = onames[i] ;
    }
    out[nc] = newCol ;
    names[nc] = name ;
    out.attr("class") = df.attr("class") ;
    out.attr("row.names") = df.attr("row.names") ;
    out.attr("names") = names ;
    return out ;
}
Run Code Online (Sandbox Code Playgroud)

这种方法存在一些问题.您的原始数据框和您创建的数据框共享相同的向量,因此可能会发生不好的事情.所以只有在你知道自己在做什么的情况下才能使用它.