我试图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)
嗯。“最终”我们总是会得到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部分。