Как удалить функцию из списка в 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

Есть ли простой способ удалить неатомарный из списка без цикла?

1 ответ

Решение

Предполагая код в вопросе, используйте 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 вам нужно сначала проверить это условие. Position а также match возвращение NA если совпадений нет (или укажите nomatch аргумент либо) и which возвращается intetger(0) на матч.

Если foo может быть в l более одного раза, затем используйте which альтернатива выше.

Другой

Обратите внимание, что which а также Filter проверьте каждую позицию, но match а также Position остановитесь после первого матча.

Другие вопросы по тегам