Nano Hash - криптовалюты, майнинг, программирование

Использование purrr и dplyr: лучший способ - rlang :: sym

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

Чтобы предоставить конкретный пример, скажем, я хочу использовать purrr::map_df() для перебора переменных в dplyr::group_by(). Виньетка с помощью dplyr проходит через написание my_summarise() функция; подход состоит в том, чтобы использовать rlang::enquo() в переменной группировки, а затем убрать кавычки с помощью !!. Этот подход позволяет создать новую функцию, подобную dplyr, которая принимает имена переменных без кавычек (my_summarise(df, g1) в виньетке).

Напротив, я хочу, чтобы мурлыкали имя переменной в виде строки. rlang::sym() правильный ли способ сделать это? Похоже, что это не так, потому что sym() не упоминается в виньетке программирования dplyr и почти не упоминается в rlang аккуратная оценочная статья. Есть ли способ лучше?

library(tidyverse)
my_summarise <- function(df, group_var) {
  group_var <- rlang::sym(group_var)

  df %>%
    group_by(!!group_var) %>%
    summarise(mpg = mean(mpg))
}

# This works. Is that a good thing?
purrr::map_df(c("cyl", "am"), my_summarise, df = mtcars)

# A tibble: 5 x 3
    cyl   mpg    am
  <dbl> <dbl> <dbl>
1  4.00  26.7 NA   
2  6.00  19.7 NA   
3  8.00  15.1 NA   
4 NA     17.1  0   
5 NA     24.4  1.00

В заключение, почему простое отключение цитирования (без предварительного применения enquo или sym) иногда срабатывает? В приведенном ниже примере, почему select() работает должным образом, а group_by() - нет?

x <- "cyl"
select(mtcars, !!x)
group_by(mtcars, !!x)

Обновление: ответ не о нецитировании. Дело в том, что select более гибок и может обрабатывать строки, а group_by - нет.

Другая ссылка: это сообщение в блоге Эдвина Тоена.

06.01.2018

  • Я просто собираюсь сказать, что недавно использование sym () решило все мои, казалось бы, неразрешимые проблемы с цитированием. Иногда !!sym(), особенно когда есть выражение. Также я думаю, что было бы лучше разбить это на два вопроса. 07.01.2018
  • В проекте виньетки действительно используется sym. rpubs.com/lionel-/programming-draft 07.01.2018
  • Спасибо вам обоим, @Elin и @ G-Grothendieck! 14.02.2018

Ответы:


1

Короткий ответ: да.

Если вы хотите map над столбцами, sym - отличный способ сделать это. Лайонел Генри демонстрирует sym в проекте виньетки.

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

library(dplyr)

x <- rlang::quo(cyl)
y <- rlang::sym("cyl")
identical(group_by(mtcars, !!x), group_by(mtcars, !!y))  # TRUE
14.02.2018
  • С rlang ›= 0.4.0 это стало проще. Используйте group_by(.data[[x]]), если x - строка. tidyverse.org/blog/2019/06/rlang-0 -4-0 16.02.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..