导航栏上的倍数fileInput

时间:2019-02-02 02:47:39

标签: r shiny

我有一个带有navbarPage的代码,用户可以选择他想要的测试,然后上传文件,选择选项并下载结果。

我的问题:如何组织代码以了解用户选择了哪个测试?是否按照他的要求继续执行我的代码?

当我只有一个fileInput时,我的代码正常运行,但是当我添加第二个fileInput时,停止在mainPage上以表格形式显示我的数据,而我的downloadButton变得发疯了。

我的代码:

ui <- navbarPage(title = "DadosFacil", fluid = TRUE, theme = shinytheme("cosmo"),

           #---- TABA DE NORMALIDADE       
           tabPanel("Normalidade", id = "NormalTab",
                    sidebarLayout(
                      sidebarPanel( 
                        helper("",
                               colour = "black",
                               type = "inline",
                               title = "Upload do arquivo",
                               size = "s",
                               content = "Selecione apenas um arquivo em documento de texto (.txt), para mais informacoes sobre como organizar seu arquivo acesse nosso faq."),

                        fileInput("file1", "Escolha seus dados em .txt", #Ill only accept .txt files
                                  accept =".txt"),


                        helper("",
                               colour = "black",
                               type = "inline",
                               title = "Ajuda",
                               size = "s",
                               content = "Marque se seu arquivo possui os nomes das variaveis na primeira linha"),

                        checkboxInput("header", "Header",value = TRUE),

                        helper("",
                               colour = "black",
                               type = "inline",
                               title = "Separador Decimal",
                               size = "s",
                               content = "Selecione como voce separou seus numeros no seu arquivo, comumente no Brasil se utiliza a virgula, nos outros paises o ponto. Note que caso selecione errado, obtera um erro."),

                        radioButtons("decimal", "Ponto ou Virgula: ",
                                     choices = c(Virgula = ",", Ponto = "."),
                                     selected = ","),

                        tags$hr(), #Linha horizontal

                        downloadButton("downloadData", "Download")
                        ),
                      mainPanel(
                        dataTableOutput("Previa")
                      )
                    )
                   ),

           #---ABA DA ANOVA
           navbarMenu("ANOVA",

             #---DELINEAMENTO INTEIRAMEINTE CASUALIZADO      
             tabPanel("DIC", id = "DicTab",
                      sidebarLayout(
                        sidebarPanel(
                          helper("",
                                 colour = "black",
                                 type = "inline",
                                 title = "Upload do arquivo",
                                 size = "s",
                                 content = "Selecione apenas um arquivo em documento de texto (.txt), para mais informacoes sobre como organizar seu arquivo acesse nosso faq."),

                          fileInput("file2", "Escolha seus dados em .txt -> DIC", #Ill only accept .txt files
                                    accept =".txt"),


                          helper("",
                                 colour = "black",
                                 type = "inline",
                                 title = "Ajuda",
                                 size = "s",
                                 content = "Marque se seu arquivo possui os nomes das variaveis na primeira linha"),

                          checkboxInput("header", "Header",value = TRUE),

                          helper("",
                                 colour = "black",
                                 type = "inline",
                                 title = "Separador Decimal",
                                 size = "s",
                                 content = "Selecione como voce separou seus numeros no seu arquivo, comumente no Brasil se utiliza a virgula, nos outros paises o ponto. Note que caso selecione errado, obtera um erro."),

                          radioButtons("decimal", "Ponto ou Virgula: ",
                                       choices = c(Virgula = ",", Ponto = "."),
                                       selected = ","),

                          tags$hr(), #Linha horizontal

                          downloadButton("downloadData", "Download")
                        ),
                        mainPanel(
                          dataTableOutput("Previa")
                      )
                      )
             ),

             tabPanel("DBC",
                      sidebarLayout(
                        sidebarPanel(

                        ),
                        mainPanel(

                        )
                      )
             ),

             tabPanel("DQL",
                      sidebarLayout(
                        sidebarPanel(

                        ),
                        mainPanel(

                        )
                      )

             )

           )
)

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

  observe_helpers()

  datasetInputNormal <-reactive({
    req(input$file1)

    tryCatch({
      df <- read.table(input$file1$datapath,
                       header = input$header,
                       sep = "\t",
                       dec = input$decimal)
    },
    error = function(e){
      #Retorna error se der algum problema
      stop(safeError(e))
    })

    return(df)

  })

  datasetInputDic <-reactive({
    req(input$file2)

    tryCatch({
      df <- read.table(input$file2$datapath,
                       header = input$header,
                       sep = "\t",
                       dec = input$decimal)
    },
    error = function(e){
      #Retorna error se der algum problema
      stop(safeError(e))
    })

    return(df)

  })

  output$Previa <- DT::renderDataTable(DT::datatable(datasetInput()))

  output$NormalidadeDownload <- downloadHandler(
    filename = function(){
      paste("Resul_",input$file1$name, sep = "")
    },
    content = function(file){
      if(input$id == "NormalTab"){
        writeLines(VariosNormal(datasetInputNormal()), con = file, sep = "" ) #Call my function VariosNormal()
      } else if(input$id == "DicTab"){
        writeLines(Teste_DIC(datasetInputDic()), con = file, sep = "" ) #Call my function Teste_DIC()
      }

    }
  )
}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:0)

我终于想出了解决方法。阅读此问题:R Shiny fileInput multiple filetypes。我注意到不能有两个具有相同ID的输出,所以我为具有不同ID的所有内容创建了另一个输出并正常工作! 但是我的问题是:有什么办法可以解决这个问题?因为在我的应用程序中,我将有20多个标签,每个标签都有自己的os按钮,唯一的方法是拥有像这样的大量代码?

我的代码已修复:

ui <- navbarPage(title = "DadosFacil", fluid = TRUE, theme = shinytheme("cosmo"),

           #---- TABA DE NORMALIDADE       
           tabPanel("Normalidade", id = "NormalTab",
                    sidebarLayout(
                      sidebarPanel( 
                        helper("",
                               colour = "black",
                               type = "inline",
                               title = "Upload do arquivo",
                               size = "s",
                               content = "Selecione apenas um arquivo em documento de texto (.txt), para mais informacoes sobre como organizar seu arquivo acesse nosso faq."),

                        fileInput("fileNormal", "Escolha seus dados em .txt", #Ill only accept .txt files
                                  accept =".txt"),


                        helper("",
                               colour = "black",
                               type = "inline",
                               title = "Ajuda",
                               size = "s",
                               content = "Marque se seu arquivo possui os nomes das variaveis na primeira linha"),

                        checkboxInput("headerNormal", "Header",value = TRUE),

                        helper("",
                               colour = "black",
                               type = "inline",
                               title = "Separador Decimal",
                               size = "s",
                               content = "Selecione como voce separou seus numeros no seu arquivo, comumente no Brasil se utiliza a virgula, nos outros paises o ponto. Note que caso selecione errado, obtera um erro."),

                        radioButtons("decimalNormal", "Ponto ou Virgula: ",
                                     choices = c(Virgula = ",", Ponto = "."),
                                     selected = ","),

                        tags$hr(), #Linha horizontal

                        downloadButton("downloadNormal", "Download")
                        ),
                      mainPanel(
                        dataTableOutput("PreviaNormal")
                      )
                    )
                   ),

           #---ABA DA ANOVA
           navbarMenu("ANOVA",

             #---DELINEAMENTO INTEIRAMEINTE CASUALIZADO      
             tabPanel("DIC", id = "DicTab",
                      sidebarLayout(
                        sidebarPanel(
                          helper("",
                                 colour = "black",
                                 type = "inline",
                                 title = "Upload do arquivo",
                                 size = "s",
                                 content = "Selecione apenas um arquivo em documento de texto (.txt), para mais informacoes sobre como organizar seu arquivo acesse nosso faq."),

                          fileInput("fileDic", "Escolha seus dados em .txt -> DIC", #Ill only accept .txt files
                                    accept =".txt"),


                          helper("",
                                 colour = "black",
                                 type = "inline",
                                 title = "Ajuda",
                                 size = "s",
                                 content = "Marque se seu arquivo possui os nomes das variaveis na primeira linha"),

                          checkboxInput("headerDic", "Header",value = TRUE),

                          helper("",
                                 colour = "black",
                                 type = "inline",
                                 title = "Separador Decimal",
                                 size = "s",
                                 content = "Selecione como voce separou seus numeros no seu arquivo, comumente no Brasil se utiliza a virgula, nos outros paises o ponto. Note que caso selecione errado, obtera um erro."),

                          radioButtons("decimalDic", "Ponto ou Virgula: ",
                                       choices = c(Virgula = ",", Ponto = "."),
                                       selected = ","),

                          tags$hr(), #Linha horizontal

                          downloadButton("downloadDic", "Download")
                        ),
                        mainPanel(
                          dataTableOutput("PreviaDic")
                      )
                      )
             ),

             tabPanel("DBC",
                      sidebarLayout(
                        sidebarPanel(

                        ),
                        mainPanel(

                        )
                      )
             ),

             tabPanel("DQL",
                      sidebarLayout(
                        sidebarPanel(

                        ),
                        mainPanel(

                        )
                      )

             )

           )
)

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

  observe_helpers()

  #--- NORMAL TAB
  datasetInputNormal <-reactive({
    req(input$fileNormal)

    tryCatch({
      df <- read.table(input$fileNormal$datapath,
                       header = input$headerNormal,
                       sep = "\t",
                       dec = input$decimalNormal)
    },
    error = function(e){
      #Retorna error se der algum problema
      stop(safeError(e))
    })

    return(df)

  })


  output$PreviaNormal <- DT::renderDataTable(DT::datatable(datasetInputNormal()))

  output$downloadNormal <- downloadHandler(
    filename = function(){
      paste("Resul_Normal",input$fileNormal$name, sep = "")
    },
    content = function(file){
      writeLines(VariosNormal(datasetInputNormal()), con = file, sep = "" ) #Call my function VariosNormal()

    }
  )

  #---DIC TAB

  datasetInputDic <-reactive({
    req(input$fileDic)

    tryCatch({
      df <- read.table(input$fileDic$datapath,
                       header = input$headerDic,
                       sep = "\t",
                       dec = input$decimalDic)
    },
    error = function(e){
      #Retorna error se der algum problema
      stop(safeError(e))
    })

    return(df)

  })

  output$PreviaDic <- DT::renderDataTable(DT::datatable(datasetInputDic()))

  output$downloadDic <- downloadHandler(
    filename = function(){
      paste("Resul_Dic",input$fileDic$name, sep = "")
    },
    content = function(file){
      writeLines(Teste_DIC(datasetInputDic()), con = file, sep = "" ) #Call my function Teste_Dic

    }
  )

}

shinyApp(ui, server)