Tải lên tệp văn bản (server)
Sau khi người dùng chọn một tệp, tệp đó sẽ được tải lên máy tính đang chạy ứng dụng Shiny và trở nên khả dụng trong server.
Nếu ID của input tệp là "myfile", bạn có thể nghĩ input$myfile sẽ cho phép truy cập tệp đã tải lên, nhưng file input không hoạt động như vậy. input$myfile sẽ trả về một data.frame chứa một vài siêu dữ liệu về tệp đã chọn, trong đó phần chính bạn cần quan tâm là datapath. Giả sử ID của file input là "myfile", thì input$myfile$datapath sẽ là đường dẫn nơi tệp được lưu.
Sau khi lấy được đường dẫn của tệp đã tải lên (ví dụ C:\Users\Dean\AppData\Local\Temp\path\to\file.txt), bạn có thể dùng đường dẫn này để đọc tệp theo cách bạn cần. Bạn có thể dùng read.csv() nếu tệp tải lên là tệp CSV, hoặc readLines() nếu bạn chỉ muốn đọc toàn bộ các dòng trong tệp, hoặc bất kỳ hàm nào khác chấp nhận đường dẫn tệp.
Bài tập này là một phần của khóa học
Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R
Hướng dẫn bài tập
Nhiệm vụ của bạn là dùng văn bản từ tệp đã tải lên làm nguồn dữ liệu cho word cloud. Cụ thể:
- Định nghĩa một biến reactive tên
input_fileđể chứa văn bản từ tệp đã tải lên (dòng 19).- Sử dụng đường dẫn của tệp đã tải lên, đọc văn bản trong tệp bằng hàm
readLines()(dòng 24).
- Sử dụng đường dẫn của tệp đã tải lên, đọc văn bản trong tệp bằng hàm
- Dùng biến reactive
input_file()làm tham sốdatacủa hàm tạo word cloud (dòng 29).
Để kiểm tra việc tải tệp, bạn có thể tạo bất kỳ tệp văn bản nào trên máy và tải lên ứng dụng. Hoặc, bạn có thể dùng tệp này (lưu lại dưới dạng tệp văn bản trên máy) để kiểm thử chức năng word cloud với văn bản từ bài diễn văn I Have a Dream của Martin Luther King Jr.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
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)