【发布时间】:2017-05-06 10:20:23
【问题描述】:
我目前正在创建一个带有一些自定义 js 的 R Shiny 应用程序,以提供拖放功能。虽然拖放对单个文件非常有效,但当我使用 shinyJS 重置它时,再次上传相同的文件无法正常工作。我知道这是因为重新输入同名文件时不会触发 onchange 函数(无论文件内容是否已被修改)
JS:
var datasets = {};
var dragOver = function(e) { e.preventDefault(); };
var dropData = function(e) {
e.preventDefault();
handleDrop(e.dataTransfer.files);
};
var removeFiles = function(e){
jQuery('#datafile').empty();
}
var handleDrop = function(files) {
for (var i = 0, f; f = files[i]; i++) {
var reader = new FileReader();
reader.onload = (function(file) {
return function(e) {
datasets[file.name.toLowerCase()] = e.target.result;
Shiny.onInputChange("datafile", datasets);
var div = document.createElement("div");
var src = "https://cdn0.iconfinder.com/data/icons/office/512/e42-512.png";
div.id = "datasets";
div.innerHTML = [
"<img class='thumb' src='", src, "' title='", encodeURI(file.name),
"'/>", "<br>", file.name, "<br>"].join('');
document.getElementById("drop-area").appendChild(div);
};
})(f);
reader.readAsText(f);
}
};
Server.R(查看文件输入的部分):
observeEvent(input$datafile, {
infile <- input$datafile
if (is.null(infile)) {
# User has not uploaded a file yet
return(NULL)
}
# CLEAN FILE
name <- names(input$datafile)[1]
csvFile <- read.csv(text=input$datafile[[name]])
output$dataTable <- renderDataTable(csvFile , options = list(scrollX = '1100px') )
}
ui.R(只是相关部分):
# DRAG AND DROP FILE INPUT
h3(id="data-title", "Drop Datasets"),
div(class="col-xs-12", id="drop-area", ondragover="dragOver(event)",
ondrop="dropData(event)" , onClick="fallback(event)"),
div(onClick="removeFiles(event)", actionButton(inputId="resetAutomaticInput", label="Reset Input")
我不明白如何让我的闪亮值反应触发与 input$datafile 关联的事件。非常感谢任何帮助!
【问题讨论】:
-
我为此使用了一种解决方法。除了
input$datafile,引入Shiny.onInputChange("trigger", Math.random());并使用observeEvent(input$trigger, ...,而不是依赖input$datafile,...
标签: javascript r drag-and-drop shiny reactive-programming