5

我有两个功能的列表:

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

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

4

1 回答 1

9

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

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

或者

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

如果您对函数有所了解,则可以运行它们并根据输出进行选择。例如,这有效:

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您将需要先检查该条件。如果不匹配则返回(或指定任一Position参数match),如果不匹配则返回。 NAnomatchwhichintetger(0)

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

其他

请注意whichFilter检查每个位置,但在第一场比赛matchPosition停止。

于 2019-09-13T14:14:35.197 回答