Подтвердить что ты не робот

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 подтачивает мою автоматизацию.

4b9b3361

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