作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图通过 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
函数是可能的,但默认是 something 作为 SEXP
。而 C++ 只有 return
所以你需要 R 来处理 invisible
部分。
关于c++ - 无形中返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48151252/
我是一名优秀的程序员,十分优秀!