比较Rcpp中的两个值,而不强制转换为特定类型
Comparing two values in Rcpp without casting to specific type
我试图使用Rcpp比较c++中的两个通用R值。在c++中如何比较两个值而不将它们强制转换为特定类型?
解释我的问题的代码如下,
require("Rcpp")
require("inline")
src <- "return wrap(x1 == x2);"
fun <- cxxfunction(signature(x1 = "SEXP", x2 = "SEXP"), src, plugin = "Rcpp")
fun("a", "a")
to_cmp <- "a"
fun(to_cmp, to_cmp)
它现在得到了FALSE
和TRUE
,而我希望它得到TRUE
和TRUE
。
因为我的目标是在c++中实现一个数据结构,所以我更喜欢潜在的用户定义的==
方法。
我尝试过的一种方法是,
要求("Rcpp")
src <- '
Language call("`==`", x1, x2);
return call.eval();
'
fun <- cxxfunction(signature(x1 = "SEXP", x2 = "SEXP"), src, plugin = "Rcpp")
fun("a", "a")
to_cmp <- "a"
fun(to_cmp, to_cmp)
然而,当我运行这个,我得到Error: could not find function "`==`"
使用通用SEXP
输入对象标记是正确的。要做到这一点,除了TYPEOF()
之外,还需要使用c++模板。前者使比较函数中的正确向量创建能够与Rcpp糖挂钩,后者使正确的检查和分派能够发生。
#include <Rcpp.h>
using namespace Rcpp;
template <int RTYPE>
Rcpp::LogicalVector compare_me(Rcpp::Vector<RTYPE> x, Rcpp::Vector<RTYPE> y) {
return x == y;
}
// [[Rcpp::export]]
Rcpp::LogicalVector compare_objects(SEXP x, SEXP y) {
if (TYPEOF(x) == TYPEOF(y)) {
switch (TYPEOF(x)) {
case INTSXP:
return compare_me<INTSXP>(x, y);
case REALSXP:
return compare_me<REALSXP>(x, y);
case STRSXP:
return compare_me<STRSXP>(x, y);
default:
Rcpp::stop("Type not supported");
}
} else {
Rcpp::stop("Objects are of different type");
}
// Never used, but necessary to avoid the compiler complaining
// about a missing return statement
return Rcpp::LogicalVector();
}
的例子:
to_cmp <- "a"
compare_objects(to_cmp, to_cmp)
输出:[1] TRUE
同样,上面的代码用于Rcpp::sourceCpp()
。我鼓励您从使用inline
切换到使用Rcpp::cppFunction()
进行函数定义,因为它允许您专注于计算和而不是设置。
相关文章:
- 无法转换类型 C++
- 包含可变参数包的第一个可转换类型的别名的结构
- 将 std::conditional 与不可转换类型(原始与指针)一起使用
- 链接方法时出现转换类型错误
- 如何避免隐式转换类型
- 在多重继承场景中动态强制转换类型
- 编译器不支持的转换类型
- 错误调用功能无法转换类型
- 我想看到一个在整个后缀表达式的上下文中查找转换类型 id 的示例
- 对于动态类型为强制转换类型的对象,dynamic_cast失败
- 无法在初始化中转换类型
- 如何让"auto"转换类型
- 如何通过强制转换类型指针将字符数组转换为uint16_t
- 如何从新运算符+(Template类)返回具有转换类型的对象
- 带有模板的基于枚举的工厂无法转换类型
- 使用SWIG类型映射通过字符串转换类型
- 对于可转换类型,设计比循环依赖项更好
- SWIG不能正确转换类型定义
- 将类型转换扩展到可转换类型的对/元组
- 想要将字符数组的部分转换/类型转换为值