R 패키지와 RDotNet 과 연동하는 예제
■ R 패키지의 S4 클래스파일
## '---------------------------------------------------------------------------
#' Creater
#'
#' \code{dataSource} Hadling Data read from Files
#' @name dataSource-class
#' @rdname dataSource-class
#' @exportClass dataSource
setClass("dataSource",
slots = c(Files = "data.frame"),
# Set the default values for the slots. (optional)
#prototype=list(
# Files
#),
# Make a function that can test to see if the data is consistent.
# This is not called if you have an initialize function defined!
validity=function(object)
{
return(TRUE)
}
)
## '---------------------------------------------------------------------------
#' Method loadData.
#' @name DataSource.loadData
#' @rdname loadData-methods
#' @exportMethod DataSource.loadData
## removeGeneric("DataSource.loadData")
setGeneric(name="DataSource.loadData",
def=function(.DataSource)
{
standardGeneric("DataSource.loadData")
}
)
#' @rdname loadData-methods
#' @aliases loadData,DataSource-method
setMethod(f="DataSource.loadData",
signature="dataSource",
definition=function(.DataSource)
{
.DataSource@Files <- data.frame(
rbind(c("a", "b", "b"),
c("aa", "bb", "bc")
),
stringsAsFactors = F
)
colnames(.DataSource@Files) <- c("GOAL", "FILE_NAME", "LOCATION")
return(.DataSource)
}
)
## '---------------------------------------------------------------------------
#' Method loadData2.
#' @name DataSource2.loadData
#' @rdname loadData2-methods
#' @exportMethod DataSource.loadData2
## removeGeneric("DataSource.loadData")
setGeneric(name="DataSource.loadData2",
def=function(.DataSource)
{
standardGeneric("DataSource.loadData2")
}
)
#' @rdname loadData2-methods
#' @aliases loadData2,DataSource-method
setMethod(f="DataSource.loadData2",
signature="dataSource",
definition=function(.DataSource)
{
df <- data.frame(
rbind(c("a", "b", "b"),
c("aa", "bb", "bc")
),
stringsAsFactors = F
)
colnames(df) <- c("GOAL", "FILE_NAME", "LOCATION")
return(df)
}
)
■ C#의 호출 클래스
public class TatPackage
{
static TatPackage instance;
private TatPackage()
{
R.I.RConnector.Instance.Engine.Evaluate("library(eqp.tat)");
}
static public TatPackage Instance
{
get
{
return instance ?? (instance = new TatPackage());
}
}
public REngine Engine
{
get { return R.I.RConnector.Instance.Engine; }
}
}
public class TatDataSource
{
static int tatDataSourceId = 0;
TatPackage tatPackage;
String objName = String.Empty;
public TatDataSource()
{
int id = ++TatDataSource.tatDataSourceId;
//tatPackage = TatPackage.Instance;
objName = String.Format("DataSource{0:D2}", id);
Engine.Evaluate(String.Format("{0} <- tryNew('dataSource')", objName));
SymbolicExpression symbol = Engine.GetSymbol(objName);
}
REngine Engine
{
get { return tatPackage.Engine; }
}
public void GetFilesInfo()
{
Engine.Evaluate(
String.Format("{0} <- eqp.tat::DataSource.loadData({0})",
objName));
DataFrame df = Engine.Evaluate(
String.Format("{0}@Files", objName)
).AsDataFrame();
}
public void GetFilesInfo2()
{
Engine.Evaluate(
String.Format("df <- eqp.tat::DataSource.loadData2({0})",
objName));
DataFrame df = Engine.Evaluate("df").AsDataFrame();
}
}
■ C#의 호출 클래스
패키지 로드 구문:
C# 에서 원하는 R 버전이 올라왔는지 확인 필요
- R.I.RConnector.Instance.Engine.Evaluate("library(eqp.tat)");
C# 에서 원하는 R 버전이 올라왔는지 확인 필요
- Environment.GetEnvironmentVariable("PATH");
- Environment.GetEnvironmentVariable("R_HOME");
댓글 없음:
댓글 쓰기