如何在 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 文本标签(p
、h1
到 h6
等),但要获得弹出窗口,您需要调用 JavaScript。
上面的代码将 JavaScript 警报包装在 HTML <script>
标记中,全部在 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 %>% ...
链置于条件中来解决问题:if(input$file1$type %in% c('text/csv', ... )) filetype %>% ...
,因此它仅在文件为 .csv 时才会渲染。跨度>
以上是关于如何在 Shiny 中创建一个弹出窗口来警告用户选择一种类型的文件扩展名?的主要内容,如果未能解决你的问题,请参考以下文章