使用Javascript使用shinyjs将数据表导出为Shiny中的CSV

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Javascript使用shinyjs将数据表导出为Shiny中的CSV相关的知识,希望对你有一定的参考价值。

我创建了一个Shiny应用程序,可以在数据表中输出数据。由于数据表包含注入的下拉菜单,Shiny和datatable的默认下载按钮不起作用(输出全部,包括所有下拉菜单选项,或输出html)。我正在尝试使用javascript导出我拥有的数据。为此,我使用以下基于以下downloadcsv.js创建的外部Javascript函数guide

shinyjs.myfunction = function(args) {
    var data, filename, link, result, ctr, keys, columnDelimiter, lineDelimiter;

    columnDelimiter = ',';
    lineDelimiter = '
';

    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的窗口中运行Shiny并没有什么区别。似乎没有执行link.click();行,或者根本没有创建下载链接。使用shiny.trace = TRUE运行应用程序时,控制台中的输出如下所示。

发送{“忙”:“忙”}

发送{“custom”:{“shinyjs-myfunction”:{“data”:[“test1”,“test2”]}}}

发送{“忙”:“空闲”}

因此,单击按钮后,Javascript函数似乎正在执行,但没有输出/下载。

答案

所以问题确实存在于最后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

以上是关于使用Javascript使用shinyjs将数据表导出为Shiny中的CSV的主要内容,如果未能解决你的问题,请参考以下文章

如何使用shinyjs从闪亮的应用程序物理打印png?

错误:shinyjs:extendShinyjs:必须提供`functions`参数

启用/禁用不使用 flexdashboard+shinyjs

使用shinydashboard和shinyjs在tabBox中启动时隐藏tabPanel

使用 shinyjs 和 flexdashbord 动态显示/隐藏输入

使用 Shiny `renderUI` 时无法运行 JavaScript 代码