Использование Filter (Negate (is.na), x) в списке приводит к неожиданному поведению - PullRequest
0 голосов
/ 13 ноября 2018

Рассмотрим

l1 <- list("a", NA, 1:3, NA)
l2 <- list("a", NULL, 1:3, NULL) 

Почему Filter(Negate(is.na), l1) не работает, а Filter(Negate(is.null), l2) работает должным образом (возвращает все элементы l2, которые не NULL)?

Файл справки для ?Filter говорит

... Обратите внимание, что возможные значения NA в настоящее время всегда принимаются как ложные; контроль над обработкой NA может быть добавлен в будущем.

Я до сих пор не совсем понимаю поведение.

1 Ответ

0 голосов
/ 13 ноября 2018

is.na возвращает вектор для каждого элемента списка;Вы хотите anyNA (или, возможно, exactlyNA, как определено ниже):

l1 <- list("a", NA, 1:3, NA)
l2 <- list("a", NULL, 1:3, NULL) 
Filter(Negate(is.na), l1)
#> [[1]]
#> [1] "a"
#> 
#> [[2]]
#> [1] 1 2 3
#> 
#> [[3]]
#> [1] NA
#> 
#> [[4]]
#> NULL
Filter(Negate(anyNA), l1)
#> [[1]]
#> [1] "a"
#> 
#> [[2]]
#> [1] 1 2 3
exactlyNA <- function(x) identical(x, NA)
Filter(Negate(exactlyNA), l1)
#> [[1]]
#> [1] "a"
#> 
#> [[2]]
#> [1] 1 2 3

Создано в 2018-11-13 пакетом Представления (v0.2.1)

Ваш первый пример эффективно пытается выбрать 1-й, 3-й, 4-й и 5-й элементы вашего списка.Ничего общего с NA.

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