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, плюс еще несколько.