使用 Javascript 在 Shiny 中使用 shinyjs 将数据 table 导出为 CSV
Using Javascript to export data table as CSV in Shiny using shinyjs
我创建了一个 Shiny 应用程序,它在数据 table 中输出数据。由于datatable包含注入的下拉菜单,Shiny和datatable的默认下载按钮不起作用(要么输出所有,包括所有下拉菜单选项,要么输出HTML) .我正在尝试使用 Javascript 导出我拥有的数据。为此,我正在使用我根据以下 guide:
创建的以下外部 Javascript 函数 downloadcsv.js
shinyjs.myfunction = function(args) {
var data, filename, link, result, ctr, keys, columnDelimiter, lineDelimiter;
columnDelimiter = ',';
lineDelimiter = '\n';
keys = Object.keys(data[0]);
result = '';
result += keys.join(columnDelimiter);
result += lineDelimiter;
data.forEach(function(item) {
ctr = 0;
keys.forEach(function(key) {
if (ctr > 0) result += columnDelimiter;
result += item[key];
ctr++;
});
result += lineDelimiter;
});
csv = result;
filename = 'export.csv';
if (!csv.match(/^data:text\/csv/i)) {
csv = 'data:text/csv;charset=utf-8,' + csv;
}
data = encodeURI(csv);
link = document.createElement('a');
link.setAttribute('href', data);
link.setAttribute('download', filename);
link.click();
}
在我的 Shiny 应用程序的 ui.R
中,我使用以下方法添加了一个下载按钮:
shinyjs::useShinyjs(),
extendShinyjs(script = "downloadcsv.js"),
actionButton("download", "Download"),
在server.R
中我添加了:
onclick("download", js$myfunction(data))
但是,当单击“下载”按钮时,没有任何反应。 运行 在浏览器中闪亮或在 RStudio 中 window 没有区别。似乎link.click();
行没有执行,或者下载link根本没有创建。当 运行 应用程序 shiny.trace = TRUE
.
时,控制台中的输出如下
SEND {"busy":"busy"}
SEND {"custom":{"shinyjs-myfunction":{"data":["test1","test2"]}}}
SEND {"busy":"idle"}
所以点击按钮后,Javascript函数似乎在执行,但没有出现output/download。
所以确实问题出在代码的最后 4 行 link
。我用类似的代码替换了这四行。但是添加了一个在 FF 中使用的必需行:
var encodedUri = encodeURI(csv);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "my_data.csv");
document.body.appendChild(link); // Required for FF
link.click(); // This will download the data file named "my_data.csv".
基于How to export JavaScript array info to csv (on client side)?
我只需要找到一种方法将数据从 R 正确传递到 Javascript 函数即可。
编辑:我找到了如何做到这一点 here!
我创建了一个 Shiny 应用程序,它在数据 table 中输出数据。由于datatable包含注入的下拉菜单,Shiny和datatable的默认下载按钮不起作用(要么输出所有,包括所有下拉菜单选项,要么输出HTML) .我正在尝试使用 Javascript 导出我拥有的数据。为此,我正在使用我根据以下 guide:
创建的以下外部 Javascript 函数downloadcsv.js
shinyjs.myfunction = function(args) {
var data, filename, link, result, ctr, keys, columnDelimiter, lineDelimiter;
columnDelimiter = ',';
lineDelimiter = '\n';
keys = Object.keys(data[0]);
result = '';
result += keys.join(columnDelimiter);
result += lineDelimiter;
data.forEach(function(item) {
ctr = 0;
keys.forEach(function(key) {
if (ctr > 0) result += columnDelimiter;
result += item[key];
ctr++;
});
result += lineDelimiter;
});
csv = result;
filename = 'export.csv';
if (!csv.match(/^data:text\/csv/i)) {
csv = 'data:text/csv;charset=utf-8,' + csv;
}
data = encodeURI(csv);
link = document.createElement('a');
link.setAttribute('href', data);
link.setAttribute('download', filename);
link.click();
}
在我的 Shiny 应用程序的 ui.R
中,我使用以下方法添加了一个下载按钮:
shinyjs::useShinyjs(),
extendShinyjs(script = "downloadcsv.js"),
actionButton("download", "Download"),
在server.R
中我添加了:
onclick("download", js$myfunction(data))
但是,当单击“下载”按钮时,没有任何反应。 运行 在浏览器中闪亮或在 RStudio 中 window 没有区别。似乎link.click();
行没有执行,或者下载link根本没有创建。当 运行 应用程序 shiny.trace = TRUE
.
SEND {"busy":"busy"}
SEND {"custom":{"shinyjs-myfunction":{"data":["test1","test2"]}}}
SEND {"busy":"idle"}
所以点击按钮后,Javascript函数似乎在执行,但没有出现output/download。
所以确实问题出在代码的最后 4 行 link
。我用类似的代码替换了这四行。但是添加了一个在 FF 中使用的必需行:
var encodedUri = encodeURI(csv);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "my_data.csv");
document.body.appendChild(link); // Required for FF
link.click(); // This will download the data file named "my_data.csv".
基于How to export JavaScript array info to csv (on client side)?
我只需要找到一种方法将数据从 R 正确传递到 Javascript 函数即可。
编辑:我找到了如何做到这一点 here!