Category: R

เอาสักดอกไหม

จาก http://www.sakngoi.com/2015/10/30/สมการดอกกุหลาบ/ library(misc3d) rose <- function(x,theta,axis) { phi <- (pi/2)*exp(-theta/(8*pi)) X <- 1-(1/2)*((5/4)*(1- ((3.6 * theta) %% (2*pi))/pi)^2-1/4)^2 y <- 1.95653* x*x * (1.27689 *x-1)^2 * sin(phi) r <- X*(x *sin(phi)+y*cos(phi)) out<-switch(axis, x={ r*sin(theta) }, y={ r*cos(theta) }, z={ (X*(x* cos(phi)-y* sin(phi))) } ) return(out) } parametric3d( fx = function(u,v) rose(u,v,axis="x"), fy = function(u,v) rose(u,v,axis="y"), fz

หา drive ของ USB drive

ทีมที่ต้องไปนำเสนองานเพื่อขอเงินล้านทีมหนึ่งต้องการใช้ Shiny ขอมาว่าให้ช่วยหน่อย โดยที่มีความต้องการว่าไม่ต้องการให้มีเซ็ตหรือเปิดอะไรยุ่งยากเพียงแค่ เสียบ USB drive ในเครื่องลูกค้าซึ่งเป็น Windows แล้ว double click อะไรก็แล้ว ให้ตัว Shiny app ก็เปิดขึ้นมาเลย ผมเลยบอกว่าได้ง่ายมาก เลี้ยงก๋วยเตี๋ยวผมก่อนชามหนึ่งเดี๋ยวเขียนscript ง่ายๆให้ เวลาใช้ก็เพียง double click ที่ icon ของ batch file นี้ วิธีที่ผมทำนั้นมันง่ายจริงๆครับ เพียงเขียน batch file หาว่า drive ที่เข้าเสียบนั้นอยู่ drive อะไรก่อน จากนั้นก็เพียง set ค่าพารามิเตอร์ที่ rstudio ต้องการใช้ในการหา R  และก็แก้ script นิดหน่อยให้ R มันโหลดตัว app เลย อันนี้เป็นตัวอย่างโค้ด batch file ที่ใช้หา

แบ่งคำ/ตัดคำ ภาษาไทยใน R ด้วย SWATH

โปรแกรมที่ช่วยในการแบ่งคำหรือตัดคำภาษาไทยที่น่าสนใจอีกตัวหนึ่งนอกเหนือจาก LexTo (http://www.sansarn.com/lexto/) ก็มี SWATH (https://linux.thai.net/projects/swath) ครับ SWATH มีความสามารถที่จะใช้ตัดคำภาษาไทยที่อยู่ในหลาย file format ครับไม่ว่าจะเป็น LaTex, HTML, RTF หรือ plain text  แต่การใช้งานต้องใช้ในแบบ command line ไม่มี GUI ครับ โดย swath จะมี options ต่างให้ เพื่อความสะดวกเอาไปใช้ใน R บน Windows ผมเลยเขียน packageเพื่อเรียกใช้งาน SWATH แบบง่ายๆไว้ที่ https://github.com/slphyx/RSwath หรือดูเพิ่มเติมที่ http://www.sakngoi.com/2018/01/23/rswath-the-r-interface-to-swath/ การใช้งานก็เริ่งจากติดตั้งจาก github ด้วยคำสั่ง library("devtools") install_github("slphyx/RSwath") จากนั้นก็เรียกใช้งาน library("RSwath") การใช้งานกับไฟล์ข้อความที่เป็นภาษาไทยที่ต้องการแบ่งสมมุติว่าชื่อ testTH.txt แล้วต้องการให้ไฟล์ที่แบ่งคำแล้วด้วย SWATH ชื่อ testTHX.txt ก็เพียงพิมพ์ rswath(inputfile="testTH.txt",outputfile="testTHX.txt")

RSwath: The R Interface to SWATH

RSwath: The R Interface to Swath ผมเอา SWATH (https://code.google.com/archive/p/swath/) มาทำเป็น r-package สำหรับใช้ใน R บน Windows ครับ ตอนนี้มันยังเป็นรุ่นเก่าอยู่ (swath 0.3.4) ครับ SWATH ก็เป็นตัวแบ่งคำภาษาไทยอีกตัวหนึ่งที่พัฒนาโดยท่าน Phaisarn Charoenpornsawat และ Theppitak Karoonboonyanan ครับ สนใจใช้งานก็ไปที่ https://github.com/slphyx/RSwath การใช้งานก็เริ่งจากติดตั้งจาก github ด้วยคำสั่ง library("devtools") install_github("slphyx/RSwath") จากนั้นก็เรียกใช้งาน library("RSwath") การใช้งานกับไฟล์ข้อความที่เป็นภาษาไทยที่ต้องการแบ่งสมมุติว่าชื่อ testTH.txt แล้วต้องการให้ไฟล์ที่แบ่งคำแล้วด้วย SWATH ชื่อ testTHX.txt ก็เพียงพิมพ์ rswath(inputfile="testTH.txt",outputfile="testTHX.txt") ตัวอย่างไฟล์ที่ใช้กับswathกับผลลัพธ์ที่ได้        

tidy data

ถ้าจะทำให้ชีวิตง่ายขึ้นในการใช้ ggplot2 ให้เปลี่ยนรูปแบบ data ที่ใช้เป็นแบบ tidy data ครับ เอามาจาก http://r4ds.had.co.nz/tidy-data.html หรืออ่านเพิ่มเติมได้จาก http://vita.had.co.nz/papers/tidy-data.html  

ดูการกระจายข่าวใน FB

นักการตลาดท่านหนึ่งอยากรู้ว่าข่าวประชาสัมพันธ์ที่ท่านช่วยอยู่มีการแชร์อย่างไรใน FB ผมเลยช่วยทำให้ดูแบบง่ายๆแต่ท่านต้องหาคนมาช่วยเก็บข้อมูลให้ ในตัวอย่างนี้ network ของกลุ่มเป้าหมายบน FB ถูกสร้างขึ้นมาจากนั้นก็ลองโพสท์ข่าวลงไป แล้วนับดูว่าแต่ล่ะชั่วโมงมีการแชร์หรือเห็นหรือLike รวมกันจำนวนเท่าใด     ซึ่งวิธีนี้เราสามารถทำโมเดลเพื่อตอบได้ว่าประเภทข่าวหรือรูปแบบนำเสนอแบบใดที่จะถูกแพร่กระจายได้มากกว่ากัน พร้อมกับรู้ด้วยว่าข่าวมันจะถึงจุดอิ่มตัวเมื่อใดซึ่งมันจะช่วยให้เราว่างแผนการโฆษณาได้ง่ายขึ้นครับ    

ทดลองใช้ C# กับงานวิจัย

ปกติผมจะใช้ Mathematica เป็นหลักในการทำงานโดยมากจะเป็นพวกแบบจำลองคณิตศาสตร์ที่ตองการเห็นว่าผลลัพธ์จะเปลี่ยนแปลงไปอย่างไรถ้าตัวแปรที่สนใจบางตัวมีการเปลี่ยนแปลง เพิ่มขึ้นหรือลดลง ซึ่งแน่นอนผมใช้พวกคำสั่ง Manipulate หรือ Dynamic เป็นหลัก แต่มาระยะหลังนี้เริ่มมีการใช้ R ในที่ทำงานกันเยอะ ผมเลยเขียนโมเดลของงานที่ทำใน R ไปพอสมควร แต่มันก็ติดปัญหาว่ามันช้ามากกับหลายโมเดลที่ทำอยู่ถึงแม้จะหันไปใช้ Rcpp แต่ก็รู้สึกว่าเสียเวลาเขียน wrapper functions ห่อพวกมันอีกทีใน R แถมเวลาส่งงานให้ Prof ทั้งหลายก็ติดเรื่อง compiler อีก แถมต้องมาเขียน shiny อีกดูวุ่นวายไปหมด สุดท้ายกลับมาตายรังที่ Mathematica เหมือนเดิม เขียนโมเดลเสร็จ อยากจะส่งให้ชาวบ้านดูก็ใช้เพียงแค่คำสั่ง Deploy ไปบนcloud เท่านั้นจบเลย …แต่มันก็แลกมาด้วยค่าใช้จ่ายพอสมควร ผมเลยหาทางเลือกอื่นๆที่มันประหยัดกับบางงานกับโมเดลที่ไม่ดูซับซ้อนและใช้เวลาทำไม่นาน หันซ้ายหันขวาก็มาจบที่ C# หลังจากดูแล้วก็มี library ที่พอช่วยงานได้อย่าง math.net แถม UI ก็ทำง่ายเพียงลากแปะเท่านั้น เลยทดลองใช้ดู ผลปรากฏว่าเป็นที่น่าพอใจ  ถึงจะดูยุ่งยากในส่วน UI แต่ก็รู้สึกว่าไม่ได้เลวร้ายอะไร ส่งงานก็ง่ายแถมก็ไม่ต้องติดตั้งอะไรให้ดูวุ่นวาย

เรียก Mathematica มาใช้ใน R

อยากใช้ Mathematica ใน R แต่ไม่มีใครเขียน package ไว้ผมก็เลยเขียนเองมันซะเลยเรียกมันว่า WolfinR เอาไว้ใช้ในกันภายในที่ทำงานครับ จริงอยู่อยู่ว่า Mathematica มีแพคเกจที่เรียกว่า RLink ครับแต่ก็อยากใช้มันจาก R ครับไม่มีอะไร  

ส่งผ่านค่าจาก url เข้ามาใน shiny app

ตัวอย่างรับค่าจาก url เข้ามาใช้ใน shiny app ครับ library(shiny) shinyApp( ui = fluidPage( textInput("text", "Text",""), textInput("text2", "Text2","") ), server = function(input, output, session) { observe({ query <- parseQueryString(session$clientData$url_search) if (!is.null(query[['text']])) { updateTextInput(session, "text", value = query[['text']]) } if (!is.null(query[['text2']])) { updateTextInput(session, "text2", value = query[['text2']]) } }) } ) ลองดูเพิ่มเติมที่ https://shiny.rstudio.com/articles/client-data.html

ใช้ .net ใน CRAN สำหรับ Windows

ใครที่อยากใช้โปรแกรมที่เขียนขึ้นเองในภาษาอื่นใน R package มันก็มีหลายวิธีครับขึ้นกับว่าเราจะเขียน wrap function มันอย่างไรแต่ถ้าคิดจะเอาไปไว้ CRAN ก็คงต้องคิดหนักหน่อยเพราะ CRAN เน้นว่าโปรแกรมอื่นที่เขียนจากภาษาอื่นมานั้นต้อง compile จาก source เท่านั้นเวลาที่มีการติดตั้ง และตัว CRAN หรือ R เองก็ไม่ค่อยถูกกับฝั่ง .net ด้วยสินั่นหมายความว่าต้องใช้ compiler อย่าง gnu gcc เท่านั้น แต่มันก็พอมีวิธีครับถ้าอยากจะเอาโปรแกรมที่เขียนหรือcompiled มาแล้วจาก .net มาใช้งาน พร้อมกับส่งไปที่ CRAN ได้และผมก็เห็นหลาย package ทำกันอย่างเช่น https://github.com/jeroen/curl/blob/7fd8d483e5a9d9fd4716d123a855cbb2e0c17b05/tools/winlibs.R # Build against static libraries from rwinlib if(!file.exists("../windows/libcurl-7.51.0/include/curl/curl.h")){ if(getRversion() < "3.3.0") setInternet2() download.file("https://github.com/rwinlib/libcurl/archive/v7.51.0.zip", "lib.zip", quiet = TRUE) dir.create("../windows", showWarnings = FALSE)