ใช้งาน mono+rdotnet บน Rocks cluster

ตัวอย่างการใช้งาน mono + Rdotnet บนระบบ Rocks cluster ครับ

เวอร์ชั่น Rocks cluster ที่ผมใช้คือ 6.2 ครับ การติดตั้งก็แบบเดิมๆเลยตามที่อธิบายในเอกสารบนเวบของ Rocks เลย ไม่มีอะไรพิเศษ จากนั้นก็ผมก็ yum ติดตั้ง mono จาก https://copr.fedorainfracloud.org/coprs/tpokorra/mono-opt/  โดยในเวอร์ชั่นนี้ mono จะถูกติดตั้งไว้ที่ /opt/mono และก็ yum ติดตั้ง R ซึ่ง R จะถูกติดตั้งไว้ที่ /usr/lib64/R ของ head node ครับ

หลังจากที่ติดตั้ง mono และ R เรียบร้อยแล้วก็เอา code ของ C# ที่เขียนสำหรับเรียกใช้งาน rdotnet บวกกับก็อปปี้ไฟล์แอสเซมบลีของ Rdotnet ต่างๆมาไว้ใน folder ที่ต้องการก่อนทำการคอมไพล์ครับ โดยไฟล์ต่างๆของ Rdotnet ก็มีอย่างเช่น DynamicInterop.dll, RDotNet.dll, RDotNet.NativeLibrary.dll

ก่อนคอมไพล์หรือเรียกใช้งาน mono เราก็ต้องโหลดenviroment ต่างๆของ mono ก่อน โดยการพิมพ์

$ . /opt/mono/env.sh

ซึ่งมันก็คือเซ็ตpath ต่างๆของตัวแปรอย่าง LD_LIBRARY_PATH กับ PKG_CONFIG_PATH ครับ

export PATH=/opt/mono/bin:$PATH
export LD_LIBRARY_PATH=/opt/mono/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/opt/mono/lib/pkgconfig:$PKG_CONFIG_PATH

จากนั้นก็ export ค่า R_HOME ไปยัง path ของ R ที่ติดตั้งแล้ว

$ export R_HOME = “/usr/lib64/R”

อันนี้เป็นตัวอย่าง code ที่ผมก็อปปี้มาจากเวบของ RDotnet ครับ สำหรับเรียก R มาเพื่อทำ t-test ของเลข 2 ชุดครับ

#testRDotNet.cs
using System;
using System.Linq;
using RDotNet;

namespace Sample1
{
 class Program
 {
 static void Main(string[] args)
 {
 REngine.SetEnvironmentVariables();
 REngine engine = REngine.GetInstance();
 // REngine requires explicit initialization.
 // You can set some parameters.
 engine.Initialize();

// .NET Framework array to R vector.
 NumericVector group1 = engine.CreateNumericVector(new double[] { 30.02, 29.99, 30.11, 29.97, 30.01, 29.99 });
 engine.SetSymbol("group1", group1);
 // Direct parsing from R script.
 NumericVector group2 = engine.Evaluate("group2 <- c(29.89, 29.93, 29.72, 29.98, 30.02, 29.98)").AsNumeric();

// Test difference of mean and get the P-value.
 GenericVector testResult = engine.Evaluate("t.test(group1, group2)").AsList();
 double p = testResult["p.value"].AsNumeric().First();

Console.WriteLine("Group1: [{0}]", string.Join(", ", group1));
 Console.WriteLine("Group2: [{0}]", string.Join(", ", group2));
 Console.WriteLine("P-value = {0:0.000}", p);

// you should always dispose of the REngine properly.
 // After disposing of the engine, you cannot reinitialize nor reuse it
 engine.Dispose();

}
 }
}

เวลาคอมไพล์ก็เพียงพิมพ์

$ mcs /reference:RDotNet.dll /reference:RDotNet.NativeLibrary.dll /reference:DynamicInterop.dll testRDotNet.cs

ซึ่งคำสั่ง mcs นี้จะแปลงไฟล์ .cs ของเราให้เป็น binary ไฟล์ที่คอมพิวเตอร์จะเข้าใจได้ 🙂 ครับ ซึ่งในที่นี้มันจะสร้างไฟล์ชื่อ testRDotNet.exe ให้ครับ ส่วนoption ของคำสั่ง /reference เป็นการบอกว่าเราเรียกใช้ namespace จากไฟล์แอสเซมบลี่อะไรบ้าง

วิธีการรันไฟล์ exe ที่ได้จาก mcs ก็เพียงพิมพ์ mono แล้วตามด้วยไฟล์ exe ครับ เช่น

$ mono testRDotNet.exe

Welch Two Sample t-test

data: group1 and group2
t = 1.959, df = 7.0306, p-value = 0.09077
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.01956909 0.20956909
sample estimates:
mean of x mean of y
 30.015 29.920

Group1: [30.02, 29.99, 30.11, 29.97, 30.01, 29.99]
Group2: [29.89, 29.93, 29.72, 29.98, 30.02, 29.98]
P-value = 0.091