Как я могу использовать .data в filter_at?

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

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 вызов 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 ответ


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

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

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

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


Есть идеи?

10000