Скрытие выходных данных векторизованной функции

#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))