如何从R中的列表中删除功能?

jcu*_*bic 5 r list nonatomic

我有两个功能的清单:

foo <- function() { print('foo') }
bar <- function() {}
l <- list(foo, bar)
Run Code Online (Sandbox Code Playgroud)

如何在不知道其索引的情况下删除函数foo?

我已经尝试过此操作(以获取子设置的索引):

> which(l == foo)
Error in l == foo : 
  comparison (1) is possible only for atomic and list types
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法可以从列表中删除非原子而不循环?

G. *_*eck 9

假设问题中的代码,使用identical我们可以获得如下所示的索引:

Position(function(fun) identical(fun, foo), l)
## [1] 1
Run Code Online (Sandbox Code Playgroud)

要么

which(sapply(l, identical, foo))
## [1] 1
Run Code Online (Sandbox Code Playgroud)

如果您对这些功能有所了解,则可以运行它们并根据输出进行选择。对于此示例,此方法有效:

Position(function(f) length(f()), l)
## [1] 1
Run Code Online (Sandbox Code Playgroud)

如果您可以控制列表的创建,则一种简单的方法是使用名称创建列表:

l2 <- list(foo = foo, bar = bar)
nms <- setdiff(names(l2), "foo")
Run Code Online (Sandbox Code Playgroud)

清除

如果我们知道那fool一次

l[-ix]
Run Code Online (Sandbox Code Playgroud)

或在以下情况下l2

l2[nms]
Run Code Online (Sandbox Code Playgroud)

或使用@Gregor提供的替代方法:

Filter(function(x) !identical(x, foo), l)
Run Code Online (Sandbox Code Playgroud)

边缘情况

如果foo可能不在,l则需要首先检查该状况。如果没有匹配项Position,则match返回NA(或指定其中一个nomatch参数),然后which返回intetger(0)不匹配项。

如果foo可以l不止一次,则使用which上面的替代方法。

其他

需要注意的是whichFilter检查,但每个位置matchPosition第一场比赛后停止。