Почему is.na() меняет свой аргумент?
Я только что обнаружил следующее поведение функции is.na()
, которое я не понимаю:
df <- data.frame(a = 5:1, b = "text")
df
## a b
## 1 5 text
## 2 4 text
## 3 3 text
## 4 2 text
## 5 1 text
is.na(df)
## a b
## [1,] FALSE FALSE
## [2,] FALSE FALSE
## [3,] FALSE FALSE
## [4,] FALSE FALSE
## [5,] FALSE FALSE
is.na(df) <- "0"
df
## a b 0
## 1 5 text NA
## 2 4 text NA
## 3 3 text NA
## 4 2 text NA
## 5 1 text NA
Мой вопрос
Почему is.na()
изменяет свой аргумент (и в этом случае добавляет дополнительный столбец в кадр данных)? В этом случае его поведение кажется дополнительным загадочным (или, по крайней мере, неожиданным), потому что результат запроса FALSE
для всех экземпляров.
NB
Этот вопрос заключается не в подмножестве и изменении значений NA
в кадре данных - я знаю, как это сделать (df[is.na(df)] <- "0"
). Этот вопрос касается поведения функции is.na
! Почему назначение функции is.something
меняет сам аргумент - это неожиданно.
Ответы
Ответ 1
Фактическая функция, используемая здесь, не is.na()
, а функция назначения `is.na<-`
, для которой метод по умолчанию `is.na<-.default`
. Печать этой функции на консоли мы видим:
function (x, value)
{
x[value] <- NA
x
}
Таким образом, value
должен быть здесь индексом. Если вы индексируете data.frame
как df["0"]
, он попытается выбрать столбец с именем "0"
. Если вы присвойте что-то df["0"]
, столбец будет создан и заполнен (в данном случае) NA
.
Чтобы уточнить, `is.na<-`
устанавливает значения в NA
, он не заменяет значения NA
чем-то другим.