Почему нет на логики
Из help("NA")
:
Мой вопрос в том, почему нетСуществуют также константы NA_integer_, NA_real_, NA_complex_ и NA_character_ других атомарных векторных типов, которые поддерживают отсутствующие значения: все это зарезервированные слова в языке R.
NA_logical_
или подобного, и что с этим делать.
В частности, я создаю несколько больших очень похожих data.table
s, которые должны быть совместимы с классом для последующего rbind
ing. Когда один из data.table
s отсутствует переменная, я создаю этот столбец, но с его установкой на все NA
s определенного типа. Однако по логике вещей я не могу этого сделать.
В этом случае, вероятно, это не имеет большого значения (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, что не страшно, но и не идеально.
2 ответа:
NA
уже логично, так что {3]} не нужно. Просто используйте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
Я думаю, основываясь на этом
#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 имеет три значения: да, нет и отсутствует. И мы можем использовать NA из любого целого или числового для приведения. Это поможет?