12

rcppドキュメントとギャラリーを見て、Rcpp::DataFrame参照によって DataFrame を変更する方法がわからないことに気付きました。少しグーグルで検索すると、SOでこの投稿が見つかり、アーカイブでこの投稿が見つかりました。明らかなことは何もないので、「それはすでにそうなっている」または「それは意味をなさないので」などの大きな何かを見落としているのではないかと思います。

コンパイルした以下を試しましたが、Rでdata.frame渡されたオブジェクトは そのままでしたupdateDFByRef

#include <Rcpp.h>
using namespace Rcpp;

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

2 に答える 2

14

DataFrame::operator[]実際に実装されている方法は、それを行うとコピーになります。

df["newCol"] = newCol;

必要なことを行うには、特定の属性を持つベクトルのリストであるデータ フレームとは何かを考慮する必要があります。次に、ベクター (コンテンツではなくポインター) をコピーすることにより、元のデータからデータを取得できます。

このような何かがそれを行います。もう少し手間がかかりますが、それほど難しくありません。

// [[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 ;
}

このアプローチに関連する問題があります。元のデータ フレームと作成したデータ フレームは同じベクトルを共有しているため、問題が発生する可能性があります。したがって、自分が何をしているのかを知っている場合にのみ、これを使用してください。

于 2013-04-01T17:00:35.537 に答える