【问题标题】:Using conditionalPanel() alongside fileInput() to input different file types based on radio buttons使用 conditionalPanel() 和 fileInput() 根据单选按钮输入不同的文件类型
【发布时间】:2021-08-11 02:01:15
【问题描述】:

我是 Shiny 的新手,希望上传不同的文件类型(xlsx、json、csv)来运行依赖于 UI 中的单选按钮的统计测试:我已经弄清楚了界面(我认为)但在moment 似乎只能使用 UI 中的 conditionalPanels 列表中的第一个选项上传文件(已尝试将它们随机播放,第一个选项始终有效,其余选项无效)。没有错误消息,只是不上传文件。

这是我的 ui.R 代码:

        sidebarPanel(
      
          radioButtons("test", "Test type",
                   choices = c(pre_cost = "Pre - cost based KMI",
                               pre_prop = "Pre - proportional KMI",
                               post_cost = "Post - cost based KMI",
                               post_prop = "Post - proportional KMI"),
                   selected = "Pre - cost based KMI"),
          
          # input fields change depending on test wanted
          conditionalPanel(
            condition = "input.test == 'Pre - cost based KMI'",
            textInput("sheet_name", "Sheet name", value = "", width = NULL, placeholder = "Sheet1"),
            textInput("uplifts", "Uplifts", value = "", width = NULL, placeholder = "0.01, 0.3, 0.01"),
            textInput("alphas", "Alphas", value = "", width = NULL, placeholder = "0.01, 0.2, 0.01")
            ,fileInput("file1", "Choose xlsx file",
                      # select just selected sheet
                      multiple = FALSE,
                      accept = c(".xlsx"))
          ),
          
          conditionalPanel(
            condition = "input.test == 'Pre - proportional KMI'",
            textInput("baseline_KPI", "Baseline KPI", value = "", width = NULL, placeholder = NULL),
            textInput("analysis_KPIs", "Analysis KPIs", value = "", width = NULL, placeholder = NULL)
            ,fileInput("file1", "Choose json file",
                      multiple = FALSE,
                      accept = c(".json"))
          ),
          
          conditionalPanel(
            condition = "input.test == 'Post - cost based KMI'",
            textInput("confidence_lvl", "Confidence level", value = "", width = NULL, placeholder = "0.95")
            ,fileInput("file1", "Choose csv file",
                      multiple = FALSE,
                      accept = c("text/csv",
                                 "text/comma-separated-values,text/plain",
                                 ".csv"))
          ),
          
          conditionalPanel(
            condition = "input.test == 'Post - proportional KMI'",
            textInput("column_name", "Column name", value = "", width = NULL, placeholder = 'impressions')
            ,fileInput("file1", "Choose csv file",
                      multiple = FALSE,
                      accept = c("text/csv",
                                 "text/comma-separated-values,text/plain",
                                 ".csv"))
          ),
        ),


以及相关的server.R代码:


  output$contents <- renderTable({
    file <- input$file1
    ext <- tools::file_ext(file$datapath)
    req(file)
    
    if (input$test == "Pre - cost based KMI") {
        validate(need(ext == "xlsx", "Please upload a xlsx file"))
        df <- read.xlsx(file$datapath, 1)
        output$message1 <- renderText({ "Loaded file"})
    }
    
    if (input$test == "Pre - proportional KMI") {
        validate(need(ext == "json", "Please upload a json file"))
        df <- read_json(file$datapath, simplifyVector = TRUE)
        output$message1 <- renderText({ "Loaded file"})
    }
    
    if (input$test == "Post - cost based KMI") {
        validate(need(ext == "csv", "Please upload a csv file"))
        df <- read.csv(file$datapath, header = input$header)
        output$message1 <- renderText({ "Loaded file"})
    }
    
    if (input$test == "Post - proportional KMI") {
        validate(need(ext == "csv", "Please upload a csv file"))
        df <- read.csv(file$datapath, header = input$header)
        output$message1 <- renderText({ "Loaded file"})
    }
    
    if(input$disp == "head") { # disp is an input field head or all for displaying the table
      return(head(df))
    }
    else {
      return(df)
    }
    
  })
  

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    输入唯一 ID 后,它就可以正常工作了。试试这个

    ui <- fluidPage(
      sidebarLayout(
        sidebarPanel(
          
          radioButtons("test", "Test type",
                       choices = c(pre_cost = "Pre - cost based KMI",
                                   pre_prop = "Pre - proportional KMI",
                                   post_cost = "Post - cost based KMI",
                                   post_prop = "Post - proportional KMI"),
                       selected = "Pre - cost based KMI"),
          
          # input fields change depending on test wanted
          conditionalPanel(
            condition = "input.test == 'Pre - cost based KMI'",
            textInput("sheet_name", "Sheet name", value = "", width = NULL, placeholder = "Sheet1"),
            textInput("uplifts", "Uplifts", value = "", width = NULL, placeholder = "0.01, 0.3, 0.01"),
            textInput("alphas", "Alphas", value = "", width = NULL, placeholder = "0.01, 0.2, 0.01")
            ,fileInput("file1", "Choose xlsx file",
                       # select just selected sheet
                       multiple = FALSE,
                       accept = c(".xlsx"))
          ),
          
          conditionalPanel(
            condition = "input.test == 'Pre - proportional KMI'",
            textInput("baseline_KPI", "Baseline KPI", value = "", width = NULL, placeholder = NULL),
            textInput("analysis_KPIs", "Analysis KPIs", value = "", width = NULL, placeholder = NULL)
            ,fileInput("file2", "Choose json file",
                       multiple = FALSE,
                       accept = c(".json"))
          ),
          
          conditionalPanel(
            condition = "input.test == 'Post - cost based KMI'",
            textInput("confidence_lvl", "Confidence level", value = "", width = NULL, placeholder = "0.95")
            ,fileInput("file3", "Choose csv file",
                       multiple = FALSE,
                       accept = c("text/csv",
                                  "text/comma-separated-values,text/plain",
                                  ".csv")),
            checkboxInput("header3", "Header", TRUE)
          ),
          
          conditionalPanel(
            condition = "input.test == 'Post - proportional KMI'",
            textInput("column_name", "Column name", value = "", width = NULL, placeholder = 'impressions')
            ,fileInput("file4", "Choose csv file",
                       multiple = FALSE,
                       accept = c("text/csv",
                                  "text/comma-separated-values,text/plain",
                                  ".csv")),
            checkboxInput("header4", "Header", TRUE)
          )
        ),
        mainPanel(
          DTOutput("t1")
        )
      )
    )
    
    server <- function(input, output, session) {
      
      df1 <- reactive({
        req(input$test )
        
        if (input$test == "Pre - cost based KMI") {
          req(input$file1)
          df <- read.xlsx(input$file1$datapath, 1)
        }else if (input$test == "Pre - proportional KMI") {
          req(input$file2)
          df <- read_json(input$file2$datapath, simplifyVector = TRUE)
        }else if (input$test == "Post - cost based KMI") {
          req(input$file3)
          df <- read.csv(input$file3$datapath, header = input$header3, stringsAsFactors = FALSE, sep = ",")
        }else if (input$test == "Post - proportional KMI") {
          req(input$file4)
          df <- read.csv(input$file4$datapath, header = input$header4, stringsAsFactors = FALSE, sep = ",")
        }
        
      })
      
      output$message1 <- renderText({ if (!is.null(df1())) paste("Loaded file")})
      
      output$t1 <- renderDT({df1()})
    
    }
    
    shinyApp(ui, server)
    

    【讨论】:

      【解决方案2】:

      您希望所有输入都具有不同的 ID,即使它们永远不会一起出现也没关系。您的文件输入都具有 ID file1,这可能是您的问题的根源 - 将它们全部设置为不同的 ID,您应该会发现它可以正常工作。当然,您还需要更新 server.R 中的初始数据提取,以根据单选按钮提取相关文件 ID。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 2018-01-09
        • 2012-01-11
        • 2019-03-17
        • 2022-06-28
        • 2015-05-28
        • 1970-01-01
        相关资源
        最近更新 更多