基于this answer,我能够为您的问题创建一个解决方法。
正如我在上面的评论中指出的那样,无法使用操作按钮更新fileInput 的原因显然是fileInput 在临时目录中创建了一个临时文件,Input$file$datapth 链接到这个临时目录文件。因此,您可以根据需要随时使用操作按钮重新加载文件,对原始文件的更改将不会反映,因为链接指向临时文件。我真的不知道为什么 inputFile 可以处理临时文件,但是使用 shinyFiles 包,您可以构建一个解决方法。您有一个按钮可以获取文件的真实链接并加载数据,另一个按钮可以重新加载数据。按下加载按钮将重新加载原始数据,并反映对它的所有更改。
library(shiny)
library(shinyFiles)
ui <- fluidPage(
shinyFilesButton("GetFile", "Choose a file" ,
title = "Please select a file:", multiple = FALSE,
buttonType = "default", class = NULL),
actionButton(inputId = "reload", label = "Reload data"),
tableOutput("test")
)
server <- function(input,output,session){
volumes <- getVolumes()
v = reactiveValues(path = NULL)
observe({
shinyFileChoose(input, "GetFile", roots = volumes, session = session)
if (!is.null(input$GetFile)) {
file_selected <- parseFilePaths(volumes, input$GetFile)
v$path <- as.character(file_selected$datapath)
req(v$path)
v$data <- read.csv(v$path)
}
})
observeEvent(input$reload, {
req(v$path)
v$data <- read.csv(v$path)
})
output$test <- renderTable({
print(v$path)
if (is.null(v$data)) return()
v$data
})
}
shinyApp(ui = ui, server = server)
更新
也可以将此方法与reactiveFileReader 结合使用,请参见下面的示例:
library(shiny)
library(shinyFiles)
ui <- fluidPage(
shinyFilesButton("GetFile", "Choose a file" ,
title = "Please select a file:", multiple = FALSE,
buttonType = "default", class = NULL),
tableOutput("test")
)
server <- function(input,output,session){
volumes <- getVolumes()
v = reactiveValues(path = NULL)
observe({
shinyFileChoose(input, "GetFile", roots = volumes, session = session)
req(input$GetFile)
file_selected <- parseFilePaths(volumes, input$GetFile)
v$path <- as.character(file_selected$datapath)
req(v$path)
v$data <- reactiveFileReader(1000, session, filePath = v$path, readFun = read.csv, sep = ";")
})
output$test <- renderTable({
print(v$path)
req(v$data)
v$data()
})
}
shinyApp(ui = ui, server = server)