如何在没有用户交互的情况下更新R Shiny中与`fileInput`变量相关的文件?

时间:2016-04-05 11:05:34

标签: r file shiny shinydashboard

我正在使用R中的应用,用户需要使用 RShiny fileInput按钮从计算机中选择文件。我想修改它,以便程序可以自动分配关联变量(即文件可以加载),而无需用户点击按钮并选择文件。

我面临的问题是fileInput有4个字段,其中我只能知道3.例如,当我在变量hello.csv中加载文件inFile时通过正常的程序,这是我得到的:

inFile$name = hello.csv
inFile$size = 8320
inFile$type = text/csv
inFile$datapath = C:\\Users\\MyName\\AppData\\Local\\Temp\\Rtmpkh8Zcb/7d5f0ff0111d440c7a66b656/0

虽然我猜错了第二个和第三个知道文件的人,但我不知道如何分配datapath字段......

我试图将inFile声明为NULL全局变量,然后逐个分配不同的字段,但我坚持使用最后一个。还有其他方法可以做,比如模仿用户点击文件输入按钮并选择指定文件的行为的函数吗?

非常感谢你。

2 个答案:

答案 0 :(得分:5)

如果您要做的就是最初加载文件,则不必依赖Shiny函数来执行此操作。你可以依靠R函数。像这样设置你的应用程序:

ui <- shinyUI(
  fileInput("inFile", label="Choose a file", multiple=F)
)

server <- shinyServer(function(input, output, session) {
  values <- reactiveValues()

  dat <- reactive({
    if (is.null(inFile$datapath)) {
      dat <- read.csv("path/to/your.csv")
      values$file_name = "your.csv"
      values$file_type = "csv"
      values$file_size = file.size("path/to/your.csv")
      values$file_path = "path/to/your.csv"
    } else {
      dat <- read.csv(inFile$datapath)
      values$file_name = inFile$name
      values$file_size = inFile$size
      values$file_type = inFile$type
      values$file_path = inFile$datapath
    }
  })
})

shinyApp(ui=ui, server=server)

在上面的代码中,Shiny应用程序将启动并看到inFile$datapathNULL并将加载您选择的预定义文件。它会在inFile更改后再次运行,此时它将加载用户指向的文件。

希望有所帮助。

更新

我更改了上面的代码,使用reactiveValues来存储整个应用中需要使用的信息。如果您只是设置了这些内容,然后对input$inFile$datapath执行查找/替换并将其替换为values$file_path,那么您的代码应该可以正常运行。

答案 1 :(得分:1)

以下是我弄清楚的方法:

我编辑了原始代码,因此所有read.csv(...)都替换为对data.frame全局变量的调用。我还添加了一个小按钮,您需要在继续之前单击该按钮。此按钮可以保存刚刚加载到数据库中的内容(如果选择了带有fileInput的文件),并将正确的值分配给以下操作所需的全局变量。如果您根本没有选择任何文件,它将直接从数据库中找到的数据中分配变量。

所以我没有找到问题的正确解决方案,但这是一种解决方法,可以完成我的工作。

@brittenb我无法让你的被动解决方案按照我的意愿工作,这就是为什么我最后这样做的原因。感谢您花时间考虑它。

我仍然愿意接受有关如何在没有用户互动的情况下更新fileInput文件的建议。