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

问题描述 投票:0回答:1

在 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
}

这次效果很好,但我想知道:

  1. 这是最好(最简单)的方法吗?
  2. 在这种情况下,
    data
    会作为副本还是参考传递吗?

或者还有其他解决方案吗?

r rcpp
1个回答
0
投票

“如果不起作用,请尝试更简单的方法。”

DataFrame 是一种很棒的类型,但它不是本机 SEXP 对象,因此这使得创建 Rcpp 基础设施变得困难。 DataFrame 实际上只是一个(等长)向量的列表。因此,返回时,我主要在最后一步创建 DataFrame,将不同的列(构成它)视为主要对象。进入的过程也是如此:取出列,处理这些向量。

我尝试在 RcppExamples 包和 Rcpp Gallery 中积累一些文档。但就是这样。

(最后,“它是如何进来的?”这通常不用担心,因为 Rcpp always 通过

.Call()
连接 R,它接受(零个或多个)SEXP 并返回 SEXP。所以你总是处于指针,而不是复制完整的超大对象。

如果您有想法(更好的是代码)来让事情变得更好,我们可能会洗耳恭听。

© www.soinside.com 2019 - 2024. All rights reserved.