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