Как напечатать необработанные значения в Rcpp - PullRequest
0 голосов
/ 04 июля 2018
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void print_raw(RawVector x) {

  for (int i = 0; i < x.size(); i++) {
    Rcout << x[i] << " ";
  }
  Rcout << std::endl;
}

/*** R
x <- as.raw(0:10)
print(x)
print_raw(x)
*/

Я бы хотел, чтобы Rcpp печатал значения типа «raw» так же, как и R. Является ли это возможным? С текущим кодом я получаю только пустую строку.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Что ж, самое простое решение print-like-R - это вызвать (C ++) функцию print(), поскольку она отправляется внутри функции R:

Код:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void print_raw(RawVector x) {
  print(x);
}

/*** R
x <- as.raw(0:10)
print(x)
print_raw(x)
*/

Выход:

R> sourceCpp("/tmp/so51169994.cpp")

R> x <- as.raw(0:10)

R> print(x)
 [1] 00 01 02 03 04 05 06 07 08 09 0a

R> print_raw(x)
 [1] 00 01 02 03 04 05 06 07 08 09 0a
R> 
0 голосов
/ 04 июля 2018

Сначала необходимо привести отдельные значения к int 1 . Кроме того, для получения шестнадцатеричного, дополненного нулями вывода вам необходимо использовать функции <iomanip>.

При использовании цикла range- for преобразование может происходить неявно при инициализации переменной цикла:

// [[Rcpp::export]]
void print_raw(RawVector x) {
  for (int v : x) {
    Rcout << std::hex << std::setw(2) << std::setfill('0') << v << ' ';
  }
  Rcout << '\n';
}

1 из Rbyte, , что является typedef для unsigned char.

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