Как dplyr выбирает вспомогательную функцию() отличается от копирования?

Что такое прецедент для

select(iris, everything())

в отличие от, например, просто копирование data.frame?

Ответ 1

Ищем ссылки на everything в ?select, у них есть пример использования для переупорядочения столбцов:

# Reorder variables: keep the variable "Species" in the front
select(iris, Species, everything())

В этом случае столбец Species перемещается в первый столбец, все столбцы сохраняются, а столбцы не дублируются.

Возможно и другие варианты использования.

Ответ 2

Другой пример использования:

# Moves the variable Petal.Length to the end
select(iris, -Petal.Length, everything())

(Я видел это здесь: fooobar.com/info/40757/...)

В любом случае, ответ Грегора и мои меня сбивают с толку - я бы ожидал, что виды будут дублированы в примере Грегора или удалены в моем примере.

Если вы попытаетесь сделать что-то более сложное на основе предыдущих двух примеров, это не сработает:

> dplyr::select(iris, Petal.Width, -Petal.Length, everything())
    Petal.Width Sepal.Length Sepal.Width Petal.Length    Species
1           0.2          5.1         3.5          1.4     setosa
2           0.2          4.9         3.0          1.4     setosa
3           0.2          4.7         3.2          1.3     setosa

Изменить: После быстрого ответа от hadley на github я обнаружил, что существует особое поведение, использующее все() в сочетании с отрицательным в первой позиции в select(), который запустит select() со всеми переменными, а затем все() снова вернет их обратно. Отрицательная переменная в непервых позициях не работает, как можно было бы ожидать.

Я согласен с тем, что отрицательная переменная в первой позиции и функция all() select_helper должны быть лучше объяснены в документации

Редактирование 2: теперь документация обновлена, чтобы указать "Позитивные значения, выбирающие переменные, отрицательные значения для отбрасывания переменных. Если первое выражение отрицательное, select() будет автоматически запускаться со всеми переменными".