Почему 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 чем-то другим.