我试图通过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
*/
答案 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
部分。