Проблема с автоматическим приведением логического вектора к целому - PullRequest
0 голосов
/ 01 марта 2019

R api позволяют обрабатывать SEXP напрямую через указатель, что упрощает все обработки, которые зависят от приведения неоригинального типа данных.Например, мы можем использовать unsigned int для обработки SEXP с типом reel или integer.Проблема в том, что R дает возможность автоматически приводить от логического к целочисленному SEXP.Внутренний заголовок R определяют логически, поскольку целочисленный тип C вызывает, я думаю, нелогическое состояние.например, если я использую этот код:

// [[Rcpp::export]]
SEXP test(SEXP x){
  int* arr= INTEGER(x);
  arr[0]=77;
  return x;
} 

и я запускаю в R:

x<-NA             ## by default NA is logical vector
is.logical(x)  ## return TRUE
test(x)            ## return TRUE 
is.logical(x)  ## return TRUE
print(x+0L )   ## normaly will return  TRUE but it gives 77
 max(x)          ## gives 77 !

Большинство основных функций рассматривают х как целую сумму, макс, мин ... Те же проблемыприйти с Rcpp ведьмой блока на месте обмена.Например:

// [[Rcpp::export]]
IntegerVector test1(IntegerVector x){
  x[0]=77;
  return x;
} 

с использованием R:

x<-NA 
test1(x)  ## x still NA
x<-as.integer(x)
test1(x) ## edit to 77

Наконец, возможно ли преодолеть это критическое приведение от логического к целому?

1 Ответ

0 голосов
/ 01 марта 2019

Логическое значение в R имеет те же байты на элемент, что и целое число (4 байта).Это отличается от C, где bool имеет 1 байт *, а int имеет 4 байта.Причина, по которой это делает R, заключается, вероятно, в том, что в этом подходе преобразование логического числа в целое происходит мгновенно, а векторное умножение между логическим и целым числом не требует дополнительных затрат.

То, что вы делаете в обоих случаях, - это получить доступ к указателю на начало вектора и установить для первых 4 байтов значение, которое будет соответствовать 77.

На стороне Rпеременная с именем "x" по-прежнему указывает на те же базовые данные.Но поскольку вы изменили базовые данные, значение данных x теперь имеет байты, которые соответствуют целому числу 77.

Целое число 77 не означает ничего логического, поскольку это не может произойти восновная операция.В действительности, то, что делает R, когда вы вводите невозможное значение, в основном неизвестно.

Логическое значение в R может иметь только три значения: TRUE (соответствует значению 1), FALSE (соответствует значению 0) и NA (соответствует значению -2147483648).

* (Технически, реализация определена, но я видел только 1 байт)

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