如何在没有用户交互的情况下更新与 R Shiny 中的“fileInput”变量相关的文件?
How to update the file related to a `fileInput` variable in R Shiny without user interaction?
我正在用 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
全局变量,然后将其一一分配给不同的字段,但我坚持使用最后一个。还有其他方法吗,比如模仿用户点击文件输入按钮并选择指定文件的行为的功能?
非常感谢。
如果您要做的只是最初加载文件,则不必依赖 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$datapath
是 NULL
并将加载您选择的预定义文件。它不会再次 运行 直到 inFile
更改,此时它将加载用户指向的文件。
希望对您有所帮助。
更新
我将上面的代码更改为使用 reactiveValues
来存储需要在整个应用程序中使用的信息片段。如果您只是设置这些然后为 input$inFile$datapath
执行 find/replace 并将其替换为 values$file_path
,您的代码应该可以正常工作。
我是这样想的:
我编辑了原始代码,因此所有 read.csv(...)
都被替换为对 data.frame
全局变量的调用。我还添加了一个小按钮,您需要在继续之前单击它。此按钮保存您刚刚加载到数据库中的内容(如果您选择带有 fileInput
的文件)并将正确的值分配给以下操作所需的全局变量。如果您根本不选择任何文件,它将直接从数据库中找到的数据分配变量。
所以我没有找到问题的合适解决方案,但这是一种解决方法,可以解决我的问题。
@brittenb 我无法让你的 reactive 解决方案按照我的意愿工作,这就是为什么我最终以另一种方式这样做的原因。感谢您花时间考虑它。
我仍然乐于接受有关如何在 fileInput
中更新文件而无需用户交互的建议。
我正在用 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
全局变量,然后将其一一分配给不同的字段,但我坚持使用最后一个。还有其他方法吗,比如模仿用户点击文件输入按钮并选择指定文件的行为的功能?
非常感谢。
如果您要做的只是最初加载文件,则不必依赖 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$datapath
是 NULL
并将加载您选择的预定义文件。它不会再次 运行 直到 inFile
更改,此时它将加载用户指向的文件。
希望对您有所帮助。
更新
我将上面的代码更改为使用 reactiveValues
来存储需要在整个应用程序中使用的信息片段。如果您只是设置这些然后为 input$inFile$datapath
执行 find/replace 并将其替换为 values$file_path
,您的代码应该可以正常工作。
我是这样想的:
我编辑了原始代码,因此所有 read.csv(...)
都被替换为对 data.frame
全局变量的调用。我还添加了一个小按钮,您需要在继续之前单击它。此按钮保存您刚刚加载到数据库中的内容(如果您选择带有 fileInput
的文件)并将正确的值分配给以下操作所需的全局变量。如果您根本不选择任何文件,它将直接从数据库中找到的数据分配变量。
所以我没有找到问题的合适解决方案,但这是一种解决方法,可以解决我的问题。
@brittenb 我无法让你的 reactive 解决方案按照我的意愿工作,这就是为什么我最终以另一种方式这样做的原因。感谢您花时间考虑它。
我仍然乐于接受有关如何在 fileInput
中更新文件而无需用户交互的建议。