@MrGumble 在他的 cmets 中是正确的。这些文件需要在阅读之前下载。 drop_dir() 函数列出了保管箱服务器上的文件路径,我们只能读取本地保存到我们机器的数据。如果您有 .csv 文件,则可以使用 drop_read_csv() 函数一步完成。但是由于您有 excel 文件,因此需要首先使用drop_download() 显式下载这些文件,然后使用read_excel() 读取。
library(rdrop2)
library(tidyverse)
library(readxl)
#install.packages("xlsx")
library(xlsx)
token <- drop_auth()
#make a few excel file with iris dataset, save locally, and upload to dropbox root
iris_filenames <- paste0("iris", 1:3, ".xlsx")
walk(iris_filenames, ~write.xlsx(iris, file = .x, row.names = FALSE))
walk(iris_filenames, drop_upload)
#list all files on dropbox root and filter for only iris ones
iris_files_on_dropbox <- drop_dir(dtoken = token) %>%
filter(str_detect(name, 'iris'))
#make new filenames so we can see that the download worked correctly
#you could do overwrite = TRUE and not pass through new filenames
#see ?drop_download for all options
new_iris_filenames <- paste0("iris", 1:3, "-from-dropbox.xlsx")
#download the files first
walk2(iris_files_on_dropbox$name, new_iris_filenames, ~drop_download(path = .x, local_path = .y))
#then read them all in
df <- bind_rows(map(new_iris_filenames, read_xlsx))
此外,我们可以创建自己的自定义函数来完成下载和读取,就像drop_read_csv() 通过更改此函数的源代码所做的那样。我们需要做的就是将read...() 函数从read.csv 更改为read_excel,并将dtoken 默认get_drop_token() 的引用更改为rdrop2:::get_drop_token(),这是rdrop2 包中未导出的函数,因此我们需要三个': ::'。
#source for drop_read_csv we can rewrite for excel files
# drop_read_csv <- function(file, dest = tempdir(), dtoken = get_dropbox_token(), ...) {
# localfile = paste0(dest, "/", basename(file))
# drop_download(file, localfile, overwrite = TRUE, dtoken = dtoken)
# utils::read.csv(localfile, ...)
# }
drop_read_excel <- function(file, dest = tempdir(), dtoken = rdrop2:::get_dropbox_token(), ...) {
localfile = paste0(dest, "/", basename(file))
drop_download(file, localfile, overwrite = TRUE, dtoken = dtoken)
readxl::read_excel(localfile, ...)
}
df2 <- bind_rows(map(iris_files_on_dropbox$name, drop_read_excel))
要在闪亮的应用程序中工作,我们首先需要保存drop_auth 令牌,以便我们可以在使用闪亮的应用程序时进行身份验证。将其保存到闪亮的应用目录中。
saveRDS(token, file = "token.rds")
现在这是一个闪亮的应用程序。单击“开始”按钮时,将下载 iris excel 文件并显示在 UI 中。我们需要在全局环境或 global.R 中调用 drop_auth() 以及自定义的 drop_read_excel() 函数才能使用它。
library(shiny)
library(rdrop2)
library(tidyverse)
#saveRDS(token, file = "token.rds") into shiny app directory
#authenticate in global.R or outside of ui/server
drop_auth(rdstoken = "token.rds")
drop_read_excel <- function(file, dest = tempdir(), dtoken = rdrop2:::get_dropbox_token(), ...) {
localfile = paste0(dest, "/", basename(file))
drop_download(file, localfile, overwrite = TRUE, dtoken = dtoken)
readxl::read_excel(localfile, ...)
}
ui <- fluidPage(
actionButton("go", "go"),
tableOutput("table")
)
server <- function(input, output, session) {
df <- eventReactive(input$go, {
withProgress(message = 'Downloading from dropbox',
detail = 'This may take a while...', value = 0.5, {
iris_files_on_dropbox <- drop_dir() %>%
filter(str_detect(name, 'iris'))
setProgress(value = 0.75)
df <- bind_rows(map(iris_files_on_dropbox$name, drop_read_excel))
setProgress(value = 1)
})
return(df)
})
output$table <- renderTable({
df()
})
}
shinyApp(ui, server)