隐形返回结果

时间:2018-01-08 13:24:02

标签: c++ r rcpp

我试图通过Rcpp从C ++函数中隐形地返回一个结果(事实上,NULL)。不幸的是我无法找到如何做到这一点。我的第一次尝试是设置R_Visible,但不再导出此全局变量;接下来,我尝试直接调用do_invisibleinvisible调用的原语),但同样地,它不会被导出(说实话,我不确定如何正确调用它)。

然后我走了迂回的方式,通过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
*/

1 个答案:

答案 0 :(得分:0)

嗯。 &#34;最终&#34;我们总是得到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侧包裹另一层并称它为一天吗?

我认为关键在于void函数是可行的,但默认为某事SEXP。而且C ++只有return所以你需要R invisible部分。