我试图通过Rcpp从C++函数隐式返回结果(实际上是NULL)。不幸的是,我无法找到如何做到这一点。我的第一个尝试是设置R_Visible,但是不再导出此全局变量。接下来,我尝试直接调用do_invisible(invisible调用的原语),但同样,它没有导出(老实说,我不确定如何正确调用它)。

然后,我走了回旋处,通过base::invisible从Rcpp调用R的Rcpp::Function。我的代码现在是这样的:

Rcpp::Function invisible = Rcpp::Environment("package:base")["invisible"];

// [[Rcpp::export]]
SEXP read_value(Rcpp::XPtr<std::vector<int>> x, int index) {
    try {
        return Rcpp::wrap(x->at(index));
    } catch (std::out_of_range const&) {
        return invisible(R_NilValue);
    }
}

编译并执行。不幸的是,invisible调用只是被忽略了。当使用无效索引从R调用函数时,它会打印NULL。我希望它什么也不打印。

供测试用:
// [[Rcpp::export]]
Rcpp::XPtr<std::vector<int>> make_xvec() {
    return Rcpp::XPtr<std::vector<int>>{new std::vector<int>{1, 2, 3}};
}

/*** R
xv = make_xvec()
read_value(xv, 1)
invisible(read_value(xv, 4)) # Works
read_value(xv, 4)            # Doesn’t work
*/

最佳答案

嗯“最终”,我们总是得到SEXP .Call(id, SEXP a, SEXP b, ...),并且最终(通过Rcpp属性)带有类似

R> rqdb::qdbConnect
function ()
{
    .Call(`_rqdb_qdbConnect`)
}
<environment: namespace:rqdb>
R>

当我们称它为我们时
R> qdbConnect()
[1] TRUE
R> invisible(qdbConnect())
R>

您不能仅在R侧包装另一层并命名为“day”吗?

我认为关键确实是可以使用void函数,但是默认值是SEXP。而且C++仅具有return,因此invisible部分需要R。

09-04 07:38