Подтвердить что ты не робот

Сделать conditionalPanel зависимым от файлов, загруженных с помощью fileInput

Итак, я пытаюсь сделать блестящее приложение, где у меня есть кнопка, которая отображается только в том случае, если файлы были загружены; для этого им используется условная панель.

ui.R:

require(shiny)
shinyUI(pageWithSidebar(
  headerPanel("My App"),

  sidebarPanel(
    fileInput("files", "Choose file"),
    conditionalPanel(
      condition = "input.files",
      actionButton("submitFiles", "Submit files for processing"))),

  mainPanel(h3("Nothing to see here"))
))

Я не думаю, что на моем сервере что-то нужно заботиться. R, поскольку приведенный выше пример ничего не делает. При вышеуказанном условии кнопка никогда не появляется, т.е. Условие никогда не является истинным.

Некоторые вещи, которые я пробовал для моего условия, это input.files.length > 0, input.files.size() > 0, оба из которых приводят к тому, что кнопка присутствует, прежде чем я загружу файл. Я предполагаю, что это потому, что входные файлы $являются пустым файлом data.frame перед выбором файлов и поэтому имеют ненулевую длину/размер, верно?

Какое условие я могу использовать, чтобы скрыть кнопку, пока не будет загружен хотя бы один файл?

Я думаю, что другой вариант заключается в замене conditionalPanel на uiOutput и вызове renderUI({actionButton(...)}) внутри блока наблюдения/изоляции на сервере .R, который просматривает input.files(if (nrow(input$files) < 1) return()); это единственный способ? Если я могу сделать это в любом случае, что бы заставить меня выбрать один или другой (за пределами conditionalPanel, что приводит к меньшему количеству кода)?

4b9b3361

Ответ 1

Вы должны сделать реактивный выход, возвращающий статус загрузки, и установите для параметра suspendWhenHidden этого вывода значение FALSE.

Точнее, в server.R вы наверняка имеете реактивную функцию, скажем getData(), чтобы сделать фрейм данных из загруженного файла. Затем сделайте следующее:

  getData <- reactive({
    if(is.null(input$files)) return(NULL)
    ......
  })
  output$fileUploaded <- reactive({
    return(!is.null(getData()))
  })
  outputOptions(output, 'fileUploaded', suspendWhenHidden=FALSE)

И в ui.R вы можете использовать conditionalPanel(), выполнив:

conditionalPanel("output.fileUploaded",
   ......