当函数返回NULL时lapply()

Bra*_*sen 28 r

lapply()当函数没有时,是否有一种方法可以阻止为列表的每个元素返回NULL值return().

这是一个非常基本的例子:

x <- function(x) {
return(NULL) }

a.list <- list(a=1,b=2,c=3)

lapply(a.list, x)
Run Code Online (Sandbox Code Playgroud)

输出是:

$a
NULL

$b
NULL

$c
NULL
Run Code Online (Sandbox Code Playgroud)

我的目标是根本没有那个输出.

更新:我的使用案例如下.我正在使用lapply()抽出xtable()文本而我正在sink()使用Rnw文件.所以这个NULL输出正在扰乱我的自动化.

Xu *_*ang 29

我想到两个选择:

trash_can <- lapply(a.list, x)
Run Code Online (Sandbox Code Playgroud)

要么

invisible(lapply(a.list, x))
Run Code Online (Sandbox Code Playgroud)

第一个让我不知道是否有linux的的模拟/dev/nullR,你可以用它来重定向你不想要的东西.创建变量的唯一问题trash_can是它会挂起并耗尽内存,除非你rm(trash_can).但我不认为这是一个问题.

  • 罗马建议的`invisible()`正是我所寻找的. (3认同)

Dir*_*tel 6

你做到了

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>
Run Code Online (Sandbox Code Playgroud)

正如你要求lapply扫描列表中的所有元素一样,你很难抱怨你得到res的所有元素的结果(in )a.list.那是正确的.

但是,对于这些NULL值的好处是,在下一个聚合步骤中跳过它们是微不足道的:

R> do.call(rbind, res)
NULL
R> 
Run Code Online (Sandbox Code Playgroud)

因此,NULL当数据出现问题或出现其他不规则时,我主要使用这种方法返回,因为您可以轻松地聚​​合后来的"好"结果.


Hon*_*Ooi 5

你可以做到

a.list <- a.list[!sapply(a.list, is.null)]
Run Code Online (Sandbox Code Playgroud)

  • 编程也很危险. (2认同)
  • 编程是危险的,因为你不知道它会给你什么输出 - 当输入为零长度时,这通常是有问题的.`vapply`统一更好. (2认同)