如何在 Shiny 中创建弹出窗口 window 来警告用户选择一种类型的文件扩展名?
How can I create a pop-up window in Shiny to warn user about selecting one type of file extension?
当上传的文件不是 .csv 文件时,我需要弹出窗口 window。 window 信息可以像 "The .csv as file extension is allowed to be uploaded!"。不幸的是,我无法在 Shiny 中成功创建弹出窗口 window,因此提供的代码看起来很基础:
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")))
server.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)
})
}
})
})
响应式文本非常简单(尽管您需要测试文件类型)。尝试
# 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 alert包裹在一个HTML <script>
标签中,全部在一个R字符串中,全部包裹在一个Shiny HTML()
函数中以保持它免于被视为转义显示文本。这是一个双重的turducken,但它有效,而且令人惊讶地易于理解。它不会阻止数据表的渲染,但您可以轻松地重新排列它(一个好主意,因为 fileInput
将 everything 粉碎到数据帧中,无论文件类型如何).
这里可能也需要查看 R 的错误处理。参见 ?try
和 ?tryCatch
。并注意安全;那不是我的领域,但我怀疑这将很难真正部署。
当上传的文件不是 .csv 文件时,我需要弹出窗口 window。 window 信息可以像 "The .csv as file extension is allowed to be uploaded!"。不幸的是,我无法在 Shiny 中成功创建弹出窗口 window,因此提供的代码看起来很基础:
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")))
server.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)
})
}
})
})
响应式文本非常简单(尽管您需要测试文件类型)。尝试
# 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 alert包裹在一个HTML <script>
标签中,全部在一个R字符串中,全部包裹在一个Shiny HTML()
函数中以保持它免于被视为转义显示文本。这是一个双重的turducken,但它有效,而且令人惊讶地易于理解。它不会阻止数据表的渲染,但您可以轻松地重新排列它(一个好主意,因为 fileInput
将 everything 粉碎到数据帧中,无论文件类型如何).
这里可能也需要查看 R 的错误处理。参见 ?try
和 ?tryCatch
。并注意安全;那不是我的领域,但我怀疑这将很难真正部署。