อัปโหลดไฟล์ข้อความ (server)
เมื่อผู้ใช้เลือกไฟล์แล้ว ไฟล์นั้นจะถูกอัปโหลดไปยังคอมพิวเตอร์ที่รัน Shiny app และจะพร้อมใช้งานในฝั่ง server
หาก input ID ของ file input คือ "myfile" คุณอาจคาดว่า input$myfile จะให้เข้าถึงไฟล์ที่อัปโหลดได้โดยตรง แต่ในความเป็นจริง file input ทำงานต่างออกไป input$myfile จะคืนค่าเป็น data.frame ที่บรรจุข้อมูล metadata บางส่วนของไฟล์ที่เลือก โดยฟิลด์ที่สำคัญที่สุดคือ datapath ซึ่งหาก ID ของ file input คือ "myfile" ค่า input$myfile$datapath จะเป็นพาธของไฟล์ที่อัปโหลดขึ้นมา
เมื่อได้พาธของไฟล์แล้ว (เช่น C:\Users\Dean\AppData\Local\Temp\path\to\file.txt) ก็สามารถนำพาธนั้นไปอ่านไฟล์ด้วยฟังก์ชันที่เหมาะสม ไม่ว่าจะเป็น read.csv() สำหรับไฟล์ CSV, readLines() สำหรับการอ่านทุกบรรทัดในไฟล์, หรือฟังก์ชันอื่นใดที่รับพาธของไฟล์เป็นอาร์กิวเมนต์
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
กรณีศึกษา: การสร้างเว็บแอปพลิเคชันด้วย Shiny ใน R
คำแนะนำการฝึกหัด
โจทย์ในแบบฝึกหัดนี้คือนำข้อความจากไฟล์ที่อัปโหลดมาใช้เป็นแหล่งข้อมูลสำหรับ word cloud โดยเฉพาะ:
- กำหนดตัวแปร reactive ชื่อ
input_fileเพื่อเก็บข้อความจากไฟล์ที่อัปโหลด (บรรทัด 19)- ใช้พาธของไฟล์ที่อัปโหลด แล้วอ่านข้อความในไฟล์ด้วยฟังก์ชัน
readLines()(บรรทัด 24)
- ใช้พาธของไฟล์ที่อัปโหลด แล้วอ่านข้อความในไฟล์ด้วยฟังก์ชัน
- ใช้ตัวแปร reactive
input_file()เป็นพารามิเตอร์dataของฟังก์ชัน word cloud (บรรทัด 29)
หากต้องการทดสอบการอัปโหลดไฟล์ สามารถสร้างไฟล์ข้อความใดก็ได้บนคอมพิวเตอร์แล้วอัปโหลดเข้า app หรือจะใช้ไฟล์นี้ (บันทึกเป็นไฟล์ข้อความบนคอมพิวเตอร์ก่อน) เพื่อทดสอบฟังก์ชัน word cloud กับข้อความจากสุนทรพจน์ I Have a Dream ของ Martin Luther King Jr. ก็ได้
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
ui <- fluidPage(
h1("Word Cloud"),
sidebarLayout(
sidebarPanel(
textAreaInput("text", "Enter text", rows = 7),
fileInput("file", "Select a file"),
numericInput("num", "Maximum number of words",
value = 100, min = 5),
colourInput("col", "Background color", value = "white")
),
mainPanel(
wordcloud2Output("cloud")
)
)
)
server <- function(input, output) {
# Define a reactive variable named `input_file`
input_file <- ___({
if (is.null(input$file)) {
return("")
}
# Read the text in the uploaded file
readLines(input$___$datapath)
})
output$cloud <- renderWordcloud2({
# Use the reactive variable as the word cloud data source
create_wordcloud(data = ___(), num_words = input$num,
background = input$col)
})
}
shinyApp(ui = ui, server = server)