在if()语句中使用any()时的Rcpp forbiden转换

问题描述 投票:0回答:1

我试图使用Rcpp将我的R函数转换为C ++,但我遇到了我不太了解的错误。

下面的代码给出了我的R函数,我的(差)尝试翻译它和最后的一些使用示例(测试两个函数返回相同的东西......)

我的R代码功能:

intersect_rectangles <- function(x_min, x_max, y_min, y_max) {
  rez <- list()
  rez$min <- pmax(x_min, y_min)
  rez$max <- pmin(x_max, y_max)

  if (any(rez$min > rez$max)) {
    return(list(NULL))
  }
  return(rez)
}

我试图用Rcpp创建相同的功能。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List Cpp_intersect_rectangles(NumericVector x_min,NumericVector  
x_max,NumericVector  y_min,NumericVector  y_max) {

  // Create a list :
  NumericVector min = pmax(x_min,y_min);
  NumericVector max = pmin(x_max,y_max);
  List L = List::create(R_NilValue);

  if (! any(min > max)) {
    L = List::create(Named("min") = min , _["max"] = max);
  }
  return(L);
}

我收到以下错误消息:

/Library/Frameworks/R.framework/Versions/3.5/Resources/library/Rcpp/include/Rcpp/sugar/logical/SingleLogicalResult.h:36:2: error: implicit instantiation of undefined template 'Rcpp::sugar::forbidden_conversion<false>'
        forbidden_conversion<x>{
        ^
/Library/Frameworks/R.framework/Versions/3.5/Resources/library/Rcpp/include/Rcpp/sugar/logical/SingleLogicalResult.h:74:40: note: in instantiation of template class 'Rcpp::sugar::conversion_to_bool_is_forbidden<false>' requested here
                conversion_to_bool_is_forbidden<!NA> x ;
                                                     ^
file637e53281965.cpp:13:9: note: in instantiation of member function 'Rcpp::sugar::SingleLogicalResult<true, Rcpp::sugar::Negate_SingleLogicalResult<true, Rcpp::sugar::Any<true, Rcpp::sugar::Comparator<14, Rcpp::sugar::greater<14>, true, Rcpp::Vector<14, PreserveStorage>, true, Rcpp::Vector<14, PreserveStorage> > > > >::operator bool' requested here
    if (! any(min > max))

如果Rcpp函数正确实现,则以下内容应该有效:

u = rep(0,4)
v = rep(1,4)
w = rep(0.3,4)
x = c(0.8,0.8,3,3)
all.equal(intersect_rectangles(u,v,w,x), Cpp_intersect_rectangles(u,v,w,x))
all.equal(intersect_rectangles(u,v,w,w), Cpp_intersect_rectangles(u,v,w,w))

你能告诉我我的cpp代码有什么问题吗?

r rcpp
1个回答
4
投票

代码未正确转换的原因是由于any() Rcpp糖实现的创建方式。特别是,我们有:

any(X)的实际返回类型是SingleLogicalResult模板类的实例,但函数is_trueis_false可用于将返回值转换为bool

对于https://thecoatlessprofessor.com/programming/unofficial-rcpp-api-documentation/#any

因此,解决方案是将.is_true()添加到any()函数调用,例如, !any(condition).is_true()

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List Cpp_intersect_rectangles(NumericVector x_min, NumericVector x_max,
                              NumericVector y_min, NumericVector y_max) {

    // Create a list :
    NumericVector min = pmax(x_min, y_min);
    NumericVector max = pmin(x_max, y_max);
    List L = List::create(R_NilValue);


    if (! any(min > max).is_true()) {
                      // ^^^^^^^^^ Added
        L = List::create(Named("min") = min , _["max"] = max);
    }
    return(L);
}

然后,通过测试我们得到:

u = rep(0,4)
v = rep(1,4)
w = rep(0.3,4)
x = c(0.8,0.8,3,3)
all.equal(intersect_rectangles(u,v,w,x), Cpp_intersect_rectangles(u,v,w,x))
# [1] TRUE
all.equal(intersect_rectangles(u,v,w,w), Cpp_intersect_rectangles(u,v,w,w))
# [1] TRUE
© www.soinside.com 2019 - 2024. All rights reserved.