lapply () когда функция возвращает NULL - PullRequest
27 голосов
/ 29 января 2012

Есть ли способ остановить 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 выводит из строя мою автоматизацию.

Ответы [ 4 ]

28 голосов
/ 30 января 2012

на ум приходят два варианта:

Или

trash_can <- lapply(a.list, x)

или

invisible(lapply(a.list, x))

Первый заставляет меня задуматься, есть ли аналог Linux /dev/null в R, который вы можете использовать для перенаправления ненужных вещей. Единственная проблема с созданием переменной trash_can заключается в том, что она будет зависать и использовать память, если вы не rm(trash_can). Но я не думаю, что это проблема здесь.

6 голосов
/ 29 января 2012

Вы сделали

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, когда у данных возникла проблема или возникла другая неправильность, поскольку впоследствии вы можете легко объединить «хорошие» результаты.

5 голосов
/ 29 января 2012

Вы могли бы просто сделать

a.list <- a.list[!sapply(a.list, is.null)]
2 голосов
/ 30 января 2012

Думаю, вы захотите взглянуть на l_ply из пакета plyr. Предполагается, что он ничего не возвращает, и у него есть все свойства lapply, а также некоторые другие.

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