R - Как заставить функцию ничего не возвращать (не NULL, просто избежать создания значения) - PullRequest
1 голос
/ 21 апреля 2020

У меня есть предложение tryCatch() внутри lapply() l oop, которое будет либо выводить data.frame, если входное значение является действительным, либо NULL, если это не так. Таким образом, полученный в результате список содержит элементы обоих классов. Вот пример:

a = list(1, 2, "skere", 3)
b = lapply(a, function(x){
  tryCatch({
    out = data.frame("number" = x,
                     "mod2" = x%%2) # This will fail for characters
    return(out)
  },
  error = function(e) {})
})

Результат print(b) будет тогда:

[[1]]
  number mod2
1     1    1

[[2]]
  number mod2
1     2    0

[[3]]
NULL

[[4]]
  number mod2
1     3    1

В моем случае я хочу свернуть список фреймов данных в один фрейм данных, и dplyr::bind_rows() к счастью, NULL не добавляется. Таким образом, сейчас это не является большой проблемой, но это может быть проблемой и в другом случае.

Таким образом, вопрос заключается в следующем: есть ли способ полностью исключить возвращение NULL в первую очередь?

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Вот вариант с discard из purrr

library(purrr)
discard(b, is.null)
#[[1]]
#  number mod2
#1      1    1

#[[2]]
#  number mod2
#1      2    0

#[[3]]
#  number mod2
#1      3    1
1 голос
/ 21 апреля 2020

Как вы уже знаете, dplyr::bind_rows(b) пропустит NULL значения, поэтому вам не нужно ничего делать.

Другой способ - просто удалить те значения NULL, которые можно сделать с помощью Filter.

Filter(length, b)

#[[1]]
#  number mod2
#1      1    1

#[[2]]
#  number mod2
#1      2    0

#[[3]]
#  number mod2
#1      3    1

Или

b[!sapply(b, is.null)]
...