将数据拖放到闪亮的应用程序中

时间:2016-03-19 23:55:18

标签: javascript r drag-and-drop shiny

如何将数据拖放到闪亮的应用中?我可以拖放到一个区域并用javascript读取它,但我不知道如何闪亮注册它所以我可以在服务器上处理它。这是一个示例设置 - 它有点长b / c我不认为有内置的javascript函数来处理拖放。

当运行并且拖入数据集“dat.csv”时,它应该如下所示。目标是将已拖放的数据注册到input中的变量中,以便它可以在R中处理 enter image description here

ui.R

library(shiny)

ui <- shinyUI(
  fluidPage(
    tags$head(tags$link(rel="stylesheet", href="css/styles.css", type="text/css"),
      tags$script(src="getdata.js")),
    h3(id="data-title", "Drop Datasets"),
    div(class="col-xs-12", id="drop-area", ondragover="dragOver(event)", 
      ondrop="dropData(event)"),
    tableOutput('table'),  # doesn't do anything now

    ## debug
    div(class="col-xs-12",
      tags$hr(style="border:1px solid grey;width:150%"),
      tags$button(id="showData", "Show", class="btn btn-info", 
        onclick="printData('dat.csv')")),
    div(id="data-output")  # print the data
  )
)

server.R

## Make a sample dataset
# write.csv(data.frame(a=1:10, b=letters[1:10]), "dat.csv", row.names=FALSE)
server <- function(input, output, session) {
  output$table <- renderTable(input$data)  # this variable doesn't exist
}

WWW / getdata.js

var datasets = {};
var dragOver = function(e) { e.preventDefault(); };
var dropData = function(e) {
    e.preventDefault();
    handleDrop(e.dataTransfer.files);
};
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;
        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);
    }
};
// debug
var printData = function(data) {
    var div = document.createElement("div");
    div.innerHTML = datasets[data];
    document.getElementById("data-output").appendChild(div);
};

WWW / CSS / Styles.css中

#data-title {
    text-align:center;
}

#drop-area {
    background-color:#BCED91;
    border:2px solid #46523C;
    border-radius:25px;
    height:90px;
    overflow:auto;
    padding:12px;
}

#drop-area #datasets {
    display:inline-block;
    font-size:small;
    margin-right:8px;
    text-align:center;
    vertical-align:top;
}

.thumb {
    height:45px;
}

2 个答案:

答案 0 :(得分:16)

您只需将以下行添加到js文件

Debit/Credit       Ledger Name                Debit Amt         Credit Amt
  Dr               Ledger 1                     500                            
  Cr               Ledger 2                                        500             

然后您可以在服务器代码中使用datasets[file.name.toLowerCase()] = e.target.result; # Add this line Shiny.onInputChange("mydata", datasets); 。请注意,它是一个列表,因此您需要遍历它(如果您计划删除多个文件,也是必需的)。

完整代码(也显示多个csv文件,请注意,如果删除多个具有相同名称的文件,则只显示一个文件):

getdata.js(如上所示添加一行)

styles.css(无变化)

ui.R

input$mydata

server.R

library(shiny)

ui <- shinyUI(
  fluidPage(
    tags$head(tags$link(rel="stylesheet", href="css/styles.css", type="text/css"),
              tags$script(src="getdata.js")),
    sidebarLayout(
      sidebarPanel(
        h3(id="data-title", "Drop Datasets"),
        div(class="col-xs-12", id="drop-area", ondragover="dragOver(event)", 
            ondrop="dropData(event)")
      ),
      mainPanel(
        uiOutput('tables')
      )
    )

  )
)

答案 1 :(得分:4)

截至2017年8月,此功能现在由fileInput直接从shiny提供!太棒了。

这是宣布功能https://blog.rstudio.com/2017/08/15/shiny-1-0-4/

的博客文章