如何在 Shiny 中创建一个弹出窗口来警告用户选择一种类型的文件扩展名?

Posted

技术标签:

【中文标题】如何在 Shiny 中创建一个弹出窗口来警告用户选择一种类型的文件扩展名?【英文标题】:How can I create a pop-up window in Shiny to warn user about selecting one type of file extension? 【发布时间】: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)
       )
      
     ) 

     )

【问题讨论】:

【参考方案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 文本标签(ph1h6 等),但要获得弹出窗口,您需要调用 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 时才会渲染。跨度>

以上是关于如何在 Shiny 中创建一个弹出窗口来警告用户选择一种类型的文件扩展名?的主要内容,如果未能解决你的问题,请参考以下文章

如何打开弹出窗口来警告用户并在后台运行?

如何在 Python 函数中创建简单的 PyQt 弹出窗口并在其末尾关闭?

颤振 - 如何在弹出窗口中创建表单

如何在 vue 中创建模态弹出窗口

如何在 Shiny 中创建可点击的直方图?

如何在剑道中创建没有弹出窗口的事件?还是以编程方式创建事件?