返回结果不可见
Return result invisibly
我正在尝试通过 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
功能是可能的,但默认值是SEXP
。 而且C++只有return
所以你需要R作为invisible
部分。
相关文章:
- 如何返回一个类的两个对象相加的结果
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- C++Brute Force攻击函数不会返回结果
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- C++ 获取函数在常量引用中按值返回的结果
- 如何在一个表达式中生成并返回结果?
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- 三元运算符在返回语句中给出意外的结果
- 为什么函数 tellg() 没有返回好的结果?
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 有没有办法将 for 循环结果返回到像三元运算符这样的函数中?
- 使用std::tie进行类似golang的错误处理,同时返回结果,是否有缺点?(C++11)
- 检查文本文件中的 0 或 1,并根据结果返回
- 如何使用boost::any_range连接多个boost范围并作为函数w/o的结果返回
- 如何从线程的结果返回Qt对象(Qtfutur)
- C++:当在函数内部创建新对象并将其作为结果返回时,我必须使用新运算符来创建对象