สำหรับผู้ที่สนใจจะพัฒนาเว็บและแอปใน R ด้วย Shiny ครับ เนื้อหาที่ผมสอนใน workshop ซึ่งเป็นภาษาไทย ได้ถูกเผยแพร่ไว้ที่นี่ Shiny เบื้องต้น (ammnet-thailand.github.io) ครับ
Tag: Shiny
Kung package แพ็คเกจกุ้ง
แพ็คเกจกุ้งเป็นแพ็คเกจภาษา R ที่ผมเขียนขึ้นมาสำหรับใช้สร้าง Shiny App สำหรับโค้ดของโมเดลที่สร้างจากสมการอนุพันธ์หรือ ODE ที่ใช้ตัว solver จากแพ็คเกจที่ชื่อ deSolve ครับ
ไอเดียก็มีเพียงว่าจากสมการ ode ที่สร้างขึ้นมาด้วยถ้าตัวแปรในสมการมีการเปลี่ยนแปลงค่า ผลลัพท์ที่ออกมามันจะเปลี่ยนแปลงไปอย่างไร การเขียนใน R นั้นเราก็อาจจะใช้คำสั่ง manipulate มาช่วยได้แต่มันก็ยังมีข้อจำกัดเรื่องจำนวนของตัวแปรที่สามารถเรียกมาใช้ได้ เพราะมันขึ้นอยู่กับขนาดหน้าจอของตัว plot ผมเลยคิดว่าถ้าใช้ shiny มันน่าจะดูดีกว่าและสามารถใส่ตัวแปรได้มากกว่า ขึ้นกับการออกแบบ ui แต่การเขียน shiny ก็ไม่ใช่ว่าจะง่ายสำหรับคนเริ่มเรียนรู้ R ผมเลยคิดว่าน่าจะเขียนแพ็คเกจที่สามารถช่วยเรื่องนี้ได้
แพ็คเกจที่เขียนก็พยายามทำให้มันใช้ง่ายมากที่สุดจาก code ที่มีอยู่แล้ว โดยผู้ใช้เพิ่มคำสั่งไม่มากก็สามารถที่จะสร้าง shiny application ได้แล้ว ตัวอย่างเช่น ถ้าผู้ใช้มี code อยู่แล้วตามนี้ ซึ่งมันจะคำนวณและ plot กราฟให้ตามค่าของตัวแปรพารามิเตอร์ที่กำหนดไว้ เช่น gamma = 0.14286 และ beta = 0.6
library(deSolve) init <- c(S = 1-1e-6, I = 1e-6, R= 0.0) times <- seq(0, 70, by = 1) sir <-function(time, state, parameters) { with(as.list(c(state, parameters)), { dS <- -beta*S*I dI <- beta*S*I - gamma*I dR <- gamma*I return(list(c(dS, dI, dR))) }) } parameters <- c( gamma = 0.14286, beta = 0.6 ) out <- as.data.frame(ode(y = init, times = times, func = sir, parms = parameters)) matplot(times, out[,c("S","I","R")], type = "l", xlab = "Time", ylab = "Susceptibles and Recovereds", main = "SIR Model", lwd = 1, lty = 1, bty = "l", col = 2:4) legend(40, 0.7, c("Susceptibles", "Infecteds", "Recovereds"), pch = 1, col = 2:4)
ถ้าผู้ใช้ต้องการดูว่ากราฟจะเปลี่ยนแปลงอย่างไรถ้าตัวแปร gamma หรือ beta มีการเปลี่ยน ก็เพียงเพิ่ม code ลงไปในส่วนต่างๆ ตามนี้
!Start library(deSolve) init <- c(S = 1-1e-6, I = 1e-6, R= 0.0) times <- seq(0, 70, by = 1) sir <-function(time, state, parameters) { with(as.list(c(state, parameters)), { dS <- -beta*S*I dI <- beta*S*I - gamma*I dR <- gamma*I return(list(c(dS, dI, dR))) }) } !Parameters parameters <- c( gamma = 0.14286, beta = 0.6 ) !ODECMD out <- as.data.frame(ode(y = init, times = times, func = sir, parms = parameters)) !PostProcess !Plots matplot(times, out[,c("S","I","R")], type = "l", xlab = "Time", ylab = "Susceptibles and Recovereds", main = "SIR Model", lwd = 1, lty = 1, bty = "l", col = 2:4) legend(40, 0.7, c("Susceptibles", "Infecteds", "Recovereds"), pch = 1, col = 2:4) !Controls sliderInput("beta","beta", min = 0,max = 10,step = 0.001,value = 1.4), sliderInput("gamma","gamma", min = 0,max = 1,step = 0.001,value = 0.14) !End
จะเห็นว่ามี keywords ที่เพิ่มเข้าไปดังนี้
!Start – เป็นตัวบอกเริ่มต้น เราสามารถบอกรายละเอียดของตัวแปรอย่าง เวลา และค่าเริ่มต้นของ state หรือ compartment ต่างๆและ function ของระบบสมการหลักที่จะแก้ด้วย deSolve::ode ใน keywords นี้ได้เลยครับ
!Parameters – เป็นตัวแปร parameters ของโมเดล ode ครับ ซึ่งต้องกำหนดเป็น vector ตามตัวอย่างนี้เลยครับ
!ODECMD – สำหรับคำสั่งที่ต้องใช้คำสั่ง ode จาก deSolve ครับ สำหรับตอนนี้ต้องให้ตัวแปร output ชื่อ out นะครับ
!PostProcess – ถ้ามีการคำนวณค่าอะไรบางอย่างจาก out ก็ให้ใส่ใน keyword นี้ได้เลยครับ
!Controls – สำหรับใส่ sliders ของตัวแปรที่สนใจครับ
!End – สำหรับบอกว่าจบแล้ว 🙂
โดยหลังจากที่ใส่ keywords และsave เป็นไฟล์ใหม่แล้ว เช่นชื่อ mysystem.R เราสามารถสร้าง shiny app ได้ด้วยการรันคำสั่งนี้ครับ
runSystem(‘mysystem.R’)
ผลที่ได้ก็จะประมาณนี้ครับ

ถ้าสนใจอยากใช้งานก็ทำการติดตั้งได้โดยพิมพ์
devtools::install_github('slphyx/Kung')
ดูเพิ่มเติมที่ https://github.com/slphyx/Kung
Microsoft Edge เปิด localhost ไม่ได้
พอดีว่าต้องแก้งานที่ใช้ Shiny บางอย่างในเครื่องของที่ทำงานและทดลองใช้กับ MS Edge เพื่อเปิดงานจาก localhost:127.0.0.1 แล้วปรากฏว่ามันเปิดไม่ได้ บอกว่า “Hmmm…can’t reach this page” แต่พอทดลองเปิดกับ Chrome แล้วใช้ได้ วิธีที่ผมแก้ปัญหาคือ เปิด command prompt (cmd) มาแล้วพิมพ์คำสั่งนี้ลงไปครับ
CheckNetIsolation LoopbackExempt -a -n=Microsoft.MicrosoftEdge_8wekyb3d8bbwe
เพื่อให้ Edge มัน loopback กลับมาที่ localhost ครับ
หรือไม่ก็พิมพ์ “about:flags” ในช่อง url ของ MS Edge แล้ว tick ที่ ช่อง Allow localhost loopback ครับ
ตัวอย่างการใช้ Shiny กับ Maemod
มีคนถามมาว่าช่วยทำตัวอย่างการใช้ Shiny กับแพ็คเกจ maemod ให้ดูหน่อย
ผมทำเป็นตัวอย่างง่ายๆให้ดูแล้วครับที่ https://github.com/slphyx/maemod/tree/master/inst/examples/shiny
อยากทดลองเล่นก็ลง maemod ก่อนหลังจากนั้นก็โหลดตัวอย่างไฟล์ที่ให้ไว้ใน link ทั้งสามไฟล์ โดยเก็บไว้ที่เดียวกัน จากนั้นก็เปิดไฟล์ ui.R หรือ server.R ใน rstudio แล้วก็ click ที่ปุ่ม Run App ได้เลยครับ
หลักการก็มีว่า สร้างตัว function ที่ส่งผ่านค่า parameters ครอบ maemod.ode อีกทีครับ จากนั้นก็เรียก function นี้จากในตัว server.R แล้วส่ง ค่าparameters แบบ reactive กลับเข้าไปที่ function ดูตัวอย่างจากในไฟล์ที่ทำเป็นตัวอย่างครับ
ส่งผ่านค่าจาก 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