Как я могу использовать .data в filter_at? - PullRequest
3 голосов
/ 15 мая 2019

Следующий код отфильтрует таблицу изотопных комбинаций, чтобы определить комбинации, в которых изотопически обогащен только один элемент.

df <- tibble::tibble(
  C12 = rep(c(2:0), 2),
  C13 = rep(c(0:2), 2),
  H1 = rep(c(0, 1), each = 3),
  H2 = rep(c(1, 0), each = 3)
)

element_filter <- "H2"

dplyr::filter_at(df, dplyr::vars(element_filter), dplyr::all_vars(. == 0))

Я хотел бы включить этот код в пакет и избежать предупреждения no visible binding for global variable ‘.’. Когда я меняю filter_at звонок на

dplyr::filter_at(df, dplyr::vars(element_filter), dplyr::all_vars(.data == 0))

Я получаю следующую ошибку, Error: (list) object cannot be coerced to type 'double'. Я успешно использую местоимение .data в других функциях, но не могу понять, как заставить его работать здесь. Ценю помощь.

1 Ответ

2 голосов
/ 17 мая 2019

Хотя многие функции часто поддерживают как ., так и .data, в целом они не являются взаимозаменяемыми. В частности, filter_at вызывает внутреннюю функцию apply_filter_syms. Эта функция, в свою очередь, отображает местоимение . на просматриваемый символ, как показано в следующей строке исходный код :

pred <- map(syms, function(sym) expr_substitute(pred, quote(.), sym))

Обратите внимание, что в этой функции нет упоминания .data Поскольку нет специальной обработки .data, она обрабатывается как любая другая переменная. R будет проходить через вызывающий стек до тех пор, пока не найдет определение .data, которое в мире dplyr является местоимением, используемым для обозначения «текущего фрейма данных». Затем предикат фильтра сравнивает весь фрейм данных с 0, а не только с интересующими столбцами. Это приводит к ошибке, которую вы наблюдаете.

Вместо того, чтобы пытаться заставить функцию работать с .data, я предлагаю вместо вместо первоначального предупреждения .

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