gpt4 book ai didi

c++ - 无形中返回结果

转载 作者:可可西里 更新时间:2023-11-01 17:58:12 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com