【问题标题】:Using Javascript to export data table as CSV in Shiny using shinyjs使用 Javascript 在 Shiny 中使用 Shinyjs 将数据表导出为 CSV
【发布时间】:2018-07-23 23:20:11
【问题描述】:

我创建了一个在数据表中输出数据的 Shiny 应用程序。由于数据表包含注入的下拉菜单,因此 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 的窗口中运行 Shiny 并没有什么不同。似乎没有执行link.click(); 行,或者根本没有创建下载链接。使用shiny.trace = TRUE运行应用程序时,控制台的输出如下。

发送{“忙碌”:“忙碌”}

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

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

所以点击按钮后,Javascript函数似乎正在执行,但没有出现输出/下载。

【问题讨论】:

    标签: javascript r csv shiny shinyjs


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 2021-01-27
      • 2013-03-10
      • 2021-08-09
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2013-12-20
      • 2021-07-30
      相关资源
      最近更新 更多