gpt4 book ai didi

r - 在Rcpp中测试值身份

转载 作者:行者123 更新时间:2023-12-04 02:00:10 25 4
gpt4 key购买 nike

我是一个相对绿色的Rcpp用户,我不确定如何测试两个值是否相同。

例如,以下函数用于测试列表中是否包含值,但对于简单的测试用例,返回错误的结果

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
LogicalVector is_member (SEXP val, List coll) {

int coll_len = coll.size();

if (coll_len == 0) {
return LogicalVector::create();
} else {

Function identical("identical");

for (int ith = 0; ith < coll_len; ++ith) {

SEXP elem = coll[ith];

if (identical(val, elem)) {
return true;
}
}

return false;
}
}

is_member(1L, list(1L))
# FALSE
is_member(NaN, list(NaN, NaN))
# False


为什么会这样呢?如何在相同的极端情况和基本功能“ identical”的持久性下测试身份?为此,我找不到任何Rcpp糖,但是如果找不到直接的解决方案,我怀疑可能是无序集合或唯一函数可用于测试身份。

如果我的C ++不习惯/危险,我也希望能得到反馈,如果我一直含糊不清,请在下面留下评论,然后我将修正问题。

谢谢

最佳答案

呵呵,看来您偶然发现了一个小错误-我们没有以预期的方式将bool转换为LogicalVector

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
LogicalVector return_true() {
return true;
}

/*** R
return_true()
*/




> return_true()
[1] FALSE


所以也许现在就返回 LogicalVector::create(true)

您代码中的另一个大问题: identical返回一个 SEXP,而不是 bool!您想显式地以 bool的形式获取结果:

Shield<SEXP> result(identical(val, elem));
if (LOGICAL(result)[0]) { ... }


尽管将结果直接分配给 bool应该可以,但是似乎不行。回叫R时仍然有这样的陷阱。

也就是说,您的代码还有其他注释:


通常,回叫R很慢*,因此除非需要,否则不要这样做,
除非您知道自己在做什么,否则不要使用原始的 SEXP。在这里,您很幸运,因为 List的子项受到隐式保护,但这通常是不安全的。
只需调用迭代器索引 i,这是最常见的格式(看到 ith感觉很奇怪)。


事实证明,还有一个用于 identical的C API。在 RInternals.h中,我们有

/* R_compute_identical:  C version of identical() function
The third arg to R_compute_identical() consists of bitmapped flags for non-default options:
currently all default to TRUE, so the flag is set for FALSE values:
1 = !NUM_EQ
2 = !SINGLE_NA
4 = !ATTR_AS_SET
8 = !IGNORE_BYTECODE
*/
Rboolean R_compute_identical(SEXP, SEXP, int);


因此您可能只想使用它。

关于r - 在Rcpp中测试值身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25829123/

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