Как я уже упоминал раньше, в языке R присутствует достаточно мощная система создания графиков всевозможных типов. Я планирую посвятить отдельные статьи разным типам графиков, а здесь я постараюсь рассказать, как построить простой график на R с помощью R Services и включить его в отчет Reporting Services.
Итак, для построения графика нам в первую очередь потребуются данные. Для этого сгенерируем небольшой тестовый набор данных. Предположим, что у нас есть магазин, который посещают клиенты из 5 различных районов города. По каждому из клиентов мы знаем, сколько раз в неделю в среднем он посещает наш магазин и на какую сумму делает покупки. Мы хотим наглядно увидеть, отличается ли поведение клиентов в нашем магазине в зависимости от района. Ниже представлен скрипт для генерации тестовых данных.
use [TEST]; go if object_id('dbo.test_customer_activity_table', 'U') is not null drop table dbo.test_customer_activity_table; go with region as ( select cast('A' as char(1)) as region, cast(floor(rand(checksum(newid())) * 10) as int) + 1 as n union all select 'B', cast(floor(rand(checksum(newid())) * 10) as int) + 1 union all select 'C', cast(floor(rand(checksum(newid())) * 10) as int) + 1 union all select 'D', cast(floor(rand(checksum(newid())) * 10) as int) + 1 union all select 'E', cast(floor(rand(checksum(newid())) * 10) as int) + 1 ) select region.region, t.num_visits, t.amount_spent into dbo.test_customer_activity_table from region cross apply ( select top (n) cast(floor(rand(checksum(newid())) * 5) as int) + 1 as num_visits, cast(rand(checksum(newid())) * 1000 as decimal(28, 2)) + 1 as amount_spent from sys.all_columns ) as t order by region.region; go |
Как видно, данные я сформировал совешенно случайным образом без какой-либо корреляции и вставил в таблицу dbo.test_customer_activity_table. Далее нам нужна будет хранимая процедура, которая возьмет эти данных и на базе них построит график, на котором на оси X будет обозначено количество посещений магазина, по оси Y – средний счет, а районы города мы обозначим на графике точками разного цвета. Для отрисовки я буду использовать пакет ggplot2, про установку которого я уже рассказывал ранее. Итак, процедура будет запускать код на R с помощью sp_execute_external_script, передавая ей набор данных из тестовой таблицы.
create procedure dbo.r_report_test as begin execute sp_execute_external_script @language = N'R', @script = N' library("ggplot2"); image_file = tempfile(); jpeg(filename = image_file, width=600, height = 800); print(qplot(num_visits, amount_spent, data = SqlIn, color = region,# size = amount_spent, xlab = "Number of visits", ylab = "Amount spent", main = "Customer activity by region") + geom_point(size = 5)); dev.off(); OutputDataSet <- data.frame(data=readBin(file(image_file, "rb"), what=raw(), n=1e6)); ', @input_data_1 = N'select region, num_visits, amount_spent from dbo.test_customer_activity_table', @input_data_1_name = N'SqlIn' with result sets ((plot varbinary(max))); end; go |
Хранимая процедура возвращает набор данных, состоящий из одной строки и одного поля plot, в котором в бинарном формате возвращается графический файл в формате jpeg. Теперь нам только остается отобразить его в отчете Reporting Services. В Visual Studio создаем проект Report Server Project.
После этого справа в Solution Explorer кликаем правой клавишей мыши на папке Reports и добавляем в него пустой отчет.
Сначала в отчет нам нужно добавить Dataset. Для этого слева щелкаем правой клавишей мыши на папке Datasets и добавляем новый.
В нем нужно выбрать соединение к вашему тестовому серверу и базе данных, где мы расположили таблицу и храниму процедуру для формирования графика. В первом окне выбираем Use dataset embedded in my report, далее в Data Source выбираем кнопку New.
В появившемся окне нажимаем на кнопку Edit в поле Connection string.
В появившемся окне набираем имя сервера и базы данных. Т.к. у меня локальный сервер, имя экземпляра по умолчанию, я могу использовать просто точку вместо имени.
После этого нажимаем OK два раза, параметр Query type выставляем Stored procedure и в выпадающем списке выбираем нашу хранимую процедуру.
Нажимаем OK и у нас слева должен появиться наш новый Dataset.
Теперь на наш отчет мы добавляем элемент image и делаем его побольше в размерах, чтобы картинку было лучше видно. И открываем его свойства. В появившемся окне мы должны заполнить свойства Select the image source – Database, выбрать из выпадающего списка имя поля, в котором содержится картинка и выбрать ее формат image/jpeg.
После этого свойства можно закрыть и перейти в размел Preview. Если все хорошо, то у вас должно получиться примерно следующее.
Конечно, это всего-лишь простой пример, но я постарался сделать пошаговое руководство, как включить в отчет графики на R. Ваши отчеты в реальности скорее всего будут выглядить гораздо сложнее, содержать большее количество элементов. Надеюсь этот простой пример поможет вам быстрее начать и создать ваш первый отчет с графиками на R. Оставайтесь на связи, в следующих частях я начну рассказывать про обработку данных с помощью библиотеки ScaleR.