Использование функции R "which" в Rcpp без возврата значений - PullRequest
1 голос
/ 12 июня 2019

Я написал функцию Rcpp для вызова R, которая проверяет равенство.Он компилируется нормально, но кажется, что он возвращает только значения для первого элемента в векторе: mywhich(samplevector, samplevector[1]) возвращает значение, mywhich(samplevector, samplevector[2]) возвращает numeric(0).

Код функции приведен ниже, этонужно работать только на числовых и целочисленных векторах

#include <Rcpp.h>
using namespace Rcpp;
//[[Rcpp::export]]
SEXP mywhich(SEXP x, SEXP y) {

  //For each supported type, turn it into the 'real' type and
  //perform the operation. We can use TYPEOF to check the type.
  switch(TYPEOF(x)){
  case REALSXP: { 
   Environment base("package:base"); 
   Function f("which");
   NumericVector answer = f(as<NumericVector>(y) == as<NumericVector>(x));
   return wrap(answer);
}
  case INTSXP: { 
    Environment base("package:base"); 
    Function f("which");
    IntegerVector answer = f(as<IntegerVector>(y) == as<IntegerVector>(x));
    return wrap(answer);
  }
  default: {
    stop("Only integer and numeric vectors are supported");
  }
  }}

любая помощь будет оценена

1 Ответ

2 голосов
/ 13 июня 2019

Когда вы вводите <long vector> == <short vector> в R, короткий вектор перерабатывается, чтобы соответствовать длине длинного вектора.Это не происходит в Rcpp!В вашем случае вы хотите сделать <vector> == <single element vector>, что можно сделать в Rcpp с <vector> == <double/int/...>.Это означает, что вы должны выбрать 0-элемент из вектора одного элемента.В вашем коде:

#include <Rcpp.h>
using namespace Rcpp;
//[[Rcpp::export]]
SEXP mywhich(SEXP x, SEXP y) {

  //For each supported type, turn it into the 'real' type and
  //perform the operation. We can use TYPEOF to check the type.
  switch(TYPEOF(x)){
  case REALSXP: { 
   Environment base("package:base"); 
   Function f("which");
   NumericVector answer = f(as<NumericVector>(y)(0) == as<NumericVector>(x));
   //                                           ^^^
   return wrap(answer);
}
  case INTSXP: { 
    Environment base("package:base"); 
    Function f("which");
    IntegerVector answer = f(as<IntegerVector>(y)(0) == as<IntegerVector>(x));
    //                                           ^^^
    return wrap(answer);
  }
  default: {
    stop("Only integer and numeric vectors are supported");
  }
  }}

Кстати, я не уверен, что вам нужно which от R, чтобы найти индексы в LogicalVector, которые true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...