Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.
googledrive работать с API Google Диска.
Содержание:
1. Установка
2. Использование
2.1. Загрузить googledrive
2.2. Соглашения о пакете
2.3. Быстрая демонстрация
2.4. Определить файлы
2.5. Загрузить файлы
2.6. Делиться файлами
2.7. Публикация файлов
2.8. Скачать файлы
2.9. Очистить
#статьи_по_Rdplyr 1.1.0, но все основные функции и доработки, которые войдут в этот релиз уже доступны в dev версии.
В связи с чем я записал видео обзор нововведений по мотивам статьи "dplyr 1.1.0 is coming soon".
Тайм коды:
00:00 Вступление
00:40 Список основных изменений dplyr 1.1.0
01:31 Аргумент .by
04:53 Неэквивалентные соединения (non-equal join)
12:21 Ускоренный arrange()
13:07 Функция reframe()
15:43 Заключение
Данный урок был включен в курс "Введение в dplyr 1.0.0".
#видео_уроки_по_Rggplot2. Если ваши подписи накладываются друг на друга (самый левый пример на изображении к посту) то у вас есть несколько вариантов их исправить:
1. Добавить перенос строки в длинные подписи;
2. Изменить угол наклона текста подписи
Пример:
library(ggplot2)
# тестовые данные
df = data.frame(x = c("label", "long label", "very, very long label"),
y = c(10, 15, 20))
# дефолтные настройки
ggplot(df, aes(x, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity")
Добавить перенос строк можно с помощью функции str_wrap() из пакета stringr. Данная функция принимает строку, и количество символов ,которое должно помещаться в одну строку, далее добавляется в нужных местах подписи перенос строки. Добавить эту функции в ggplot2 можно в сочетании с функцией scale_x_discrete().На изображении к посту результат этой функции по центру.
library(stringr)
# перенос троки
ggplot(df, aes(x, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity") +
scale_x_discrete(labels = function(x) str_wrap(x, width = 10))
Изменить угол наклона (на изображении к посту самый правый график) можно добавив слой theme(), и настроив наклон на 90 градусов (angle = 90), сделать горизонтальное центрирование к оси X (hjust = 1), b и вертикальное (vjust = 0.5).
# изменяем угол наклона текста подписей
p3 <- ggplot(df, aes(x, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity") +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))
Смотрите так же:
- Как исправить перекрывающие друг друга текстовые метки в ggplot2
#заметки_по_Rsortable позволяет добавить в интерфейс вашего приложения возможность сортировки элементов (пример сортировки вы видите на изображении к посту).
Для сортировки элементов, их предварительно необходимо объединить в один блог с помощью тега div:
tags$div(
id = "all_plots",
column(
width = 6,
wellPanel(
plotOutput("scatter")
)
),
column(
width = 6,
wellPanel(
plotOutput("bill_length")
)
),
column(
width = 6,
wellPanel(
plotOutput("bill_depth")
)
),
column(
width = 6,
wellPanel(
plotOutput("penguin_count")
)
)
)
Далее добавить в код пользовательского интерфейса вашего приложения функцию sortable_js(), и указать id блока div, элементы которого вы будете сортировать.
sortable_js("element_id")
Ссылки:
● Весь код приложения, которое используется в посте в качестве примера
#заметки_по_Rqrcode позволяет вам генерировать QR коды. На данный момент qrcode поддерживает 3 типа кодирования:
● numeric data: (числовой, поддеживает цифры 0-9);
● alphanumeric data: (альфачисловой, поддерживает цифры 0-9, буквы верхнего регистра A-Z,9 спецсимволов: пробел,$ % * + — / :);
● byte data: (битовый, по умолчанию ISO/IEC 8859-1);
Тип кодирования Кандзи (упаковывается в 13 бит) в данный момент не поддерживается.
Пакет позволяет выводить сгенерированный QR код в консоль, или в область построения графика.
Пример:
library(qrcode)
code <- qr_code("QR CODE")
print(code)
##
## ▗▄▄▄ ▗▗▄▄▄
## ▐▗▄▐ ▐▟▐▗▄▐
## ▐▐█▐▐▞▐▐▐█▐
## ▐▄▄▟▗▚▚▐▄▄▟
## ▗▖ ▄▖ ▖ ▗▖
## ▝▄▜▄▌▘▜▚▛▚█
## ▐▜█▚▀▐██▙▙▞
## ▗▄▄▄▐▄▞▖▗▟▄
## ▐▗▄▐▝▖▖▞▗▟▘
## ▐▐█▐ ▞█▛▄▐▄
## ▐▄▄▟▐▘▜▀▐▜▝
##
##
##
## use plot() for a better quality image
plot(code)
#заметки_по_Rshinyglide. Компонент shinyglide создаётся с помощью функции glide(), далее в этот компонент добавляются экраны с помощью вложенных функций screen(). Пример ниже демонстрирует как можно добавить серию экранов в карусель:
library(shiny)
library(shinyglide)
ui <- fixedPage(style = "max-width: 500px;",
titlePanel("Simple shinyglide app"),
glide(
height = "350px",
screen(
p("This is a very simple shinyglide application."),
p("Please click on Next to go to the next screen.")
),
screen(
p("Please choose a value."),
numericInput("n", "n", value = 10, min = 10)
),
screen(
p("And here is the result."),
plotOutput("plot")
)
)
)
server <- function(input, output, session) {
output$plot <- renderPlot({
hist(
rnorm(input$n),
main = paste("n =", input$n),
xlab = ""
)
})
}
shinyApp(ui, server)
Пакет shinyglide также позволяет добавить условие, которое должно быть выполнено перед тем, как пользователю станет доступен переход на следующий жкран карусели. Реализуется это с помощью аргумента next_condition функции screen(). Этот приём можно использовать, например, при разработке тестов.
Ссылки:
- Ссылка на приложение, представленное к изображению к посту
- Ссылка на документацию пакета
#заметки_по_Rrclipboard и функции rclipButton(). Данная функция копирует в буфер обмена текст, который передан в её аргумент clipText. Но, для активации функции копирования включите функцию rclipboardSetup() в пользовательский интерфейс вашего приложения.
Пример:
# in the UI
rclipboardSetup(),
uiOutput("clip_button")
# in the server
renderUI({
rclipButton(
"clip_button",
"Copy to clipboard",
clipText = "Text to be copied",
icon = icon("clipboard")
)
})
Можно ещё немного улучшить этот интерфейс. Дело в том, что в приведённом выше примере при клике по кнопке "Copy to clipboard" визуально ничего не происходит. Но мы можем добавить всплывающую подсказку с помощью пакета tippy.
Добавить всплывающую подсказку можно вызвав функцию tippy_this() в пользовательском интерфейсе, указав при этом идентификатор пользовательского элемента. В нашем примере идентификатором кнопки копирования в буфер обмена является clip_button.
Пример:
# in the UI tippy_this( "clip_button", tooltip = "String copied!", trigger = "click" )Ссылки: - Посмотреть целиком код приложения, который использован в качестве примера - README пакета rclipboard #заметки_по_R
tidyjson предоставляет ряд функций - глаголов, наподобие dplyr, которые позволяют легко работать с JSON структурами, в том числе и быстро приводить сложные, вложенные конструкции в табличный вид.
Для приведения JSON в таблицу используйте функцию spread_all().
Пример:
library(tidyjson)
library(dplyr)
# Тестовый набор данных JSON структур
people <- c('{"age": 32, "name": {"first": "Bob", "last": "Smith"}}',
'{"age": 54, "name": {"first": "Susan", "last": "Doe"}}',
'{"age": 18, "name": {"first": "Ann", "last": "Jones"}}')
# Приводим в табличный вид
people %>% spread_all
#> # A tbl_json: 3 x 5 tibble with a "JSON" attribute
#> ..JSON document.id age name.first name.last
#> <chr> <int> <dbl> <chr> <chr>
#> 1 "{\"age\":32,\"name..." 1 32 Bob Smith
#> 2 "{\"age\":54,\"name..." 2 54 Susan Doe
#> 3 "{\"age\":18,\"name..." 3 18 Ann Jones
При чём функция spread_all() принимает на вход вектор JSON структур, т.е.она векторизирована.
#заметки_по_Rmash_colnames() из пакета unheadr позволяет в одну строку кода, привести многострочные заголовки к нормальному виду, объединив их с помощью указанного разделителя.
Пример:
library(unheadr)
# Генерируем таблицу
# с многострочными заголовками
rodents <-
tibble::tribble(
~critter, ~tail, ~whisker, ~mass,
NA, "length", "length", "grams",
NA, "mm", "mm", NA,
"rat", "71", "12", "91",
"mouse", "58", "8", "47",
"vole", "12", "5", "43"
)
Входящие данные выглядят следующим образом:
# A tibble: 5 × 4
critter tail whisker mass
<chr> <chr> <chr> <chr>
1 NA length length grams
2 NA mm mm NA
3 rat 71 12 91
4 mouse 58 8 47
5 vole 12 5 43
Теперь используем функцию mash_colnames():
# объединяем многострочные заголовки из первых двух строк rodents |> mash_colnames(n_name_rows = 2)Результат выглядит так (на сматрфоне возможно будет не очень понятно):
# A tibble: 3 × 4 critter tail_length_mm whisker_length_mm mass_grams <chr> <chr> <chr> <chr> 1 rat 71 12 91 2 mouse 58 8 47 3 vole 12 5 43Аргументы функции
mash_colnames
():
● df - таблица, имена столбцов которой надо объединить
● n_name_rows - К-во строк, которое необходимо свернуть в заголовок
● keep_names - Надо ли включать текущие имена столбцов, в составные имена столбцов на выходе
● sliding_headers - Заполнить столбцы без названия, именами слева направо, более подробно можете посмотреть в примерах к функции, или статье, на которую я дам ссылку в конце поста.
● sep - Разделитель, через который будут объединяться имена столбцов
Ссылки:
● Материл заимствован из статьи "Fixing broken and irregular column headers"
#заметки_по_Rshinycssloaders, который позволяет анимировать процесс загрузки отдельных визуальных элементов. Но, иногда сама бизнес логика приложения требует некоторых временных затрат, например ваше приложение обращается по API за данными, далее ждёт ответ, обрабатывает его, и потом уже отображает результат. В таком случае будет полезно настроить окно загрузки приложения, оповещая пользователя о том, какой процесс расчётов в данный момент выполняется.
Создать такое окно загрузки можно с помощью пакета waiter.
Процесс добавления пользовательского экрана загрузки состоит из трёх шагов:
1. Включите useWaiterв() свой пользовательский интерфейс.
ui = fluidPage(
useWaiter(),
titlePanel("{waiter}"),
h2("Locations of the ISS in the last 10 mins"),
wellPanel(
leafletOutput("iss_location")
),
fluidRow(
column(
width = 12,
actionButton(
"refresh",
"Refresh App",
icon = icon("sync")
),
align = "center"
)
)
)
2. Добавьте в нужных частях серверной части фукцию waiter_show().
3. Закройте экран ожидания функцией waiter_hide().
server = function(input, output, session) {
observeEvent(input$refresh, {
waiter_show(
html = HTML(paste(spin_fading_circles(),
br(),
h4("Retrieving data from API...")))
)
all_positions = map_dfr(get_timestamps(), get_10_positions)
waiter_show(
html = HTML(paste(spin_fading_circles(),
br(),
h4("Creating map...")))
)
output$iss_location = renderLeaflet({
m = leaflet(all_positions)
m = addTiles(m)
m = addMarkers(m, lng = ~iss_longs, lat = ~iss_lats,
popup = "Position of the International Space Station")
})
waiter_hide()
}, ignoreNULL = FALSE
)
}
Пример работы приведённого кода виден на изображении к посту.
Ссылки:
- Полный пример кода приложения, приведённого на изображении к посту
- Документация к пакету waiter
#заметки_по_R