我有以下代码,允许接受csv文件 - >运行R代码 - >显示 - >下载输出。
但是,只要应用程序运行,就会出现下载按钮。 有没有办法只在输出文件可用时才显示输出按钮?
以下是我正在使用的代码:
UI.R
library(shiny)
#ui.R
# Define UI for random distribution application
shinyUI(fluidPage(
# Application title
titlePanel("Text Mining on R"),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Select the Input File',
accept=c('text/csv','text/comma-separated-values,text/plain','.csv')),
tags$hr(),
fileInput('file2', 'Select the UserTopic file',
accept=c('text/csv','text/comma-separated-values,text/plain','.csv'))
),
mainPanel(
dataTableOutput('table'),
downloadButton('OutputFile', 'Download Output File')
)
))
)
Server.R
#server.R
library(shiny)
shinyServer(function(input, output) {
observe({
file1 = input$file1
file2 = input$file2
if (is.null(file1) || is.null(file2)) {
return(NULL)
}
data1 = read.csv(file1$datapath,header = TRUE, sep=",",skipNul = TRUE)
data2 = read.csv(file2$datapath,header = TRUE, sep=",",skipNul = TRUE)
source("RCode.R", local = TRUE)
#output$table <- renderDataTable(output2)
output$table <- renderDataTable({
my_function(file1$datapath,file2$datapath)
})
output$OutputFile <- downloadHandler(
filename = function() {
paste("OutputFile", "_",Sys.time(),".csv",sep="")
},
content = function(file) {
write.csv(my_function(file1$datapath,file2$datapath), file, sep = ",",
row.names = FALSE)
}
)
})
})
谢谢!
答案 0 :(得分:3)
在服务器端,您可以使用:
output$download <- renderUI({
if(!is.null(input$file1) & !is.null(input$file2)) {
downloadButton('OutputFile', 'Download Output File')
}
})
在ui端,您将下载按钮替换为:
uiOutput("download")
答案 1 :(得分:2)
答案 2 :(得分:1)
除上述解决方案外,您还可以使用conditionalPanel
,如下所示:
<强> ui.R 强>
conditionalPanel("output.fileUploaded",
downloadButton('OutputFile', 'Download Output File'))
<强> server.R 强>
getData <- reactive({
if(is.null(input$file1) && is.null(input$file2))
{return(NULL)}
else {return(1)}
})
output$fileUploaded <- reactive({
return(!is.null(getData()))
})
outputOptions(output, 'fileUploaded', suspendWhenHidden=FALSE)
这只是使用conditionalPanel
和outputOptions
的另一种方法。
答案 3 :(得分:0)
您还可以使用req()。
在用户界面中:
uiOutput("get_the_item")
在服务器中:
output$get_the_item <- renderUI({
req(input$file1, input$file2)
downloadButton('download_item', label = 'Download item') })
在renderUI下方,添加downloadHandler(使用用于文件名和内容的参数来完成代码):
output$download_item <- downloadHandler(
filename = function() {},
content = function(file) {}
)