gpt4 book ai didi

javascript - 拖放时出现 R Shiny 输入 react 性错误

转载 作者:行者123 更新时间:2023-11-30 11:37:33 27 4
gpt4 key购买 nike

我目前正在使用一些自定义 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")

我不明白如何使 Shiny 的值具有反应性以触发与 input$datafile 关联的事件。非常感谢任何帮助!

最佳答案

我看了一下这个,玩了一会儿,先把它变成了一个工作示例。我认为拖放功能在这里是一个有用的示例。它也能正确处理 multi-drop。它也有一些有趣的 javascript 结构——至少对我来说是这样。

为了解决这个问题,我没有像 BigDataScientist 建议的那样使用随机数,而是使用了一个可能对其他事情也有用的计数。

总共进行了这些更改:

  • 将碎片整理成一个完整的Shiny工作示例,并保存到自己的目录中。
  • 将 javascript 代码放入 Shiny 代码保存目录下名为 www 的子目录中。
  • 在 UI 代码中添加了一个 tag$head(tag$script(... 语句来加载该 javascript。
  • 将一些 innerhtml 文本添加到 drop-area div 以便可以将其放入。
  • 向 javascript 添加了一个 dropcount
  • 更改了 html,以便将 dropcount 回显到 drop-area div。
  • 将输出更改为 verbatumPrintOutput,这样您就可以在更小的区域内看到更多的数据帧。
  • 向输出添加了更多字段,以便您可以更好地查看 input$datafile 中的内容。
  • 将 JS for 循环更改为不会生成警告的内容。
  • 在顶部添加了一个 jslint 注释以消除另一个警告。
  • 添加了一些输出字段(inputdatafilerowsdatafile)以便您可以跟踪 input$datafile 中的内容 - 直到我这样做之前不清楚真正的错误是什么,但这只是我...
  • 稍微改变了输出中的逻辑,使重置功能按照人们可能期望的方式工作(示例代码似乎仍然不完整)
  • 可能还有其他一些我忘记的小事。

代码如下:

JS:

/*jshint loopfunc:true */ // git rid of warning
var datasets = {};
var dragOver = function(e) { e.preventDefault(); };

var dropData = function(e) {
e.preventDefault();
handleDrop(e.dataTransfer.files);
};
var dropcount=0;

var removeFiles = function(e){
txt = "Drop Area "+dropcount;
jQuery('#drop-area').html(txt);
datasets = {};
Shiny.onInputChange("datafile", datasets);
};
var handleDrop = function(files) {
for (var i = 0; i<files.length; i++) {
f = files[i];
var reader = new FileReader();

reader.onload = (function(file) {
return function(e) {
datasets[file.name.toLowerCase()+'|'+dropcount] = 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('');
drpel = document.getElementById("drop-area");
drpel.appendChild(div);
drpel.childNodes[0] = "Drop Area "+dropcount;
};
})(f);
reader.readAsText(f);
dropcount++;
}
};

这是 Shiny 的:

library(plotly)
library(htmlwidgets)
library(shiny)
library(ggplot2)

ui <- shinyUI(fluidPage(

tags$head(tags$script(type="text/javascript", src = "fileUp.js")),

# 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)","Drop Area"),

div(onClick="removeFiles(event)",
actionButton(inputId="resetAutomaticInput",label="Reset Input"),
verbatimTextOutput("inputdatafile"),
verbatimTextOutput("rowsdatafile"),
verbatimTextOutput("dataTable"))
))
server <- shinyServer(function(input, output) {

observeEvent(input$datafile, {
infile <- input$datafile
if (length(infile)==0) {
# User has not uploaded a file yet
return(NULL)
}
# CLEAN FILE
name <- names(input$datafile)[length(infile)]
csvFile <- reactive(
if (length(input$datafile)>0){
read.csv(text=input$datafile[[name]])
}
)

output$dataTable <- renderPrint(csvFile())
output$inputdatafile <- renderPrint(names(input$datafile))
output$rowsdatafile <- renderPrint(sapply(input$datafile,nchar))
})
})
shinyApp(ui, server)

和屏幕截图:

enter image description here

关于javascript - 拖放时出现 R Shiny 输入 react 性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43819250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com