말한 바와 같이 OData 지원에 대한 블로그 게시물에서 Mendix, OData는 애플리케이션에서 데이터에 액세스하려는 경우에도 유용합니다. R or RStudio. 이 블로그 게시물에서는 이 작업을 수행하는 방법을 보여드리겠습니다. 또한 R에 익숙하지 않은 사람들을 대상으로 R을 사용하는 방법에 대한 간단한 몇 가지 예를 제공하겠습니다.
R은 무엇입니까?
R은 많은 데이터 과학자가 사용하는 매우 인기 있는 오픈 소스 통계 분석 프로그래밍 언어입니다. 무료 오픈 소스 버전을 다운로드할 수 있지만 Microsoft Revolution R, Tibco Spitfire, Pivotal, Oracle, Tableau를 포함한 많은 상용 도구에서 R 지원을 찾을 수도 있습니다. R의 흥미로운 점은 사용할 수 있는 라이브러리가 매우 많다는 것입니다. 라이브러리는 데이터 조작 알고리즘에서 그래프, 보고, 머신 러닝에 이르기까지 다양합니다.
R에 OData 로딩하기
OData를 R로 검색하려면 다음 두 패키지를 사용합니다. HTTR(HTTR) XML첫 번째 패키지를 사용하면 웹에서 데이터를 읽을 수 있고, 두 번째 패키지를 사용하면 XML 문서를 구문 분석할 수 있습니다.
이러한 패키지를 사용하는 간단한 기능을 사용하면 OData 리소스를 가져와 R 데이터로 변환할 수 있습니다.
dataset <- getODataResource(<url of the odata resource>,<username>,<password>)
시작하기에 앞서 필요한 라이브러리를 지정해야 합니다.
library('httr')
library('XML')
library('dplyr')
library('lubridate')
getODataResource 함수는 먼저 OData 리소스를 읽고 Httr 패키지를 사용하여 반환된 XML 문서를 구문 분석합니다. 다음으로 속성의 이름을 결정하고 값을 가져오고 값을 포함하는 데이터 프레임을 빌드합니다.
getODataResource <- function(resourcePath,domain,usr,pwd){
url <- paste(domain, resourcePath,sep="")
# get the OData resource
response <- GET(url,authenticate(usr,pwd))
# parse xml docucument
responseContent <- content(response,type="text/xml")
# determine the names of the attributes
xmlNames <- xpathSApply(responseContent,
'//ns:entry[1]//m:properties[1]/d:*',xmlName,
namespaces = c(ns = "https://www.w3.org/2005/Atom",
m="https://schemas.microsoft.com/ado/2007/08/dataservices/metadata",
d="https://schemas.microsoft.com/ado/2007/08/dataservices"))
# determine all attribute values
properties <- xpathSApply(responseContent,'//m:properties/d:*',xmlValue)
# cast the attributes values into a data frame
propertiesDF <-
as.data.frame(matrix(properties,ncol=length(xmlNames),byrow=TRUE))
# set the column names
names(propertiesDF) <- xmlNames
return(propertiesDF)
}
이것은 당신이 검색해야 할 기본 기능입니다 Mendix OData 리소스를 R로 변환합니다. 현재 형태에서는 중첩된 데이터를 처리하지 않으므로, 예를 들어 주문에 중첩된 주문 라인이 있는 주문입니다. 또한 OData 리소스에 포함된 데이터 유형 정보를 사용하지 않습니다. 대신, 아래에 설명된 대로 일부 R 표현식을 사용하여 데이터 유형을 수동으로 지정합니다.
사용 사례 예시
예 Mendix 애플리케이션에는 주문, 고객 및 주소에 대한 리소스가 있습니다. R에서 도시당 주문 수에 대한 개요를 만들 것입니다.
먼저, 우리는 OData 리소스에 연결하는 방법을 정의할 것입니다. Mendix 응용 프로그램.
domain <- "https://localhost:8080/"
username <- "demo_reporter"
password <- "goSfcsDj00"[/bash]
The following will load all the objects in the customers and address entities into R data frames.
[bash]customers <- getODataResource("odata/Orders/Customers()",domain,username,password)
addresses <- getODataResource("odata/Orders/Address()",domain,username,password)
주문의 경우 1년 2014월 XNUMX일 이후에 생성된 주문에만 관심이 있습니다. R에서 주문 날짜를 필터링할 수 있지만 OData 리소스 URL에 지정하면 해당 URL에서 쿼리하는 오버헤드를 피할 수 있습니다. Mendix 데이터베이스 및 모든 데이터 전송 Mendix 런타임에서 R로.
orders <- getODataResource(
"odata/Orders/Orders()/?$filter=OrderDate%20gt%20datetimeoffset'2014-01-01T00:00:00z'"
,domain,username,password)
데이터 프레임에는 다음이 모두 포함됩니다. Mendix 객체, OData 리소스를 통해 검색됨. 주문의 처음 5개 레코드는 다음과 같습니다.
orders[1:5,c("OrderNumber","Order_Customer","OrderDate")]
## OrderNumber Order_Customer OrderDate
## 1 1 2533274790395905 2015-01-18T10:32:00.000Z
## 2 2 2533274790395906 2014-01-30T07:01:00.000Z
## 3 3 2533274790395907 2014-04-16T13:15:00.000Z
## 4 4 2533274790395908 2014-09-19T07:52:00.000Z
## 5 5 2533274790395909 2015-01-14T07:28:00.000Z
이제 데이터가 있으니 올바른 데이터 유형을 사용해야 합니다. Mendix ID는 long을 사용하여 구현됩니다. MendixR에서는 double을 사용할 수 있습니다.
customers$DateOfBirth <- ymd_hms(customers$DateOfBirth)
customers$ID <- as.double(customers$ID)
customers$Billing_Address <- as.double(customers$Billing_Address)
customers$Delivery_Address <- as.double(customers$Delivery_Address)
addresses$ID <- as.double(addresses$ID)
orders$ID <- as.double(orders$ID)
orders$Order_Customer <- as.double(orders$Order_Customer)
# for easy access, create separate columns with date and date time
orders$OrderDateTime <- ymd_hms(orders$OrderDate)
orders$OrderDate <- ymd(format(ymd_hms(orders$OrderDate),"%Y-%m-%d"))
다음으로 dplyr 라이브러리를 사용하여 수신된 데이터를 조작합니다. Dplyr을 사용하면 데이터를 필터링하고, 새 열을 추가하고, 특정 열을 선택하고, 행을 정렬할 수 있습니다. 이는 일반 데이터베이스에서 SQL로 하는 것과 매우 유사합니다.
다음 dplyr 표현식은 customers, address, orders 데이터 프레임을 결합합니다.
customerOrders <- customers %>%
rename(CustomerID=ID) %>%
left_join(addresses, by=c("Delivery_Address"="ID")) %>%
select(CustomerID,Firstname,Lastname,City,Country) %>%
left_join(orders, by=c("CustomerID"="Order_Customer")) %>%
select(Firstname,Lastname,City,Country,OrderNumber)
이 데이터 프레임의 첫 번째 행은 다음과 같습니다.
customerOrders[1:5,]
## Firstname Lastname City Country OrderNumber
## 1 Ivan Freeman New Orleans US 1
## 2 Ivan Freeman New Orleans US 499
## 3 Anthony Robinson Brighton US 2
## 4 Anthony Robinson Brighton US 500
## 5 Kaden Griffith Bridgeport US 3
이제 우리는 다음과 같이 도시당 주문 수를 셀 수 있습니다.
cityOrderCount <- customerOrders %>%
group_by(City) %>%
summarize(OrderCount = n()) %>%
arrange(desc(OrderCount))
결과:
cityOrderCount[1:5,]
## Source: local data frame [5 x 2]
##
## City OrderCount
## 1 New York 28
## 2 Philadelphia 16
## 3 Chicago 15
## 4 Miami 12
## 5 Baltimore 10
그래프 만들기
다음 예는 ggplot2를 사용하여 그래프를 만듭니다. 그래프를 그리는 데 다른 라이브러리를 사용할 수도 있지만 ggplot2는 가장 인기 있는 라이브러리 중 하나입니다.
먼저, 월별 주문 건수를 나타내는 간단한 막대형 차트로 시작해 보겠습니다.
library('ggplot2')
# Determine first day of month for every order, count number of orders per month
orderCount <- orders %>%
# Determine date of first day of the month, so ggplot understands it's a date
mutate(OrderMonth = ymd(format(OrderDate,"%Y-%m-01"))) %>%
group_by(OrderMonth) %>%
summarize(noOfOrders = n())
# generate barchart to display number of orders per month
ggplot() +
geom_bar(data=orderCount,aes(x=OrderMonth,y=noOfOrders), stat="identity") +
xlab("Month") +
ylab("Number of orders") +
ggtitle("Orders per month")

다음으로 우리는 주중에 주문이 언제 이루어지는지 보는 데 관심이 있습니다. 먼저, 모든 주문에 대한 요일과 시간을 포함하는 데이터 세트가 필요합니다.
ordersPerWeekHour <- orders %>%
mutate(DayOfWeek = wday(OrderDate)) %>%
mutate(HourOfDay = hour(OrderDateTime)) %>%
group_by(DayOfWeek,HourOfDay) %>%
summarize(noOfOrders = n())
이제 실제 그래프의 경우 다음을 사용할 수 있습니다. 타일 평면 매일 매 시간 주문 수를 표시하려면 x축에 요일, y축에 시간을 두고 주문 수를 사용하여 표시되는 색상을 결정합니다.
ggplot(ordersPerWeekHour, aes(x=DayOfWeek,y=HourOfDay))+
geom_tile(aes(fill=noOfOrders)) +
scale_fill_gradient(low="green", high="red") +
scale_x_continuous(breaks=1:7,labels=c("Sun","Mon","Tues","Wed","Thurs","Fri","Sat")) +
scale_y_continuous(breaks=0:24) +
labs(x="Day", y="Hour")

이제 대부분의 주문이 주중 모든 요일에 균등하게 나뉘어 오후 16시부터 오후 00시 사이에 이루어진다는 것을 쉽게 알 수 있습니다.
R을 사용하여 보고서 생성
R에는 몇 가지 흥미로운 보고 기능이 있습니다. 사용 R마크다운R 보고서에서 바로 HTML, Word, PDF 또는 슬라이드를 생성할 수 있습니다.
이 블로그 게시물 전체는 실제로 rmarkdown을 사용하여 작성되었으며 MS-Word 문서를 생성했습니다. Word 문서를 내 최신 데이터로 업데이트하려면 Mendix 응용 프로그램을 만들려면 rmarkdown 스크립트를 다시 실행하기만 하면 됩니다.
Rmarkdown을 사용하는 가장 쉬운 방법은 RStudio의 내장 기능을 사용하는 것입니다. 또는 RStudio 없이 R 코드를 사용하여 Rmarkdown 보고서를 생성할 수 있습니다.
library(knitr) # required for knitting from rmd to md
require(rmarkdown) # required for md to html
setwd('<location of your rmarkdown file>')
render("<name of the rmarkdown script>", "all")
맺음말
OData 기능 Mendix 많은 가능성을 열어줍니다 Mendix 사용자. R은 통계 분석 및 데이터 보고를 위한 강력한 도구입니다. OData 사용 Mendix 이제 사용자는 이 모든 편의 혜택을 쉽게 누릴 수 있습니다.