如何从 R 中的列表中删除函数?

How to remove function from list in R?

我有两个函数的列表:

foo <- function() { print('foo') }
bar <- function() {}
l <- list(foo, bar)

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

我试过了(获取子设置的索引):

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

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

假设问题中的代码,使用identical我们可以这样得到它的索引:

Position(function(fun) identical(fun, foo), l)
## [1] 1

which(sapply(l, identical, foo))
## [1] 1

如果您对函数有所了解,您可以 运行 它们并根据输出 select。对于这个有效的例子:

Position(function(f) length(f()), l)
## [1] 1

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

l2 <- list(foo = foo, bar = bar)
nms <- setdiff(names(l2), "foo")

移除

如果我们知道 fool 中一次,那么

l[-ix]

或者在 l2 的情况下:

l2[nms]

或使用@Gregor 给出的替代方案:

Filter(function(x) !identical(x, foo), l)

边缘情况

如果 foo 可能不在 l 中,您需要先检查该条件。 Positionmatch return NA 如果没有匹配项(或指定 nomatch 参数)和 which return s intetger(0) 表示不匹配。

如果 foo 可以多次出现在 l 中,则使用上面的 which 替代方法。

其他

请注意 whichFilter 检查每个位置,但 matchPosition 在第一次匹配后停止。