เริ่มต้นใช้งานเริ่มต้นใช้งานได้ฟรี

อัปโหลดไฟล์ข้อความ (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)
แก้ไขและรันโค้ด