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

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

有没有简便的方法在不使用循环的情况下从列表中移除非原子元素?

我认为你应该使用 identical 来实现这个目的:identical(l[[1]], foo) - cyrilb38
1
在函数体中搜索 foo 的想法:Filter(function(x) !any(grepl("foo", body(x))),l) - NelsonGon
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")

删除

如果我们知道foo只在l中出现了一次,那么

l[-ix]

或者在l2的情况下:

l2[nms]

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

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

边缘案例

如果foo可能不在l中,您需要首先检查该条件。如果没有匹配(或指定了nomatch参数),则Positionmatch返回NA,而which返回无匹配的integer(0)

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

其他

请注意,whichFilter会检查每个位置,但matchPosition在找到第一个匹配后就停止了。


1
一次性操作:Filter(function(x) !identical(x, foo), l) - Gregor Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接