如何从 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")
移除
如果我们知道 foo
在 l
中一次,那么
l[-ix]
或者在 l2
的情况下:
l2[nms]
或使用@Gregor 给出的替代方案:
Filter(function(x) !identical(x, foo), l)
边缘情况
如果 foo
可能不在 l
中,您需要先检查该条件。 Position
和 match
return NA
如果没有匹配项(或指定 nomatch
参数)和 which
return s intetger(0)
表示不匹配。
如果 foo
可以多次出现在 l
中,则使用上面的 which
替代方法。
其他
请注意 which
和 Filter
检查每个位置,但 match
和 Position
在第一次匹配后停止。
我有两个函数的列表:
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")
移除
如果我们知道 foo
在 l
中一次,那么
l[-ix]
或者在 l2
的情况下:
l2[nms]
或使用@Gregor 给出的替代方案:
Filter(function(x) !identical(x, foo), l)
边缘情况
如果 foo
可能不在 l
中,您需要先检查该条件。 Position
和 match
return NA
如果没有匹配项(或指定 nomatch
参数)和 which
return s intetger(0)
表示不匹配。
如果 foo
可以多次出现在 l
中,则使用上面的 which
替代方法。
其他
请注意 which
和 Filter
检查每个位置,但 match
和 Position
在第一次匹配后停止。