R Shiny - Динамическая метка FileInput - PullRequest
0 голосов
/ 30 августа 2018

Я создаю приложение, в котором мне нужно иметь опцию загрузки одного файла против загрузки двух файлов. Я выполнил загрузку одного или двух файлов с использованием условной панели, но я не могу изменить метку FileInput. Это то, что мне нужно 1) Когда пользователь нажимает на один файл. Должен быть только один FileInput с меткой «Выбрать консолидированный файл» 2) Когда пользователь нажимает на отдельные файлы. Должно быть 2 FileInputs с метками «Выберите тестовый файл» и «Выбрать контрольный файл»

Ниже приведен рабочий код библиотека (блестящий)

ui<-shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      radioButtons("p", "separate input files or consolidated?",
                   list("Single file"='a', "Separate files"='b'))
    ),
    mainPanel(
        fileInput("file1","Choose first file",
                  accept = c(
                    "text/csv",
                    "text/comma-separated-values,text/plain",
                    ".csv","sas7bdat")
        ),
        conditionalPanel(
          condition = "output.dual",
          fileInput("file2", "Choose second file",
                    accept = c(
                      "text/csv",
                      "text/comma-separated-values,text/plain",
                      ".csv","sas7bdat")
          )
        ),
        conditionalPanel(
          condition = "output.dual",
          checkboxInput('headercheckbox', 
                        "Files have different headers?", 
                        value = FALSE
          )
        )### bracket close of conditional panel
    )
  )
))

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

  output$dual <- reactive({ input$p == 'b' })
  outputOptions(output, 'dual', suspendWhenHidden = FALSE)


})

shinyApp(ui,server)

Дайте мне знать, если кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Я думаю, что если вы позволите панелям определять условия на основе пользовательского ввода, вы можете получить желаемую функциональность:

ui<-shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      radioButtons("p", "separate input files or consolidated?",
                   list("Single file"='a', "Separate files"='b'))
    ),
    mainPanel(
      conditionalPanel(
        condition ="output.dual == 'a' " ,
        fileInput("file1","Choose Consolodated file",
                  accept = c(
                    "text/csv",
                    "text/comma-separated-values,text/plain",
                    ".csv","sas7bdat")
        )
      ),
      conditionalPanel(
        condition ="output.dual == 'b' " ,
        fileInput("file1","Choose Test file",
                  accept = c(
                    "text/csv",
                    "text/comma-separated-values,text/plain",
                    ".csv","sas7bdat")
        )
      ),
      conditionalPanel(
        condition = "output.dual == 'b'",
        fileInput("file2", "Choose control file",
                  accept = c(
                    "text/csv",
                    "text/comma-separated-values,text/plain",
                    ".csv","sas7bdat")
        )
      ),
      conditionalPanel(
        condition = "output.dual == 'b'",
        checkboxInput('headercheckbox', 
                      "Files have different headers?", 
                      value = FALSE
        )
      )### bracket close of conditional panel
    )
  )
))

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

  output$dual <- reactive({ input$p  })
  outputOptions(output, 'dual', suspendWhenHidden = FALSE)


})

shinyApp(ui,server)
0 голосов
/ 30 августа 2018

Я рекомендую использовать для этого uiOutput и renderUI. Если вы хотите узнать больше об этих функциях, блестящие справочные материалы довольно хороши. https://shiny.rstudio.com/reference/shiny/latest/renderUI.html

ui<-shinyUI(
  fluidPage(
    sidebarLayout(
      sidebarPanel(
        radioButtons("p", "separate input files or consolidated?",
                     list("Single file"='a', "Separate files"='b'))
      ),
      mainPanel(
        uiOutput('file_area_1'),
        uiOutput('file_area_2'),
        uiOutput('diff_headers')
        )### bracket close of conditional panel
      )
    )
)

server<-shinyServer(function(input, output) {
  output$dual <- reactive({ input$p == 'b' })
  outputOptions(output, 'dual', suspendWhenHidden = FALSE)
  output$file_area_1 <- renderUI({
    message = 'Choose consolidated file'
    if(input$p == 'b'){
      message = 'Choose test file'
    }else{
      mesage = ''
    }
    fileInput("file1",message,
              accept = c(
                "text/csv",
                "text/comma-separated-values,text/plain",
                ".csv","sas7bdat")
    )
  })
  output$file_area_2 <- renderUI({
    if(input$p == 'b'){
      fileInput("file2","Choose control file",
                accept = c(
                  "text/csv",
                  "text/comma-separated-values,text/plain",
                  ".csv","sas7bdat")
      ) 
    }
  })
  output$diff_headers <- renderUI({
    if(input$p == 'b'){
        checkboxInput('headercheckbox', 
                      "Files have different headers?", 
                      value = FALSE
        )
      }
  })
})

shinyApp(ui,server)
...