我试图通过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。