Загрузка файла с вводом имени файла в приложение Shiny - PullRequest
0 голосов
/ 19 декабря 2018

Моя цель - сделать загрузку реагирующей на изменения в текстовом поле имени файла.При использовании следующего решения имя загруженного файла не меняется с первого ввода имени файла.

Пример:

library("shiny")


ui <- fluidPage(
  fluidRow(
    column(1, offset=1,
           downloadButton(outputId="save",
                          label="Save")
    ),
    column(2, offset=1,
           textInput(inputId="name",
                     label="Filename:")
    )
  )
)

server <- function(input, output, session) {


  observe({

    data <- data.frame(x=1:50, y=rnorm(50))

    serverDownloadCSV <- function(name, data) {

      dl <- downloadHandler(
        filename=function() {
          if (name == "") {
            paste("Untitled", "csv", sep=".")
          } else {
            paste(name, "csv", sep=".")
          }
        },
        content = function(file) {
          write.table(data, file, row.names=FALSE, append=TRUE, sep=",")
        }
      )

      return(dl)
    }

    output$save <- serverDownloadCSV(name=input$name, data=data)

  })
}

runApp(appDir=list(ui=ui, server=server), launch.browser=TRUE)

Однако, если у меня нет downloadHandler в качестве отдельной функциино в следующем виде:

output$save <- downloadHandler(
      filename=function() {
        if (input$name == "") {
          paste("Untitled", "csv", sep=".")
        } else {
          paste(input$name, "csv", sep=".")
        }
      },
      content = function(file) {
        write.table(data(), file, row.names=FALSE, append=TRUE, sep=",")
      }
    )

, тогда он работает как задумано.Что мне нужно сделать, чтобы сохранить отдельную функцию?

1 Ответ

0 голосов
/ 19 декабря 2018

Позвоните на input$name в начале вашего observe.Это должно сработать, хотя append=TRUE не будет работать, так как он всегда будет создавать новый файл, а не добавляться к существующему CSV-файлу.

Вот новый server.R код:

server <- function(input, output, session) {
  observe({
    input$name
    data <- data.frame(x=1:50, y=rnorm(50))

    serverDownloadCSV <- function(name, data) {
      downloadHandler(
        filename=function() {
          if (name == "") {
            paste("Untitled", "csv", sep=".")
          } else {
            paste(name, "csv", sep=".")
          }
        },
        content = function(file) {
          write.table(data, file, row.names=FALSE, append=TRUE, sep=",")
        }
      )
    }

    output$save <- serverDownloadCSV(name=input$name, data=data)
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...