Язык R

и его применение в биоинформатике

Лекция 5

Анна Валяева

29 сентября 2023

Пример - данные про пингвинов

Данные из пакета palmerpenguins.

penguins
# A tibble: 344 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <chr>   <chr>              <dbl>         <dbl>             <dbl>       <dbl>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 2 more variables: sex <chr>, year <dbl>

Столбчатая диаграмма

Столбчатая диаграмма - geom_bar

Сколько было пингвинов каждого вида?

ggplot(penguins, aes(x = species)) +
  geom_bar()

Цвета по столбцам

ggplot(penguins, 
  aes(
    x = species, 
    fill = species)) +
  geom_bar()

Убрать легенду

ggplot(penguins, 
  aes(
    x = species, 
    fill = species)) +
  geom_bar() +
  theme(legend.position = "none")

Визуализировать значения из таблицы

Если у нас есть таблица, в которой уже посчитаны пингвины разных видов:

penguin_species <- penguins %>% 
  count(species)

penguin_species
# A tibble: 3 × 2
  species       n
  <chr>     <int>
1 Adelie      152
2 Chinstrap    68
3 Gentoo      124
ggplot(penguin_species, 
  aes(
    x = species, 
    y = n,
    fill = species)) +
  geom_bar(stat = "identity") +
  theme(legend.position = "none")

Визуализировать значения из таблицы

Можно использовать geom_bar(stat = "identity") или geom_col():

ggplot(penguin_species, 
  aes(
    x = species, 
    y = n,
    fill = species)) +
  geom_col() +
  theme(legend.position = "none")

Что такое count()?

Это краткая замена сочетанию функций group_by() и summarise().

penguins %>% 
  count(species)
# A tibble: 3 × 2
  species       n
  <chr>     <int>
1 Adelie      152
2 Chinstrap    68
3 Gentoo      124
penguins %>% 
  group_by(species) %>% 
  summarise(n = n())
# A tibble: 3 × 2
  species       n
  <chr>     <int>
1 Adelie      152
2 Chinstrap    68
3 Gentoo      124

summarise()

penguins %>% 
  summarise(
    n = n(),
    avg_flipper = mean(flipper_length_mm)
  )
# A tibble: 1 × 2
      n avg_flipper
  <int>       <dbl>
1   344          NA

group_by() + summarise()

penguins %>% 
  group_by(species) %>% 
  summarise(
    n = n(),
    avg_flipper = mean(flipper_length_mm)
  )
# A tibble: 3 × 3
  species       n avg_flipper
  <chr>     <int>       <dbl>
1 Adelie      152         NA 
2 Chinstrap    68        196.
3 Gentoo      124         NA 

group_by() + mutate()

penguins %>% 
  group_by(species) %>% 
  mutate(
    n = n(),
    avg_flipper = mean(flipper_length_mm),
    .before = 1)
# A tibble: 344 × 10
# Groups:   species [3]
       n avg_flipper species island    bill_length_mm bill_depth_mm
   <int>       <dbl> <chr>   <chr>              <dbl>         <dbl>
 1   152          NA Adelie  Torgersen           39.1          18.7
 2   152          NA Adelie  Torgersen           39.5          17.4
 3   152          NA Adelie  Torgersen           40.3          18  
 4   152          NA Adelie  Torgersen           NA            NA  
 5   152          NA Adelie  Torgersen           36.7          19.3
 6   152          NA Adelie  Torgersen           39.3          20.6
 7   152          NA Adelie  Torgersen           38.9          17.8
 8   152          NA Adelie  Torgersen           39.2          19.6
 9   152          NA Adelie  Torgersen           34.1          18.1
10   152          NA Adelie  Torgersen           42            20.2
# ℹ 334 more rows
# ℹ 4 more variables: flipper_length_mm <dbl>, body_mass_g <dbl>, sex <chr>,
#   year <dbl>

summarise(.by = ...) 🏠

Аналогично mutate(.by = ...).

penguins %>% 
  summarise(
    n = n(),
    avg_flipper = mean(flipper_length_mm, na.rm = TRUE),
    .by = species
  )
# A tibble: 3 × 3
  species       n avg_flipper
  <chr>     <int>       <dbl>
1 Adelie      152        190.
2 Gentoo      124        217.
3 Chinstrap    68        196.

Высота столбца как среднее по группе

Хотим визуализировать среднюю длину крыла у пингвинов разных видов.

ggplot(penguins, 
  aes(
    x = species, 
    y = flipper_length_mm,
    fill = species)) +
  geom_bar(
    stat = "summary", 
    fun = "mean") +
  theme(legend.position = "none")

Высота столбца как среднее по группе с разбросом

Хотим визуализировать среднюю длину крыла у пингвинов разных видов и показать разброс в виде “среднее ± стандартное отклонение”.

Сначала нужно подготовить таблицу со значениями средних и SD по группам:

penguin_flippers <- penguins %>% 
  group_by(species) %>% 
  summarise(
    avg_flipper_length = mean(flipper_length_mm, na.rm = TRUE),
    sd_flipper_length = sd(flipper_length_mm, na.rm = TRUE))

penguin_flippers
# A tibble: 3 × 3
  species   avg_flipper_length sd_flipper_length
  <chr>                  <dbl>             <dbl>
1 Adelie                  190.              6.54
2 Chinstrap               196.              7.13
3 Gentoo                  217.              6.48

geom_bar() + geom_errorbar()

ggplot(penguin_flippers, 
  aes(
    x = species, 
    y = avg_flipper_length,
    ymin = avg_flipper_length - sd_flipper_length,
    ymax = avg_flipper_length + sd_flipper_length,
    fill = species)) +
  geom_bar(stat = "identity") +
  geom_errorbar(width = 0.5) +
  theme(legend.position = "none")

stat_summary()

ggplot(penguins, 
       aes(x = species, y = flipper_length_mm, fill = species)) +
  geom_bar(stat = "summary", fun = "mean") +
  stat_summary(fun = mean, 
               fun.max = function(x) mean(x) + sd(x),
               fun.min = function(x) mean(x) - sd(x),
               geom = "errorbar", width = 0.5) 

ggbarplot() из пакета ggpubr

Пакет ggpubr не из коллекции tidyverse, его нужно установить:

install.packages("ggpubr")


library(ggpubr)

ggbarplot(
  penguins, 
  x = "species", 
  y = "flipper_length_mm", 
  fill = "species", 
  add = "mean_sd")

Какой разброс показывать?

  • SD - стандартное отклонение
  • SE, или SEM - стандартная ошибка среднего - \(SE = \frac{SD}{\sqrt{n}}\)
  • CI - доверительный интервал
  • IQR - интерквартильный размах
?ggpubr::ggbarplot

Разделение по двум категориальным переменным

По умолчанию рисуется стековая столбчатая диаграмма - используется параметр position = "stack".

ggplot(penguins, 
  aes(
    x = species, 
    fill = sex)) +
  geom_bar()

Группированная диаграмма

Чтобы получить группированную столбчатую диаграмма, нужно изменить параметр на position = "dodge".

ggplot(penguins, 
  aes(
    x = species, 
    fill = sex)) +
  geom_bar(
    position = "dodge")

Изменить порядок столбцов

По умолчанию столбцы располагаются в алфавитном порядке.

ggplot(penguins, 
  aes(
    x = species, 
    fill = species)) +
  geom_bar() +
  theme(legend.position = "none")

Задать уровни фактора при отрисовке графика

ggplot(penguins, 
  aes(
    x = factor(species, levels = c("Chinstrap", "Adelie", "Gentoo")), 
    fill = species)) +
  geom_bar() +
  theme(legend.position = "none")

График по датафрейму с факторами

penguins %>% 
  mutate(
    species = factor(species, levels = c("Chinstrap", "Adelie", "Gentoo"))
    ) %>% 
  ggplot( 
    aes(
      x = species, 
      fill = species)) +
  geom_bar() +
  theme(legend.position = "none")

fct_infreq()

Хотим изобразить количество пингвинов разных видов и расположить столбцы по убыванию их высоты.

penguins %>% 
  mutate(species = fct_infreq(species)) %>% 
  ggplot(aes(x = species, fill = species)) +
  geom_bar() +
  theme(legend.position = "none")

fct_reorder()

Хотим изобразить среднюю длину крыла и расположить столбцы по убыванию их высоты.

penguins %>% 
  mutate(species = fct_reorder(
    species, flipper_length_mm, .fun = mean, na.rm = TRUE, .desc = TRUE)) %>%
  ggplot(aes(x = species, y = flipper_length_mm, fill = species)) +
  geom_bar(stat = "summary", fun = "mean") +
  theme(legend.position = "none")

fct_reorder()

penguins %>% 
  group_by(species) %>% 
  summarise(mean_fl_length = mean(flipper_length_mm, na.rm = TRUE)) %>% 
  arrange(desc(mean_fl_length))
# A tibble: 3 × 2
  species   mean_fl_length
  <chr>              <dbl>
1 Gentoo              217.
2 Chinstrap           196.
3 Adelie              190.
penguins$species %>% 
  fct_reorder(penguins$flipper_length_mm, .fun = mean, na.rm = TRUE, .desc = TRUE) %>%
  levels()
[1] "Gentoo"    "Chinstrap" "Adelie"   

Круговая диаграмма

ggplot(penguin_species, 
       aes(
         x = "",
         y = n,
         fill = species)) +
  geom_col() +
  coord_polar("y", start=0) +
  theme_void()

Градиенты 🏠

  • scale_color_gradient
  • scale_color_gradient2
  • scale_color_gradientn
ggplot(penguins, aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_length_mm), size = 3) +
  scale_color_gradient(low = "blue", high = "red")

Градиенты: breaks & labels 🏠

  • scale_color_gradient
  • scale_color_gradient2
  • scale_color_gradientn
ggplot(penguins, aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_length_mm), size = 3) +
  scale_color_gradient(low = "blue", high = "red",
    breaks = c(30, 40, 50, 60), limits = c(30, 60)) 

Несколько легенд 🏠

ggplot(penguins, aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_length_mm, shape = species), size = 3) + 
  guides(
    shape = guide_legend(order = 1, title = "Species"), 
    color = guide_colorbar(order = 2, title = "Bill length (mm)")) +  
  scale_color_gradient(low = "blue", high = "red")

Несколько легенд

ggplot(penguins, aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_length_mm, shape = species), size = 3) + 
  guides(
    shape = guide_legend(order = 1, title = "Species"),
    color = "none") +  
  scale_color_gradient(low = "blue", high = "red")

Несколько легенд

ggplot(penguins, aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_length_mm, shape = species), size = 3) + 
  guides(
    shape = guide_legend(order = 1, title = "Species", reverse = TRUE),
    color = "none") + 
  scale_color_gradient(low = "blue", high = "red")

Цвет по условию

ggplot(penguins, aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_length_mm > 50), size = 3)

Цвет по условию

penguins %>% 
  mutate(bill_group = case_when(
    (bill_length_mm < 45) ~ "small",
    (bill_length_mm >= 55) ~ "large",
    TRUE ~ "medium")) %>% 
  ggplot(aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_group), size = 3)

Цвет по условию…

penguins %>% 
  mutate(bill_group = case_when(
    (bill_length_mm < 45) ~ "small",
    (bill_length_mm >= 55) ~ "large",
    TRUE ~ "medium")) %>% 
  ggplot(aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_group), size = 3) +
  scale_color_manual(values = c("small" = "blue", "medium" = "orange", "large" = "red"))

Подписи

sample_10 <- slice_sample(penguins, n = 10)

ggplot(sample_10, aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_length_mm), alpha = 0.5, size = 3) +
  # Наследует aes X и Y
  geom_text(mapping = aes(label = island), size = 5) 

Подписи с ggrepel

ggplot(sample_10, aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_length_mm), alpha = 0.5, size = 3) +
  ggrepel::geom_text_repel(mapping = aes(label = island), size = 5) 

Подписи с {ggrepel}

ggplot(sample_10, aes(x = body_mass_g, y = flipper_length_mm)) + 
  geom_point(aes(color = bill_length_mm), alpha = 0.5, size = 3) +
  ggrepel::geom_label_repel(mapping = aes(label = island), size = 5) 

Ggplot2 extensions

https://exts.ggplot2.tidyverse.org/

Шрифты

Пакеты: {showtext}, {extrafont}, …

Чтобы сработало в RMarkdown: {r fig.showtext=TRUE}

library(showtext)
## Загрузить шрифты из Google fonts (https://fonts.google.com/)
font_add_google("Gochi Hand", "gochi")
font_add_google("Schoolbell", "bell")

## Использовать showtext автоматически
showtext_auto()

ggplot(penguins, aes(bill_length_mm, bill_depth_mm, color = species)) + 
  geom_point() +
  labs(x = "Bill length (mm)", y = "Bill depth (mm)", 
       title = "Penguins from Antarctics") +
  theme(
    text =  element_text(family = "bell", size = 14),
    plot.title = element_text(family = "gochi", size = rel(1.6), hjust = 0.5))

Что почитать про ggplot2

Трансформация датафреймов

Что подставить в aes?

Хотим на одном графике показать распределение длины и ширины клювов пингвинов.

aes переменные - из разных столбцов

Широкий формат

  • Несколько переменных, похожих по своей природе, в разных столбцах
# A tibble: 344 × 3
   species bill_length_mm bill_depth_mm
   <chr>            <dbl>         <dbl>
 1 Adelie            39.1          18.7
 2 Adelie            39.5          17.4
 3 Adelie            40.3          18  
 4 Adelie            NA            NA  
 5 Adelie            36.7          19.3
 6 Adelie            39.3          20.6
 7 Adelie            38.9          17.8
 8 Adelie            39.2          19.6
 9 Adelie            34.1          18.1
10 Adelie            42            20.2
# ℹ 334 more rows

Длинный формат

  • Столбец с названиями переменных
  • Столбец со значениями переменных
# A tibble: 688 × 3
   species measurement       mm
   <chr>   <chr>          <dbl>
 1 Adelie  bill_length_mm  39.1
 2 Adelie  bill_depth_mm   18.7
 3 Adelie  bill_length_mm  39.5
 4 Adelie  bill_depth_mm   17.4
 5 Adelie  bill_length_mm  40.3
 6 Adelie  bill_depth_mm   18  
 7 Adelie  bill_length_mm  NA  
 8 Adelie  bill_depth_mm   NA  
 9 Adelie  bill_length_mm  36.7
10 Adelie  bill_depth_mm   19.3
# ℹ 678 more rows

Длинный и широкий формат

  • Из широкого в длинный - pivot_longer()
  • Из длинного в широкий - pivot_wider()

pivot_longer()

  • Из широкого в длинный формат
penguins %>% 
  # Превращаем в длинный формат
  pivot_longer(
    cols = c(bill_length_mm, bill_depth_mm), 
    names_to = "measurement", values_to = "mm") %>% 
  ggplot() +
  geom_boxplot(aes(x = species, y = mm, fill = measurement))

pivot_wider()

  • Из длинного в широкий формат
penguins %>% 
  select(species, bill_length_mm, bill_depth_mm) %>% 
  mutate(id = 1:n()) %>% 
  # Превращаем в длинный формат
  pivot_longer(
    cols = c(bill_length_mm, bill_depth_mm), 
    names_to = "measurement", values_to = "mm") %>%
  # Обратно в широкий
  pivot_wider(names_from = measurement, values_from = mm)
# A tibble: 344 × 4
   species    id bill_length_mm bill_depth_mm
   <chr>   <int>          <dbl>         <dbl>
 1 Adelie      1           39.1          18.7
 2 Adelie      2           39.5          17.4
 3 Adelie      3           40.3          18  
 4 Adelie      4           NA            NA  
 5 Adelie      5           36.7          19.3
 6 Adelie      6           39.3          20.6
 7 Adelie      7           38.9          17.8
 8 Adelie      8           39.2          19.6
 9 Adelie      9           34.1          18.1
10 Adelie     10           42            20.2
# ℹ 334 more rows

Объединение датафреймов

*_join() 🏠

Два датафрейма можно объединить по одному или нескольким общим столбцам с помощью функций:

  • full_join()
  • left_join()
  • right_join()
  • inner_join()

Функции

Зачем нужны функции?

  • Если вы заметили, что несколько раз используете один и тот же код, то запишите его в функцию.
    • Если вы задали функции говорящее имя (и с помощью комментариев пояснили, как функция работает), ваш код станет более понятным.
    • Если нужно будет что-то изменить в вашей функции, это нужно будет сделать единожды в коде функции.
    • Будет меньше вероятность ошибиться при дублировании кода.
    • Одну и ту же функцию можно использовать в разных проектах.

Пример функции

  • Создали функцию: перевод температуры из градусов Фаренгейта в Цельсия
fahrenheit2celsius <- function(x) {
  (x - 32) * 5 / 9
}

Пример функции

  • Применили функцию
nhtemp
Time Series:
Start = 1912 
End = 1971 
Frequency = 1 
 [1] 49.9 52.3 49.4 51.1 49.4 47.9 49.8 50.9 49.3 51.9 50.8 49.6 49.3 50.6 48.4
[16] 50.7 50.9 50.6 51.5 52.8 51.8 51.1 49.8 50.2 50.4 51.6 51.8 50.9 48.8 51.7
[31] 51.0 50.6 51.7 51.5 52.1 51.3 51.0 54.0 51.4 52.7 53.1 54.6 52.0 52.0 50.9
[46] 52.6 50.2 52.6 51.6 51.9 50.5 50.9 51.7 51.4 51.7 50.8 51.9 51.8 51.9 53.0
fahrenheit2celsius(nhtemp)
Time Series:
Start = 1912 
End = 1971 
Frequency = 1 
 [1]  9.944444 11.277778  9.666667 10.611111  9.666667  8.833333  9.888889
 [8] 10.500000  9.611111 11.055556 10.444444  9.777778  9.611111 10.333333
[15]  9.111111 10.388889 10.500000 10.333333 10.833333 11.555556 11.000000
[22] 10.611111  9.888889 10.111111 10.222222 10.888889 11.000000 10.500000
[29]  9.333333 10.944444 10.555556 10.333333 10.944444 10.833333 11.166667
[36] 10.722222 10.555556 12.222222 10.777778 11.500000 11.722222 12.555556
[43] 11.111111 11.111111 10.500000 11.444444 10.111111 11.444444 10.888889
[50] 11.055556 10.277778 10.500000 10.944444 10.777778 10.944444 10.444444
[57] 11.055556 11.000000 11.055556 11.666667

Функции

Нужно придумать:

  • имя функции. Оно не должно совпадать с именами функций из базового R или пакетов, которые вы используете. В идеале оно отражает смысл вашей функции.
# не делайте так!
mean <- function(x) { sum(x) }
  • список параметров, которые функция принимает на вход. Например, function(x, y, z).

  • сам код, выполняющий работу, который вы записываете в тело функции внутри {...}.

smart_name <- function(input1, input2, param3) {
  ...
  body
  ...
}

Что на вход и выход?

  • У функции может быть 0 или несколько параметров.
  • Функция может возвращать максимум 1 объект.
# ничего не требует
say_hello <- function() {
  print("Привет!")
}


# ничего не возвращает
save_res <- function(df) {
  df = df[df$pval < 0.05, c(1,3:5)]
  write.csv(df, "path-to-file.csv")
}
say_hello()
[1] "Привет!"
save_res(multiple_tests)

return()

  • Функция возвращает результат последнего выражения либо то, что указано как return(...).
fahrenheit2celsius <- function(x) {
  y = (x - 32) * 5 / 9
  return(y)
}

fahrenheit2celsius(54)
[1] 12.22222
fahrenheit2celsius <- function(x) {
  return(x)
  y = (x - 32) * 5 / 9
  y
}

fahrenheit2celsius(54)
[1] 54

Выполнение кода по условию 🏠

if (condition) {
  # что делать, когда condition = TRUE
} else {
  # что делать, когда condition = FALSE
}

Логическое выражение condition должно возвращать либо TRUE, либо FALSE.

Несколько условий 🏠

if (this) {
  # делай это, когда первое условие выполняется
} else if (that) {
  # делай что-то другое, когда первое условие не выполняется, а второе выполняется
} else {
  # делай что-то третье, когда ни одно из условий выше не выполняется
}

Не путайте else if () {...} с ifelse().

Параметры 🏠

Через параметры на вход функции передаются данные или какие-то детали. Обычно данные передаются первому параметру. В таком случае эту функцию будет легко использовать с конвейером (%>% или |>).

Для параметров можно задать значение по умолчанию:

fahrenheit2celsius <- function(x = 32) {
  (x - 32) * 5 / 9
}

fahrenheit2celsius()
[1] 0
fahrenheit2celsius(86)
[1] 30

Названия параметров 🏠

Идеи для названий параметров:

  • x, y, z - вектора,
  • w - вектор весов,
  • df - датафрейм,
  • i, j - индексы (строки и столбцы),
  • n - длина или число строк,
  • p - число столбцов.

Провека формата входных данных 🏠

В каком случае нужно остановиться.

if() + stop()

fahrenheit2celsius <- function(x) {
  if (!is.numeric(x)) {        
    stop("`x` must be numeric") 
    }
  (x - 32) * 5 / 9
}

fahrenheit2celsius("23")
Error in fahrenheit2celsius("23"): `x` must be numeric

stopifnot()

fahrenheit2celsius <- function(x) {
  stopifnot(is.numeric(x))
  (x - 32) * 5 / 9
}

fahrenheit2celsius("23")
Error in fahrenheit2celsius("23"): is.numeric(x) не TRUE

Multiple returns 🏠

Чтобы функция возвращала несколько объектов, нужно эти объекты возвращать в виде списка.

return_two_and_four <- function(){
  list(2, 4)
}

return_two_and_four()
[[1]]
[1] 2

[[2]]
[1] 4

Локальные переменные 🏠

x внутри функции (в ее среде) и вне функции (в глобальной среде) существуют независимо.

x <- 1000

add_ten <- function(x){
  x + 10
}

add_ten(32)
[1] 42
x
[1] 1000

Глобальные переменные 🏠

Изнутри функции можно переписать глобальную переменную с помощью оператора <<-.

x <- 1000

add_ten <- function(x){
  x <<- 32
  x + 10
}

add_ten(32)
[1] 42
x
[1] 32

Глобальные переменные 🏠

Если R не нашел переменную в среде функции, то он будет искать ее в глобальной среде.

y <- 500

add_ten <- function(){
  y + 10
}

add_ten()
[1] 510

Функции, работающие с датафреймами 🏠

  • Хотим название столбца использовать как один из параметров
summary6 <- function(df, var) {
  summarize(
    df,
    min = min(var, na.rm = TRUE),
    mean = mean(var, na.rm = TRUE),
    sd = sd(var, na.rm = TRUE),
    median = median(var, na.rm = TRUE),
    iqr = IQR(var, na.rm = TRUE),
    max = max(var, na.rm = TRUE),
    .groups = "drop")
}

summary6(mtcars, var = mpg)
Error in `summarize()`:
ℹ In argument: `min = min(var, na.rm = TRUE)`.
Caused by error in `FUN()`:
! only defined on a data frame with all numeric-alike variables

Функции, работающие с датафреймами 🏠

  • Нужно использовать {{ ... }} - embracing
  • то же с функциями, работающими с ggplot2
summary6 <- function(df, var) {
  summarize(
    df,
    min = min({{ var }}, na.rm = TRUE),
    mean = mean({{ var }}, na.rm = TRUE),
    sd = sd({{ var }}, na.rm = TRUE),
    median = median({{ var }}, na.rm = TRUE),
    iqr = IQR({{ var }}, na.rm = TRUE),
    max = max({{ var }}, na.rm = TRUE),
    .groups = "drop")
}

summary6(mtcars, var = mpg)
   min     mean       sd median   iqr  max
1 10.4 20.09062 6.026948   19.2 7.375 33.9

Импорт функции из файла 🏠

  • В R скрипте записаны одна или несколько функций
# temperature_conversion.R

fahrenheit2celsius <- function(x) {
  (x - 32) * 5 / 9
}

celsius2kelvin <- function(x) {
  x + 273.15
}
  • Импорт функций из R скрипта в текущую R сессию
source("temperature_conversion.R")

Выполнение R скрипта в командной строке 🏠

# say_hello.R

say_hello <- function(name = "Anya") {
  print(paste0("Hello, ", name, "!"))
}

say_hello()


Rscript say_hello.R
[1] "Hello, Anya!"

Передача параметров скрипту из командной строки 🏠

# say_hello_to_anyone.R

args <- commandArgs(trailingOnly=TRUE)

say_hello <- function(name = "Anya") {
  print(paste0("Hello, ", name, "!"))
}

if (length(args)==0) {
  say_hello()
} else {
  name = args[1]
  say_hello(name)
}


Rscript say_hello_to_anyone.R "Nastya"
[1] "Hello, Nastya!"

Выполнение R скрипта в фоне 🏠

  • Запустить выполнение скрипта в текущей R сессии:
source("my_script.R")
  • Чтобы запустить выполнение скрипта в другой (фоновой) R сессии:

Конец!