Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.
__name__, __file__, __spec__ и т.д. Путь к файлу скрипта автоматически записывается в переменную __file__, и вы в любой момент из этой переменной можете получить абсолютный путь к файлу выполняемого скрипта.
В R под капотом такой механизм не реализован, но вы же помните, что в R на любой чих есть пакет. Функционал по определению пути к текущему, исполняемому R скрипту предоставляет пакет this.path. В нём вам по большей части понадобится всего две функции:
● this.path() - получить абсолютный путь к исполняемому R файлу.
● this.dir() - получить абсолютный путь к директории исполняемого R файла.
Функции this.path2(), this.dir2() и this.dir3() делают тоже самое, но если вы их запускаете, например в не сохранённом R файле вместо ошибки вернут NULL или текущую рабочую директорию.
В качестве примера можете создать простейший файл test.R, со следующим кодом:
library(this.path) print(this.path()) print(this.dir())Далее запустите его в пакетном режиме из командной строки, или в RStudio сочетанием клавиш Ctrl + Shift + Enter. Результат:
> source("~/test.R", echo=TRUE)
> library(this.path)
> print(this.path())
[1] "C:/Users/Username/Documents/test.R"
attr(,"this.path.n")
[1] 1
> print(this.dir())
[1] "C:/Users/Username/Documents"
#заметки_по_Rggchicklet предоставляет вам дополнительный geom - geom_chicklet(), который по сути является аналогом ggplot2::geom_col(), но даёт возможно установить ралиус с помощью доп аргумента radius, и придать вашему графику более эффектный вид.
Установка:
На данный момент ggchicklet можно установить одним из следующих способов.
install.packages("ggchicklet", repos = "https://cinc.rud.is")
# или
remotes::install_git("https://git.rud.is/hrbrmstr/ggchicklet.git")
# или
remotes::install_git("https://git.sr.ht/~hrbrmstr/ggchicklet")
# или
remotes::install_gitlab("hrbrmstr/ggchicklet")
# или
remotes::install_bitbucket("hrbrmstr/ggchicklet")
# или
remotes::install_github("hrbrmstr/ggchicklet")
Пример:
library(ggchicklet) library(ggplot2) # тестовые данные df <- data.frame( value = 1:5, group = LETTERS[1:5] ) # обычная гистограмма ggplot(df, aes(group, value)) + geom_col() # гистограмма с закруглёнными углами ggplot(df, aes(group, value)) + geom_chicklet(radius = grid::unit(3, "mm"))Смотрите также: - Как исправить перекрывающие друг друга текстовые метки в ggplot2 - Как расположить несколько ggplot2 графиков на одном изображении Ссылки: - Пример кода для построения графика заимствованы из статьи "How to make a rounded corner bar plot in R?" - Способы установки пакета заимствованы из его README #заметки_по_R
webshot2 максимально упрощает процесс создания скриншота сайта, примеры приведённые ниже иллюстрируют это.
library(webshot2)
# снимок одной страницы
webshot("https://www.r-project.org")
# снимок нескольких страниц в параллельно мрежиме
webshot(c("https://www.r-project.org", "https://www.rstudio.com"))
# Используем CSS селектер для определения области скриншота
webshot(
"http://rstudio.github.io/leaflet",
"leaflet-menu.png",
selector = ".list-group"
)
# полученный скриншот можно использовать
# совместно с другими функциями в конвейере
webshot("https://www.r-project.org/", "r-small.png") %>%
resize("75%") %>%
shrink()
Аргументы функции webshot():
● url - URL адрес сайта, скриншот которого вам надо сделать
● file - Название файла, в который будет сохранён скринот
● vwidth - Ширина области просмотра. Это ширина «окна» браузера.
● vheight - Высота окна просмотра.
● selector - Позволяет указать CCS селектор, определив необходимую часть сайта, которая будет сохранена в виде скриншота.
● cliprect - Позволяет задать размер прямоугольника веб сайта, который будет помещён в скриншот. По умолчанию, если не указать selector и cliprect будет сохранена страница целиком. Либо вы можете указать вектор из четырёх чисел по порядку определяющий координаты левой, верхней точки, а так же ширину и высоту скриншота.
● expand - 448 / 5 000
Результаты перевода
Числовой вектор, указывающий, на сколько пикселей расширить прямоугольник отсечения.
● delay - Время ожидания перед тем, как сделать снимок экрана, в секундах.
● zoom - Число, указывающее коэффициент масштабирования. При коэффициенте масштабирования 2 количество пикселей по вертикали и горизонтали будет вдвое больше.
● useragent - Задаёт заголовок User-Agent.
#заметки_по_Rpkg::fun()).
● не экспортируемые - функции, которые не экспортируются даже после подключения пакета, к ним можно получить доступ через тройное двоеточие (pkg:::fun()).
Не экспортируемые объекты зачастую направлены на внутренние нужды пакета, и в 99% случаев доступ к ним не нужен конечным пользователям пакетов.
Пример такой функции
Любители dplyr наверняка знакомы с функцией where(). Она используется когда вам необходимо получить, например объекты одного типа.
where(is.numeric())Я довольно часто использую
dplyr в своих пакетах, и не редко использую функцию where(), но это не экспортируемая функция.
С какой ошибкой вы столкнётесь пытаясь использовать не экспортируемый объект
При прогоне пакета через авто тесты вы можете увидеть предупреждение:
dependencies in R code ... NOTE
Unexported object imported by a ':::' call: 'package:::function'
See the note in ?`:::` about the use of this operator.
Это как раз о том, что вы используете не экспортируемый объект, и политикой CRAN это не приветствуется.
Как добавить импорт не экспортируемого объекта в свой пакет
Есть несколько приёмов, на практике с описанной проблемой я встречался дважды, первый раз когда пытался экспортировать функцию where() из tidyselect, на GitHub разработчики tidyselect рекомендуют поместить следующую конструкцию внутрь функции .onLoad.
utils::globalVariables("where")
Также с похожей проблемой я столкнулся при экспорте is_response(), из пакета httr2, тут нашел немного другой вариант, вставить следующий вызов в любое место R кода вашего пакета.
is_response <- getFromNamespace("is_response", "httr2")
Также в обоих случаях вам необходимо добавить импорт пакета
utils в файлы NAMESPACE и DESCRIPTION вашего пакета.
#заметки_по_Rtvthemes предоставляет вам набор готовых тем, палитр и шрифтов, заимствованных из различных телешоу и сериалов, таких как: Игра Престолов, Симпсоны, Спанч Боб и многие другие.
Мы, в качестве примера, возьмём тему из мультсериала Симпсоны. Для начала необходимо установит нужные шрифты, для этого воспользуемся функцией import_simpsons(), после чего, в консоли увидим путь, к папке со шрифтом, файлы шрифтов необходимо перенести в папку Windows/fonts.
Можно посмотреть палитру с помощью scales::show_col(tvthemes:::simpsons_palette).
Ниже пример кода построения графика, приведённого на изображении к посту:
library(tvthemes)
library(ggplot2)
library(dplyr)
library(glue)
library(extrafont)
loadfonts(quiet = TRUE)
import_simpsons()
data <- gapminder::gapminder %>%
filter(country %in% c("France", "Germany", "Ireland", "Italy", "Japan", "Norway", "Belarus")) %>%
mutate(year = as.Date(paste(year, "-01-01", sep = "", format='%Y-%b-%d')))
ggplot(data = data, aes(x = year, y = gdpPercap, fill = country)) +
geom_area(alpha = 0.8) +
scale_x_date(breaks = data$year, date_labels = "%Y") +
scale_y_continuous(expand = c(0, 0), labels = scales::dollar) +
scale_fill_simpsons() +
labs(title = "The Simpsons",
subtitle = "Theme inspired in part by @nathancunn's blog posts",
caption = glue("
A 'Bake 'em Away, Toys!' Production
Location: Sector 7G"),
x = "Wel-diddly-elcome neighborino!",
y = "Price of Duff Beer") +
theme_simpsons(title.font = "Akbar",
text.font = "Akbar",
axis.text.size = 8)
Ссылки:
- Другие примеры тем и кода можно найти в официальной документации
#заметки_по_Rcase_when() по этой ссылке можно познакомится с ней по ближе.
Тем кто с case_when() знаком, расскажу о том, что в ней изменилось:
● Ранее для обозначения условия по умолчанию, которое будет выполнено только в том случае, когда ни одно из всех выше указанных не выполнились, использовали конструкцию TRUE ~ default_value, что снижало читабельность кода, теперь для этого добавлен отдельный аргумент .default.
● Функции case_when() и if_else() были переписаны на базе пакета vctrs. Например, теперь нет необходимости использовать типизированные варианты NA_character, NA_complex, можно использовать просто обощённый вариант - NA.
● case_when() теперь поддерживает большее количество типов значений. Например, вы можете использовать tibble для одновременного создания нескольких столбцов.
Примеры того, как изменился синтаксис:
# тестовые данные
x <- c(1, 3, 0, 5, 0 ,7)
# старый вариант
dplyr::case_when(
x == 0 ~ NA_character,
x <= 2 ~ "low",
x <= 4 ~ "medium",
TRUE ~ "high"
)
# новый вариант
dplyr::case_when(
x == 0 ~ NA,
x <= 2 ~ "low",
x <= 4 ~ "medium",
.default = "high"
)
А приведённый ниже пример вообще в старом варианте реализовать не получилось бы:
library(dplyr)
df <- tibble(x = c(1, 3, 0, 5, 0 ,7))
df %>% mutate(
case_when(
x == 0 ~ NA,
x <= 2 ~ tibble(type = 'low', id = 1),
x <= 4 ~ tibble(type = 'medium', id = 2),
.default = tibble(type = 'high', id = 3)
)
)
Результат:
# A tibble: 6 × 3
x type id
<dbl> <chr> <dbl>
1 1 low 1
2 3 medium 2
3 0 NA NA
4 5 high 3
5 0 NA NA
6 7 high 3
Ссылки:
- узнал об этом из твита Девиса Вогана
#заметки_по_Rlubridate устроена работа с конвертацией отметки времени между часовыми поясами.
Для начала, что бы получить список названий часовых поясов используйте функцию OlsonNames() из базового R. Она вернёт вектор названий всех часовых поясов.
Далее, уже в самом lubridate есть две функции для работы с часовыми поясами:
● with_tz() - Получить дату и время в другом часовом поясе, т.е. указанную в первом аргументе отметку времени мы конвертируем в другой часовой пояс;
● force_tz() - Замените часовой пояс, чтобы создать новую дату и время, т.е. значение даты и времени не меняется, но меняется часовой пояс.
На примерах ниже разница между описанными функциями будет более понятна:
library(lubridate)
x <- ymd_hms("2009-08-07 00:00:01", tz = "America/New_York")
with_tz(x, "GMT")
[1] "2009-08-07 04:00:01 GMT"
force_tz(x, "GMT")
[1] "2009-08-07 00:00:01 GMT"
Читайте также:
- Пакеты для работы с датой и временем
- Видео урок по работе с пакетом clock
Поддержать канал:
Вы можете поддержать канал любой произвольной суммой, сделать это можно по ссылке.
#заметки_по_R