error: «Результат» не называет тип при выполнении «R CMD INSTALL» [дублировать]

True является 1 в Python, а также False является 0 *:

>>> True == 1
True
>>> False == 0
True

Вы должны иметь возможность выполнять любые операции, которые вы хотите на них, просто обрабатывая их как если бы они были числами, поскольку они являются номерами:

>>> issubclass(bool, int)
True
>>> True * 5
5

Итак, чтобы ответить на ваш вопрос, никакой работы не требуется - у вас уже есть то, что вы ищете.

* Примечание. Я использую как как английское слово, а не ключевое слово Python is - True не будет тем же объектом, что и любой случайный 1.

1
задан Dirk Eddelbuettel 30 June 2018 в 01:47
поделиться

1 ответ

Правильная структура в R зависит от того, как выглядит ваш struct. Именованный список является самым общим. Здесь простая реализация примера для функции wrap, упомянутой в комментариях:

#include <RcppCommon.h>

typedef struct {
  char*   firstname[128];
  char*   lastname[128];
  int      nbrOfSamples;
} HEADER_INFO;

namespace Rcpp {
  template <>
  SEXP wrap(const HEADER_INFO& x);
}

#include <Rcpp.h>

namespace Rcpp {
  template <>
  SEXP wrap(const HEADER_INFO& x) {
    Rcpp::CharacterVector firstname(x.firstname, x.firstname + x.nbrOfSamples);
    Rcpp::CharacterVector lastname(x.lastname, x.lastname + x.nbrOfSamples);
    return Rcpp::wrap(Rcpp::List::create(Rcpp::Named("firstname") = firstname,
                      Rcpp::Named("lastname") = lastname,
                      Rcpp::Named("nbrOfSamples") = Rcpp::wrap(x.nbrOfSamples)));
  };
}

//  [[Rcpp::export]]
HEADER_INFO getHeaderInfo() {
  HEADER_INFO header;
  header.firstname[0] = (char*)"Albert";
  header.lastname[0] = (char*)"Einstein";
  header.firstname[1] = (char*)"Niels";
  header.lastname[1] = (char*)"Bohr";
  header.firstname[2] = (char*)"Werner";
  header.lastname[2] = (char*)"Heisenberg";
  header.nbrOfSamples = 3;
  return header;
}

/*** R
getHeaderInfo()
 */

Выход:

> getHeaderInfo()
$firstname
[1] "Albert" "Niels"   "Werner"

$lastname
[1] "Einstein"   "Bohr"       "Heisenberg"

$nbrOfSamples
[1] 3

Однако для этого частного случая a data.frame было бы более естественно использовать, что может быть достигнуто путем замены выше wrap на:

  template <>
  SEXP wrap(const HEADER_INFO& x) {
    Rcpp::CharacterVector firstname(x.firstname, x.firstname + x.nbrOfSamples);
    Rcpp::CharacterVector lastname(x.lastname, x.lastname + x.nbrOfSamples);
    return Rcpp::wrap(Rcpp::DataFrame::create(Rcpp::Named("firstname") = firstname,
                                              Rcpp::Named("lastname") = lastname));
  };

Выход:

> getHeaderInfo()
  firstname   lastname
1    Albert   Einstein
2     Niels       Bohr
3    Werner Heisenberg
2
ответ дан Ralf Stubner 15 August 2018 в 16:55
поделиться
  • 1
    Опять же, очень хороший ответ Ральфа, который полезен и для других! – SN248 3 July 2018 в 14:18
Другие вопросы по тегам:

Похожие вопросы: