gpt4 book ai didi

javascript - 将数据拖放到 Shiny 的应用程序中

转载 作者:行者123 更新时间:2023-12-03 02:09:57 25 4
gpt4 key购买 nike

如何将数据拖放到 Shiny 的应用程序中?我可以拖放到一个区域并使用 javascript 读取它,但我不知道如何让 Shiny 的注册它,以便我可以在服务器上处理它。这是一个示例设置——有点长,我不认为有内置的 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
)
)

服务器.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;
}

最佳答案

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

datasets[file.name.toLowerCase()] = e.target.result;
# Add this line
Shiny.onInputChange("mydata", datasets);

然后您可以在服务器代码中使用input$mydata。请注意,它是一个列表,因此您需要遍历它(如果您计划删除多个文件,这也是必要的)。

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

getdata.js(如上添加一行)

styles.css(无变化)

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")),
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')
)
)

)
)

服务器.R

server <- function(input, output, session) {
observeEvent(input$mydata, {
len = length(input$mydata)
output$tables <- renderUI({
table_list <- lapply(1:len, function(i) {
tableName <- names(input$mydata)[[i]]
tableOutput(tableName)
})
do.call(tagList, table_list)
})
for (name in names(input$mydata)) {
output[[name]] <- renderTable(read.csv(text=input$mydata[[name]]))
}
})
}

关于javascript - 将数据拖放到 Shiny 的应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36108705/

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