Как удалить функцию из списка в 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
остановитесь после первого матча.