แสดง output จาก ggplot ใน Mathematica

ลองดูตัวอย่างที่ผมเขียนนี้ครับ  ไอเดียก็คือว่าให้มันเขียนภาพเป็นไฟล์ pdf ด้วยคำสั่ง ggsave แล้วเรียกกลับมาใน Mathematica ด้วย Import  โค้ดที่เขียนนี้ดัดแปลงมาจาก https://mathematica.stackexchange.com/questions/16726/how-to-get-a-plot-generated-by-r-returned-in-an-output-cell

(* using R that already installed on the computer *)
R363 = "C:\\Data-Work\\Programs\\R-3.6.3\\App\\R-Portable";
InstallR["RHomeLocation" -> R363, "RVersion" -> "3.6.3", 
 "NativeLibLocation" -> 
  "C:\\Data-Work\\Programs\\R-3.6.3\\App\\R-Portable\\library\\rJava\\\
jri\\x64"]

REvaluate["
 library(ggplot2)
 "]
(* export ggplot as pdf file *)
Wrapper = RFunction["function(filename,plotfun){
   ggsave(filename, plot=plotfun(), width=6, height=4, \
device=cairo_pdf)
   }"];

(* generate the plot as pdf and import back to show in Mathematica *)


Getggplot[plotFun_] := Module[{tempfile, rcode, runcode},
   tempfile = FileNameJoin[{$TemporaryDirectory, "temp.pdf"}];
   If[FileExistsQ[tempfile], Quiet@DeleteFile[tempfile]];
   rcode = "ADA <- ggplotcmd;";
   runcode = StringReplace[rcode, {"ggplotcmd" -> plotFun}];
   Wrapper[tempfile, RFunction["function()" <> "{" <> runcode <> "}"]];
   If[! FileExistsQ[tempfile], Return[$Failed]];
   Import[tempfile] // First
   ];

RDotNet 1.7 ใช้งานได้กับ R.3.3-4 เท่านั้น

ผมเขียนโปรแกรมเล็กๆที่เรียกใช้งาน RDotNet ไว้หลายตัว ซึ่งมันก็ทำให้สะดวกมากๆในการที่จะเรียก R มาใช้งานใน C# ซึ่งก่อนหน้านี้จะใช้งานกับ R ที่ค่อนข้างเก่าหน่อยพวก R 3.3-4 แต่พอมี library บางตัวที่บังคับให้ต้อง upgrade ตัว R ไป version ที่สูงขึ้นอย่าง 3.5 นี้ทำให้โปรแกรมที่เขียนหลายตัวมันมีปัญหาทันที เหตุผลก็เพราะมัน GetInstance() ไม่ได้ มีการพูดถึงปัญหานี้ที่ https://github.com/jmp75/rdotnet/issues/70 ตอนนี้ที่ทำได้ก็คือถ้า library ที่อยากใช้นั้นถ้าไม่ได้ใช้ features ที่มันมีมาใหม่นั้นจริงๆก็ต้องใช้ R ตัวเก่าไปก่อน

 

RcppGSL บน Windows 10

ใครที่จะใช้ RcppGSL บน Windows 10 อาจจะมีเรื่องที่ต้องทำความเข้าใจหน่อยนะครับ มีคนถามผมมาว่ามันเซ็ตอย่างไร เพราะลองเอา code ตัวอย่าง มาใช้แล้วก็ยังไม่ผ่านสักที และดูเหมือนว่าคนถามผมเองยังสับสนและไม่เข้าอยู่เล็กน้อย  เล่าคร่าวๆ ก่อนนะครับ เจ้า GSL หรือ GNU Scientific library เนี้ยเป็นlibraryที่รวบรวมคำสั่งหรือ functions ที่ใช้กันมากในวงการคณิตศาสตร์และฟิสิกส์ มันถูกเขียนขึ้นด้วยภาษา C โดยกลุ่มนักฟิสิกส์และแจกจ่ายให้ใช้กันได้ฟรีครับ

ที่นี่มันก็มีคนอยากใช้งานจาก GSL นี้ใน R ก็เลยมีคนเขียน package ขึ้นมากันหลายตัว และ  RcppGSL ก็เป็นหนึ่งในนั้น เจ้า RcppGSL นี้ถ้าเราจะใช้มันเนี้ย เราต้องมี GSL ติดตั้งให้เรียบร้อยก่อน (เดี๋ยวบอกอีกทีว่าทำอย่างไรครับ) โดยที่เราจะต้องเซ็ตพารามิเตอร์สำหรับ Windows ที่ชื่อว่า LIB_GSL ไปยัง path ของ GSL ที่ติดตั้งไว้ครับ

อย่างเช่นผมติดตั้งไว้ที่ D:\Data-Work\Programs\gsl\gsl_2.5 ผมก็เพียงเพิ่มเข้าใน environment variables ตามนี้ครับ สังเกตุว่ามันมี “” ด้วยนะครับ

จากนั้นก็เปิด R หรือ RStudio แล้วลองใช้คำสั่ง Rcpp::sournceCpp กับไฟล์ที่ต้องการอีกที่นะครับ

อีกเรื่องที่อาจต้องเพิ่มเข้าไปใช้ code คือบรรทัดนี้ครับ

// [[Rcpp::depends(RcppGSL)]]

 

Rcpp::sourceCpp กับปัญหา -Wunused-variable

ใครที่ใช้ sourceCpp สำหรับ compile โค้ดของ Rcpp แล้วเจอปัญหา unsed-variable แล้วอยากที่จะ  ignore มัน ก็สามารถทำได้ด้วยการสร้างไฟล์ Makevars ที่มีบรรทัดนี้ครับ

CXXFLAGS += -O3 -Wall -pipe -Wno-unused

หรือไม่ก็แก้ไขไฟล์ Makeconf ที่ R_HOME/bin/R_ARCH (ไม่ค่อยแนะนำ) โดยเพิ่ม -O3 -Wall -pipe -Wno-unused  ในส่วนของ CXXFLAGS  ครับ

 

 

ปัญหา unlock_solver จาก แพ็คเกจ deSolve

ถ้าใครที่เจอปัญหา unlock solver ตอนที่ใช้คำสั่งพวก ode solver จาก แพ็คเกจ deSolve เช่น

Error in .C(“unlock_solver”) :
“unlock_solver” not resolved from current namespace (deSolve)

 

ให้ลองแก้ปัญหาโดยโหลด deSolve ด้วยคำสั่งนี้แทนครับ

library.dynam.unload(“deSolve”, libpath=paste(.libPaths()[1], “//deSolve”, sep=””))
library.dynam(“deSolve”, package=”deSolve”, lib.loc=.libPaths()[1])

 

หรือไม่ก็ลองโหลด deSolve ก่อนที่จะเรียกใช้งานพวก shared library (.dll, .so) ครับ

 

 

 

%d bloggers like this: