在Rcpp中为常量引用DataFrame参数设置默认值的最佳实践是什么?

tktrz96b  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(148)

在一个Rcpp函数foo中,参数data可能是一个很大的数组,所以我想把它作为一个常量引用。现在我想将它的默认值设置为空的嵌套框,这样用户就可以在R中简单地调用foo()而不是foo(data.frame())
我试过这个:

#include <Rcpp.h>
using namespace Rcpp;

//[[Rcpp::export]]
DataFrame foo(const DataFrame &data = DataFrame())
{
    //Do something
}

但它什么也不做,似乎DataFrame()没有被视为默认值。我试着用这个方法来重载函数:

#include <Rcpp.h>
using namespace Rcpp;

//[[Rcpp::export]]
DataFrame foo(const DataFrame &data)
{
    //Do something
}

//[[Rcpp::export]]
DataFrame foo()
{
    DataFrame data = DataFrame::create();
    return foo(data);
}

但RCPP告诉我有一个矛盾的声明。我试过Nullable

#include <Rcpp.h>
using namespace Rcpp;

//[[Rcpp::export]]
DataFrame foo(Nullable<DataFrame> data_ = R_NilValue)
{
    DataFrame data;
    if (data_.isNotNull())
    {
        data = DataFrame(data_);
    }
    else
    {
        data = DataFrame::create();
    }
    // Do something
}

这一次,我做得很好,但我想知道:
1.这是做这件事的最好(最简单)的方法吗?
1.在这种情况下,data将作为副本或引用传递?
或其他解决方案?

koaltpgm

koaltpgm1#

“不行的话,就换个简单点的。”
DataFrame是一种很好的类型,但它不是本机SEXP对象,因此创建Rcpp基础设施很困难。DataFrame实际上只是一个(等长)向量的列表。因此,返回时,我主要是在最后一步创建DataFrame,将不同的列(构成它)作为主要对象。在路上,把柱子拿出来,研究矢量
我试图在RcppExamples包和Rcpp Gallery中积累一些文档。但仅此而已。
(最后,“它是怎么进来的?这通常不是一个问题,因为Rcpp * 总是 * 通过.Call()与R接口,.Call()接受(零个或多个)SEXP并返回SEXP。所以你总是在 * 指针 * 的领域,而不是完全复制超大对象。
如果你有想法(更好的是,代码)让事情变得更好,我们可能会洗耳恭听。

相关问题