无形地返回结果

Kon*_*lph 8 c++ r rcpp

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

然后我走了迂回的路,base::invisible从Rcpp通过一个叫R's 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这编译并执行.不幸的是,这个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
*/
Run Code Online (Sandbox Code Playgroud)

Dir*_*tel 2

嗯。“最终”我们总是会得到SEXP .Call(id, SEXP a, SEXP b, ...)这样的结果(通过 Rcpp 属性):

R> rqdb::qdbConnect
function () 
{
    .Call(`_rqdb_qdbConnect`)
}
<environment: namespace:rqdb>
R> 
Run Code Online (Sandbox Code Playgroud)

当我们调用它时,它会给我们

R> qdbConnect()
[1] TRUE
R> invisible(qdbConnect())
R> 
Run Code Online (Sandbox Code Playgroud)

就不能在R侧再包一层就到此为止吗?

我认为关键确实是void函数是可能的,但默认SEXP. 而 C++ 只有这样return,所以你需要 R 来完成这invisible部分。