Я хотел бы иметь возможность загрузить набор данных, выбрать набор столбцов, преобразовать выбранные столбцы (т.е. применить функцию), а затем загрузить измененный файл. Я пытался сделать это с помощью следующего кода:
library(shiny)
library(DT)
library(shinyWidgets)
library(plyr)
library(dplyr)
library(RecordLinkage)
library(readxl)
cleanup <- function(x){
x <- as.character(x) # convert to character
x <- tolower(x) # make all lowercase
x <- trimws(x, "both") # trim white space
return(x)
}
ui <- fluidPage(
h2("Record Linkage Data"),
fileInput("file1", "Upload file for cleaning", accept = c("xls", "csv"), multiple = F),
actionButton(inputId = "clean", label = "Clean Data"),
downloadButton("download1", "Download file1"),
pickerInput(width = "75%",
inputId = "pick_col1",
label = "Select columns to display",
choices = colnames(file1),
selected = colnames(file1),
options = list(
`actions-box` = T,
`selected-text-format` = paste("count > ", length(colnames(file1)) - 1),
`count-selected-text` = "Alle",
liveSearch = T,
liveSearchPlaceholder = T
),
multiple = T),
DT::dataTableOutput("mytable")
)
load_path <- function(path) {
req(input$file)
ext <- tools::file_ext(path)
if (ext == "csv"){
read.csv(path, header = T)
} else if (ext == "xls" || ext == "xlsx"){
read_excel(path)
} else{
stop("Unknown extension: '.", ext, "'")
}
}
server <- function(input, output, session){
file1 <- reactive(load_path(input$selection$datapath[[1]]))
#file2 <- reactive(load_path(input$selection$datapath[[2]]))
eventReactive(input$clean, {
output$mytable <- DT::renderDataTable({
data.frame(lapply(select(file1, input$pick_col1), cleanup))
})
})
output$download <- downloadhandler(
filename = function(){
paste0(tools::file_path_sans_ext(input$filename), ".csv")
},
content = function(file){
write.csv(data(), file)
}
)
}
shinyApp(ui, server)
Когда я запускаю вышеуказанный код, я получаю сообщение об ошибке: Error in is.data.frame(x) : object 'file1' not found
. Я не уверен, почему это так, но я изо всех сил пытался понять, как называть вещи в shiny
. Например: я хочу загрузить file1
, а затем преобразовать его. Продолжаю ли я ссылаться на file1
, когда хочу его скачать? Это может показаться глупым вопросом, но я спрашиваю, потому что я не знаю, и я пытаюсь учиться. Кажется, есть много разных подходов.
Я хотел бы: 1. Загрузить файл 2. Выбрать столбцы (pickerInput
- это то, что я пробовал, но selectInput
было бы достаточно, я полагаю) 3 с помощью кнопки действия применить предварительно заданную функцию к выбранным столбцам 4. загрузить преобразованный набор данных в виде .csv