在 Rcpp 函数
foo
中,参数 data
可能是一个大数据框,因此我想将其用作 const 引用。现在我想将其默认值设置为空数据框,以便用户可以简单地调用 foo()
而不是 R 中的 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
}
这次效果很好,但我想知道:
data
会作为副本还是参考传递吗?或者还有其他解决方案吗?
“如果不起作用,请尝试更简单的方法。”
DataFrame 是一种很棒的类型,但它不是本机 SEXP 对象,因此这使得创建 Rcpp 基础设施变得困难。 DataFrame 实际上只是一个(等长)向量的列表。因此,返回时,我主要在最后一步创建 DataFrame,将不同的列(构成它)视为主要对象。进入的过程也是如此:取出列,处理这些向量。
我尝试在 RcppExamples 包和 Rcpp Gallery 中积累一些文档。但就是这样。
(最后,“它是如何进来的?”这通常不用担心,因为 Rcpp always 通过
.Call()
连接 R,它接受(零个或多个)SEXP 并返回 SEXP。所以你总是处于指针,而不是复制完整的超大对象。
如果您有想法(更好的是代码)来让事情变得更好,我们可能会洗耳恭听。