【发布时间】:2015-09-19 21:02:35
【问题描述】:
我正在尝试隔离包含会话值session$sendCustomMessage 的部分,以便在单击ActionButton 时发送消息。用户上传文件,然后ActionButton 变为可见。只有当按钮被点击时,我们才应该进入server.R的隔离部分。在此之后,完成一些计算,并将一个文件返回给用户。但是,我未能正确隔离,即使没有单击ActionButton,文件也会返回。这是我的应用程序:
服务器.R:
library(shiny)
shinyServer(function(input, output, session) {
observe({
inFile <- input$upload
if (is.null(inFile))
return(NULL)
# Send message indicating that the file is now uploaded
session$sendCustomMessage("upload_ready", list(fileSize=0))
# Read the .csv file
df = readLines(inFile$datapath)
# Isolate this section from the reactive context.
# But this is executing even if the Action Button is not
# clicked
isolate({
# Make this isolated section dependent on the start_proc ActionButton
input$start_proc
output$data_file <- downloadHandler(
filename = function() {
paste('probabilities-', Sys.Date(), '.txt', sep='')
}
,
content = function(file1) {
writeLines(df, con = file1)
}
)
# I think this is the problem, the session changes even if the
# action button is not clicked, and this is why the code is going
# into this section.
session$sendCustomMessage("download_ready", list(fileSize=0))
})
})
})
ui.R
library(shiny)
library(shinyBS)
shinyUI(fixedPage(
singleton(tags$head(HTML(
'
<script type="text/javascript">
$(document).ready(function() {
// disable download at startup. data_file is the id of the downloadButton
$("#data_file").attr("disabled", "true").attr("onclick", "return false;");
// Disable start_prob at the beginning
$("#start_proc").hide();
// When uploaded file is ready, give the option to start process
Shiny.addCustomMessageHandler("upload_ready", function(message) {
$("#start_proc").show();
});
// When the start_proc button is clicked, hide the button and disable
//
$("#start_proc").click(function(){
$("#start_proc").hide();
$("#upload").prop("disabled", true);
});
// Show the option to download the file when the download is ready.
// Also hide the button stat_proc and reactivate the option to upload
// a file.
Shiny.addCustomMessageHandler("download_ready", function(message) {
$("#upload").prop("disabled", false);
$("#data_file").removeAttr("disabled").removeAttr("onclick").html(
"<i class=\\"fa fa-download\\"></i>Download Ready");
});
})
</script>
'
))),
fileInput("upload", ""),
bsButton("start_proc", h5("Compute Probability\n"), size = "extra-small", style = "primary"),
downloadButton("data_file"),
helpText("Download will be available once the processing is completed.")
))
【问题讨论】: