我希望能够上传数据集,选择一组列,转换选定的列(即应用函数(,然后下载修改后的文件。 我一直在尝试使用以下代码来执行此操作:
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
我遇到了一些问题
- 这是一个非常愚蠢的问题(它发生在我们所有人身上(。你应该写
downloadHandler
而不是downloadhandler
。 - 主要问题:选取器输入正在尝试选择数据框的列名,
file1
如果它不存在。当您运行应用程序时,代码会尝试查找file1
数据框并查看其列名称,但由于当时您尚未上传任何内容,因此会引发错误。 - 关于如何读取文件:我不熟悉您如何读取文件,我建议您执行与此示例中类似的操作。 https://shiny.rstudio.com/gallery/file-upload.html。请注意,您需要使用
read.*
函数并将结果指向另一个名称,df
示例中所示。
我将如何解决它: 1.默认情况下,将choices
和selected
选项设置为NULL。类似以下内容的内容应该有效:
pickerInput(width = "75%",
inputId = "pick_col1",
label = "Select columns to display",
choices = NULL,
selected = NULL,
options = list(
`actions-box` = T,
# `selected-text-format` = paste("count > ", length(colnames(file1)) - 1),
`count-selected-text` = "Alle",
liveSearch = T,
liveSearchPlaceholder = T
),
multiple = T)
- 在
observeEvent
的服务器端添加一个updatePickerInput
。这样的事情应该有效。
observeEvent(input$file1, {
req(input$file1) # ensure the value is available before proceeding
df <- read.csv(input$file1$datapath)
updatePickerInput(session = session,
inputId = "pick_col1",
choices = colnames(df),
# ... other options)
})
如果代码还有其他问题,我还没有看太多。 我建议您从共享链接中的示例开始,然后开始修改它,直到获得所需的内容。
如果这不起作用,请告诉我,我可以尝试弄清楚
祝你好运!