【问题标题】:How can I create a pop-up window in Shiny to warn user about selecting one type of file extension?如何在 Shiny 中创建一个弹出窗口来警告用户选择一种类型的文件扩展名?
【发布时间】:2016-04-12 12:57:23
【问题描述】:

当上传的文件不是 .csv 文件时,我需要有一个弹出窗口。窗口信息可以是“允许上传 .csv 作为文件扩展名!”。不幸的是,我无法在 Shiny 中成功创建弹出窗口,所以提供的代码看起来很基本:

  library(shiny)

   shinyUI(
     fluidPage(
      fileInput("file1",
          "Choose CSV files from directory",
          multiple = TRUE,
          accept=c('text/csv', 
                   'text/comma-separated-values,text/plain', 
                   '.csv')),
      dataTableOutput("importcsv")))

服务器.R

  library(shiny)

   shinyServer(function(input, output) {

    output$importcsv <- renderDataTable({

     filecsv <- input$file1
     if (is.null(filecsv)) {
     return(NULL)
     } else {
      filecsv %>%
        rowwise() %>%
       do({
        read.csv(.$datapath)
       })
      }
     }) 

     })

【问题讨论】:

    标签: javascript r csv shiny popup


    【解决方案1】:

    响应式文本非常简单(尽管您需要测试文件类型)。试试

    # ui.R    
    library(shiny)
    
    shinyUI(
      fluidPage(
        fileInput("file1",
                  "Choose CSV files from directory",
                  multiple = TRUE,
                  accept=c('text/csv', 
                           'text/comma-separated-values',
                           'text/plain', 
                           '.csv')),
        htmlOutput('filetype'),
        dataTableOutput("importcsv")))
    

    和

    # server.R
    library(shiny)
    library(dplyr)
    
    shinyServer(function(input, output) {
    
      output$importcsv <- renderDataTable({
        filecsv <- input$file1
        if (is.null(filecsv)) {
          return(NULL)
        } else {
          output$filetype <- renderText({
            ifelse(input$file1$type %in% c('text/csv', 
                                   'text/comma-separated-values',
                                   'text/plain', 
                                   '.csv'), 
                   '', 
                   HTML('<script type="text/javascript">alert("CSV, please!");</script>'))
               })
          filecsv %>%
            rowwise() %>%
            do({
              read.csv(.$datapath)
            })
        }
      })  
    })
    

    这使您可以根据文件类型在 UI 中显示一个字符串。然后你需要格式化你的字符串。 Shiny 支持一些 HTML 文本标签(p、h1 到 h6 等),但要获得弹出窗口,您需要调用 JavaScript。

    上面的代码将 JavaScript 警报包装在 HTML &lt;script&gt; 标记中,全部在 R 字符串中,全部包装在 Shiny HTML() 函数中,以防止其被视为转义显示文本。这是一个双重turducken,但它有效,并且令人惊讶地易于理解。它不会阻止数据表呈现,但您可以轻松地重新排列它(这是一个好主意,因为fileInput 将所有内容粉碎成数据帧,无论文件类型如何)。

    这里可能也需要了解一下 R 的错误处理。请参阅 ?try 和 ?tryCatch。并注意安全;那不是我的领域,但我怀疑这是否会真正部署。

    【讨论】:

    • 见similar;无论如何,验证可能是您想要做的,但我从字面上阅读了您的问题。
    • 当我将“相似”示例与我的示例进行比较时,需要弹出窗口来显示警告。而且效果很好。感谢您的帮助! :)
    • 我今天碰巧遇到了this question,这让我想到,如果你愿意,你可以用 JavaScript 将这行代码重写为 tags$script(type = "text/javascript", 'alert("CSV, please!");'),这可能会更健壮一些。
    • 我想再问一件事,当我尝试上传pdf文件时,弹出窗口没有出现?我该如何发展?
    • 这是因为您将文件传递给renderDataTable,无论它是否为.csv。当传递一个 .pdf 文件时,它会引发一个 AJAX 错误(您必须深入研究源代码才能找出原因),从而停止执行包含警报代码的renderDataTable。确实,没有理由渲染任何不是 .csv 的内容,因此您可以通过将filetype %&gt;% ... 链置于条件中来解决问题:if(input$file1$type %in% c('text/csv', ... )) { filetype %&gt;% ... },因此它仅在文件为 .csv 时才会渲染。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多