В течение последнего года или около того развитие экосистемы 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 или мой скоро выйдет учебник по аналитике людей.