Магия в том, как R оценивает аргументы функции - PullRequest
0 голосов
/ 08 мая 2018

Рассмотрим следующий код R:

y1 <- dataset %>% dplyr::filter(W == 1) 

Это работает, но здесь, похоже, есть какая-то магия. Обычно, когда у нас есть выражение типа foo(bar), мы можем сделать это:

baz <= bar
foo(baz)

Однако в представленном фрагменте кода мы не можем оценить W == 1 за пределами dplyr::filter()! W не является определенной переменной.

Что происходит?

1 Ответ

0 голосов
/ 08 мая 2018

dplyr использует концепцию, названную Нестандартная оценка (NSE), чтобы сделать столбцы из аргумента фрейма данных доступными для его функций без цитирования или использования синтаксиса dataframe$column. В основном:

[Нестандартная оценка] - это всеобъемлющий термин, означающий, что они не следуют обычным правилам оценки R. Вместо этого они фиксируют введенное вами выражение и оценивают его по-своему. 1

В этом случае пользовательская оценка принимает аргумент (ы), заданный dplyr::filter, и анализирует их, чтобы можно было использовать W для ссылки на dataset$W. Причина, по которой вы не можете затем взять эту переменную и использовать ее в другом месте, заключается в том, что NSE применяется только к области действия функции.


NSE делает компромисс: функции, которые изменяют область видимости, менее безопасны и / или непригодны для программирования, когда вы создаете программу, которая использует функции для изменения других функций:

Это пример общего противоречия между функциями, предназначенными для интерактивного использования, и функциями, с которыми можно безопасно программировать. Функция, которая использует substitute (), могла бы уменьшить набор текста, но может быть трудно вызвать другую функцию. 2

Например, если вы хотите написать функцию, которая будет использовать тот же код, но поменять W == 1 на W == 0 (или какой-то совершенно другой фильтр), NSE сделает это более трудным для выполнения.

В 2017 году Tidyverse начал строить решение этой проблемы в аккуратной оценке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...