返回结果不可见

Return result invisibly

本文关键字:结果 返回      更新时间:2023-10-16

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

然后我走迂回的路,通过Rcpp::Function从 Rcpp 拨打 R 的base::invisible。我的代码现在是这样的:

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侧再包一层,然后叫一天吗?

我认为关键真的是void功能是可能的,但默认值是SEXP 而且C++只有return所以你需要R作为invisible部分。

相关文章: