在一个闪亮的应用程序中,我如何让用户选择文件名和目录来使用write.table下载

ltskdhd1  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(124)

这是this的后续问题
现在,我设法将React Dataframe 下载到我的硬盘驱动器(!不是服务器或工作目录),并将每个新条目作为新行附加write.table
有趣的是,write.csv不起作用,因为它不允许append参数https://stat.ethz.ch/pipermail/r-help/2016-August/441011.html
有了这个最小的工作应用程序,我想知道如何让用户选择一个目录和一个文件名下载到那里。现在我有了这个绝对路径:file = "C:/Users/yourname/Downloads/my_df.csv",这是工作。但我不知道它是否会为其他用户工作!

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  sidebarLayout(
    
    sidebarPanel(width = 4,
                 sliderInput("a", "A", min = 0, max = 3, value = 0, width = "250px"),
                 actionButton("submit", "Submit")
                 ),
    
    mainPanel(
      titlePanel("Sliders"),
      tableOutput("values")
    )
  )
)
server <- function(input, output, session) {
 
  sliderValues <- reactive({
    data.frame(Name = c("A"), Value = as.character(c(input$a)), stringsAsFactors = FALSE)
  })
  
  output$values <- renderTable({
    sliderValues()
  }) 
  
  # Save the values to a CSV file on the hard disk ----
  saveData <- reactive({write.table(sliderValues(), file = "C:/Users/yourname/Downloads/my_df.csv", col.names=!file.exists("C:/Users/yourname/Downloads/my_df.csv"), append = TRUE) })
  
  observeEvent(input$submit, {
    saveData()
  })
}
shinyApp(ui, server)

要求是用户应该看到一个模式对话框ui与问题“在哪个文件夹与哪个文件名你想下载?”准像我们每天做的事情,如果我们从互联网上下载。

q8l4jmvw

q8l4jmvw1#

我现在这样解决它:
我意识到我有两个选择:
1.根据@Stéphane Laurent使用downloadhandler的建议
1.使用DT::datatable()
我已经决定使用2号。非常感谢你们所有的投入!

library(shiny)
library(shinyWidgets)
library(DT)

ui <- fluidPage(
  sliderInput("a", "A", min = 0, max = 3, value = 0, width = "250px"),
  titlePanel("Sliders"),
  dataTableOutput("sliderValues", width="450px")
)
server <- function(input, output, session) {
  
  sliderValues <- reactive({
    df <- data.frame(
      Name = "A", 
      Value = as.character(c(input$a)), 
      stringsAsFactors = FALSE) %>% 
      pivot_wider(names_from = Name, values_from = Value)
    
    return(df)
  })

  
  # Show the values in an HTML table in a wider format----
  output$sliderValues <- DT::renderDataTable({
    DT::datatable(sliderValues(),
                  extensions = c('Buttons'),
                  options = list(
                    dom = 'frtBip',
                    buttons = list(list(extend = 'excel', filename = paste0("myname-", Sys.Date())))
                  )
    )
  })

}
shinyApp(ui, server)

相关问题