В течение последнего года или около того развитие экосистемы R продвигалось быстрыми темпами. Новые функции в базовом языке R, в ключевых пакетах R и в среде RStudio IDE упростили повседневную работу программистов на R, таких как я. Большинство этих разработок также сделали программирование на R более приятным и приятным и во многих случаях устранили предыдущие головные боли или представили функциональность, которая лучше согласуется с другими языками программирования.

Если вы не следите за обновлениями, вот десять событий, которые взволновали меня за последний год или около того - без определенного порядка. Надеюсь, это побудит вас поэкспериментировать или снова заняться языком, если это было давно.

1. Родная труба

Я начинаю с самой последней новой разработки. Любой, кто имел более чем беглое знакомство с R, знает об операторе канала %>%, который является уникальным для R и был введен для того, чтобы сделать код более логичным и читаемым. Канал стал настолько естественным для большинства пользователей R, что многие пытались использовать его немедленно, не осознавая, что он не является частью базового R. Много-много раз я пытался использовать его перед установкой dplyr или magrittr, и в результате возникали ошибки. становится разочаровывающим и раздражающим.

Некоторое время назад было признано, что канал должен быть доступен в базе R, и, начиная с версии R 4.1.0, этот оператор доступен и обозначается как |>. Собственный канал примет предшествующее ему выражение и поместит его в функцию, которая следует за ним, в качестве первого аргумента. Например:

mtcars |>
  subset(subset = cyl == 4)

будет подмножество mtcars до только наблюдений с cyl == 4. Обратите внимание, что, в отличие от with%>%, вы не можете использовать . для прямой передачи других аргументов функции, например:

row.names(mtcars) |> 
  grepl("Mazda", .)

не будет работать. Для этого нам нужно использовать вызов функции (см. Номер 2).

Предполагается, что в долгосрочной перспективе природная труба заменит «старую» трубу. Однако для этого потребуются некоторые доработки ключевых пакетов, использующих старый канал, поэтому вам нужно быть готовым какое-то время использовать оба. Если вы действительно хотите немедленно начать использовать собственный канал, вы можете заменить предыдущее сочетание клавиш Cmd / Ctrl-Shift-M, чтобы закодировать новый канал, щелкнув поле в разделе Глобальные параметры ›Код в RStudio:

2. Новый синтаксис анонимной функции (Lambda-like) в R

Другая параллельная разработка в R 4.1.0 - это новый синтаксис для написания анонимных функций, которые предназначены для одноразового использования, аналогично Lambdas в Python. В общем, R ранее был настроен так, чтобы все функции были названы в памяти. Например:

check_mazda <- function(x) {
  grepl("Mazda", x)
}

а затем мы будем подключаться к этой функции следующим образом:

mtcars |>
  row.names() |> 
  check_mazda()

Хотя способы обойти это всегда были, в самой последней версии анонимные функции формализованы следующим образом:

mtcars |>
  row.names() |>
  {\(x) grepl("Mazda", x)}()

Это прекрасно настраивает отображение анонимных функций в структурах данных. Например:

mtcars |>
  lapply(\(x) mean(x) > 20)

проверит по всем столбцам mtcars, имеет ли столбец среднее значение больше 20.

3. Задания RStudio

Задания позволяют более эффективно выполнять несколько задач в RStudio. Раньше, если вы хотели запускать длинный код R и работать над кодом одновременно, вам приходилось запускать два разных экземпляра RStudio, что немного раздражало. Теперь вы можете запустить свой код как задание, и он будет работать в отдельном сеансе R в RStudio, что позволит вам отслеживать его, работая над чем-то другим.

Если вы работаете в RStudio 1.2+, вы можете запустить сценарий как задание, используя раскрывающееся меню «Источник».

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

4. Визуальный редактор R Markdown

R Markdown - потрясающий и мой любимый способ публикации документов с данными. А теперь, начиная с RStudio 1.4, есть визуальный редактор для R Markdown, который отлично подходит для тех, кто не совсем разбирается в синтаксисе R Markdown.

Чтобы отредактировать ваш Rmd документ с помощью визуального редактора, найдите

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

5. Просматривайте объекты Python и взаимодействуйте с ними в RStudio.

Начиная с RStudio 1.4, когда вы работаете как в R, так и в Python, вы можете легко переключаться между двумя средами и видеть объекты в каждой. Предполагая, что у вас установлен и загружен пакет reticulate, вы можете просматривать среды Python и R, щелкая между ними на панели «Среда»:

Если вам интересно узнать больше о совместной работе с R и Python в R Studio, посмотрите другую мою статью об этом здесь.

6. Круглые скобки радуги.

Этот более косметический, но раскрашивание вложенных скобок может помочь вам гораздо легче устранить неполадки в коде, особенно если у вас много вложенных простых, квадратных или фигурных скобок. Эту функцию теперь можно включить в разделе Глобальные параметры ›Код› Дисплей:

7. Список столбцов в фреймах данных

Хотя это и не новость, столбцы списков стали более привлекательными после прошлогоднего крупного обновления пакетов tidyverse dplyr и tidyr. Теперь столбцы фреймов данных могут быть списками, а не только векторами, что позволяет нам гибко помещать в фреймы данных все, что угодно, включая модели, графики, другие фреймы данных, что угодно. Это создает огромную гибкость и открывает больше возможностей для таких пакетов, как dplyr. Например, теперь вы можете вкладывать фреймы данных подмножества в фреймы данных:

library(dplyr)
library(ggplot2)
mtcars |> 
  nest_by(cyl)
# A tibble: 3 x 2
# Rowwise:  cyl
    cyl                data
  <dbl> <list<tibble[,10]>>
1     4           [11 × 10]
2     6            [7 × 10]
3     8           [14 × 10]

А затем вы можете дополнительно изменить столбец, содержащий графики каждого подмножества:

plotframe <- mtcars |> 
  nest_by(cyl) |> 
  mutate(plot = list(ggplot(data = data, aes(x = wt, y = mpg)) +
           geom_point() +
           geom_smooth()))
# A tibble: 3 x 3
# Rowwise:  cyl
    cyl                data plot  
  <dbl> <list<tibble[,10]>> <list>
1     4           [11 × 10] <gg>  
2     6            [7 × 10] <gg>  
3     8           [14 × 10] <gg>

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

plotframe$plot[1]

Это может быть расширено для использования фреймов данных для поддержки больших пакетных задач - см. Пример этого при создании пакетов параметризованных документов PowerPoint в моей статье здесь.

8. Конвейерная обработка процессов обработки данных.

Недавно разработанный пакет targets предоставляет инструментарий для автоматизации и производства ваших процессов обработки данных в R. Это особенно нацелено на преодоление ситуаций, когда эти процессы построены на взаимозависимых сценариях R, которые выполняются по отдельности в последовательности. Эта модель не идеальна, и targets поощряет программистов настраивать свой процесс в конвейере абстрактных функций R вместо использования скриптов. Пакет целей будет разумно выполнять конвейер таких функций и сохранять промежуточные и конечные результаты для проверки.

Когда параметры изменяются, targets знает, на какие части вашего конвейера это влияет, и выполняет только затронутые части конвейера, используя ранее сгенерированные выходные данные для частей, которые не затронуты. Это может значительно сэкономить время и очень помогает в исправлении ошибок. targets также содержит полезные функции, такие как tar_glimpse(), которые могут мгновенно создать визуализацию вашего конвейера. Подробнее на targets здесь.

9. Расширенные возможности абстракции в dplyr

dplyr - это пакет, имеющий огромное значение в экосистеме R, и с момента выпуска версии 1.0.0 в прошлом году его мощность существенно выросла. В частности, многие часто используемые функции были абстрагированы для одновременной работы с несколькими столбцами, что позволило сэкономить много усилий на кодировании. В сочетании с tidyselect, который позволяет программно выбирать столбцы, код теперь можно значительно сократить, используя такие функции, как across внутри summarise. Например, где раньше мы могли написать:

mtcars |>
  group_by(cyl) |>
  summarise(mean_disp = mean(disp),
            sd_disp = sd(disp),
            mean_drat = mean(drat),
            sd_drat = sd(drat))

Теперь мы можем просто написать:

mtcars |>
  group_by(cyl) |>
  summarise(across(starts_with("d"), list(mean = mean, sd = sd)))

Я подробно описал некоторые из этих удивительных новых абстрактных функций здесь.

10. Создайте больше возможностей для программирования в RStudio, используя исходные столбцы.

Если вы хотите, чтобы несколько исходных файлов были открыты и просматривались одновременно, и вам нужно больше места для этого, не жертвуя некоторыми другими панелями, теперь вы можете сделать это в RStudio 1.4, просто добавив исходные столбцы. Вы можете сделать это через Глобальные параметры ›Макет панели, а затем выбрать новую опцию« Добавить столбец ». Это создаст новую панель «Источник» слева от существующих панелей. Вы даже можете добавить больше, если хотите.

Это только недавние разработки в R, которые я очень хорошо использовал. Если у вас есть другие, не стесняйтесь добавлять их в комментарии, чтобы другие читатели могли получить пользу.

Изначально я был чистым математиком, затем стал психометриком и специалистом по анализу данных. Я увлечен применением всех этих дисциплин к сложным вопросам людей. Я также помешан на программировании и большой поклонник японских ролевых игр. Найдите меня в LinkedIn или Twitter. Также посетите мой блог на drkeithmcnulty.com или мой скоро выйдет учебник по аналитике людей.