Почему нет NA_logical_

От help("NA"):

Существуют также константы NA_integer_, NA_real_, NA_complex_ и NA_character_ других типов атомных векторов, которые поддерживают отсутствие значения: все это зарезервированные слова в языке R.

Мой вопрос в том, почему нет NA_logical_ или подобного, и что с ним делать.

В частности, я создаю несколько очень похожих похожих data.table s, которые должны быть совместимы с классами для более позднего rbind ing. Если в одной из data.table отсутствует переменная, я создаю этот столбец, но с ней устанавливается все NA конкретного типа. Однако для логического я не могу этого сделать.

В этом случае это, вероятно, не имеет большого значения (data.table не нравится принудительное использование столбцов от одного типа к другому, но также не нравится добавлять строки, поэтому мне нужно создать новую таблицу для хранения rbound-версии), но я озадачен тем, почему NA_logical_, который логически должен существовать, нет.

Пример:

library(data.table)
Y <- data.table( a=NA_character_, b=rep(NA_integer_,5) )
Y[ 3, b:=FALSE ]
Y[ 2, a:="zebra" ]
> Y
       a  b
1:    NA NA
2: zebra NA
3:    NA  0
4:    NA NA
5:    NA NA
> class(Y$b)
[1] "integer"

Два вопроса:

  • Почему NA_logical_ не существует, когда его родственники делают?
  • Что мне делать с этим в контексте data.table или просто чтобы избежать принуждения как можно больше? Я предполагаю, что использование NA_integer_ покупает меня немного с точки зрения принуждения (он будет принуждать логический я добавляю к 0L/1L, что не страшно, но не идеально.

Ответ 1

NA уже логичен, поэтому NA_logical_ не требуется. Просто используйте NA в тех ситуациях, когда вам нужен недостающий логический. Примечание:

> typeof(NA)
[1] "logical"

Поскольку имена NA_*_ - это все зарезервированные слова, вероятно, было желание свести к минимуму их число.

Пример:

library(data.table)
X <- data.table( a=NA_character_, b=rep(NA,5) )
X[ 3, b:=FALSE ]
> X
    a     b
1: NA    NA
2: NA    NA
3: NA FALSE
4: NA    NA
5: NA    NA

Ответ 2

Я думаю, основываясь на этом

 #define NA_LOGICAL R_NaInt

из $R_HOME/R/include/R_ext/Arith.h мы можем предложить использовать NA_integer или NA_real и, следовательно, простой старый NA в R-коде:

R> as.logical(c(0,1,NA))
[1] FALSE  TRUE    NA
R> 
R> as.logical(c(0L, 1L, NA_integer_))
[1] FALSE  TRUE    NA
R> 

который имеет

R> class(as.logical(c(0,1,NA)))
[1] "logical"
R> 
R> class(as.logical(c(0, 1, NA_real_)))
[1] "logical"
R> 

Или я не понимаю ваш вопрос? R логический тип имеет три значения: yay, nay и отсутствует. И мы можем использовать NA из целочисленного или числового в литье. Помогает ли это?