看看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)
这种方法存在一些问题.您的原始数据框和您创建的数据框共享相同的向量,因此可能会发生不好的事情.所以只有在你知道自己在做什么的情况下才能使用它.
| 归档时间: |
|
| 查看次数: |
3906 次 |
| 最近记录: |