Ответ 1
Способ 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 ;
}
Есть проблемы, связанные с этим подходом. Ваш исходный фрейм данных и тот, который вы создали, используют одни и те же векторы, и поэтому могут произойти такие плохие вещи. Поэтому используйте это, только если вы знаете, что делаете.