#r #functional-programming #vectorization
#r #функциональное программирование #векторизация
Вопрос:
Предыстория
В этом примере я хотел бы работать rm
только с объектами, которые находятся в предоставленной среде.
Аналогичные результаты могут быть достигнуты с помощью suppressWarnings
, но я хочу использовать векторизацию.
Пример
# Create two objects to delete
a <- 1
c <- 2
# b doesn't exist
Vectorize(
FUN = function(object) {
invisible(rm(object))
},
vectorize.args = "object"
) -> vf_rem
# Run function only on existing objects
vf_rem(object = Filter(f = exists, x = c("a", "b", "c")))
Функция корректно удаляет a
и c
и не выдает предупреждение при обнаружении имени отсутствующего объекта "b"
.
Проблема
vf_rem
По-прежнему выводит объект на консоль:
>> vf_rem(object = Filter(f = exists, x = c("a", "b", "c")))
$a
NULL
$c
NULL
Я хотел бы скрыть это, что я безуспешно пытался сделать с invisible
помощью вызова.
Желаемый результат
Ничего не отображается
>> vf_rem(object = Filter(f = exists, x = c("a", "b", "c")))
>> # Combing back to prompt, nothing is printed
>> # .Last.values contains lst_res from lines below
Для объекта как для любой другой функции
>> vf_rem(object = Filter(f = exists, x = c("a", "b", "c"))) -> lst_res
>> lst_res
# Shows list
>> $a
NULL
$c
NULL
Комментарии:
1. В качестве отступления: побочные эффекты являются проблематичными. Поэтому не прячьте побочные эффекты вашего заявления в конце строки, разместите их на видном месте в начале. Значение: никогда не используйте
->
присваивание (за исключением, если вы настаиваете, интерактивной оболочки), поскольку присваивание является побочным эффектом.2. @KonradRudolph Спасибо, я фанат
->
, но я запомню ваш совет.
Ответ №1:
В вашем конкретном примере вы можете вызвать rm
с помощью вектора:
vf_rem = function (objects) rm(list = objects)
В общем, следующее должно сработать:
vf_fun = function (objects) invisible(Vectorize(fun)(objects))