Lapply(), когда функция возвращает NULL
Есть ли способ остановить lapply()
от возврата значений NULL для каждого элемента списка, когда функция не имеет return()
.
Вот довольно простой пример:
x <- function(x) {
return(NULL) }
a.list <- list(a=1,b=2,c=3)
lapply(a.list, x)
Вывод:
$a
NULL
$b
NULL
$c
NULL
Моя цель - не иметь этого вывода вообще.
Обновление: мой пример использования выглядит следующим образом. Я использую lapply()
для вывода xtable()
текста, а я sink()
- в файл Rnw. Таким образом, этот вывод NULL подтачивает мою автоматизацию.
Ответы
Ответ 1
Вам приходят в голову два варианта:
Либо
trash_can <- lapply(a.list, x)
или
invisible(lapply(a.list, x))
Первый из них заставляет задуматься, есть ли аналог Linux /dev/null
в R
, который вы можете использовать для перенаправления ненужных материалов. Единственная проблема с созданием переменной trash_can
заключается в том, что она будет зависать и использовать память, если вы не rm(trash_can)
. Но я не думаю, что проблема здесь.
Ответ 2
Вы сделали
R> x <- function(x) { return(NULL) }
R> a.list <- list(a=1,b=2,c=3)
R> res <- lapply(a.list, x)
R> res
$a
NULL
$b
NULL
$c
NULL
R>
и как вы просили lapply
пронести по всем элементам списка, вы вряд ли можете жаловаться на получение результатов (в res
) для всех элементов a.list
. Это правильно.
Но то, что приятно в отношении значений NULL
, тем не менее, состоит в том, что их тривиально пропускать на следующем этапе агрегации:
R> do.call(rbind, res)
NULL
R>
Таким образом, я использовал этот подход для возвращения NULL
, когда у данных возникла проблема или возникла другая нерегулярность, поскольку вы можете легко агрегировать "хорошие" результаты впоследствии.
Ответ 3
Вы могли бы просто сделать
a.list <- a.list[!sapply(a.list, is.null)]
Ответ 4
Думаю, вам стоит взглянуть на l_ply
из пакета plyr
. Он должен ничего не возвращать, и он обладает всеми свойствами lapply
, плюс еще несколько.