闪亮的R应用程序,允许用户修改数据 [英] Shiny R application that allows users to modify data

查看:19
本文介绍了闪亮的R应用程序,允许用户修改数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这还不是一个实际问题,而是一个理论问题。我在考虑用SHINY以交互的方式显示一些原始数据。这个不错。

但是-是否可以让用户更改显示的数据?

比方说,如果我有一组滑块供用户限制底层数据以满足特定条件并显示这些观察结果,是否可以允许用户修改该数据并将这些修改发送回服务器,服务器进而保存这些更改?

我在考虑这样的场景:用户可以使用一个闪亮的应用程序浏览数据并检测数据中潜在的离群值--然后用户可以将这些标记为离群值。但是,需要将该信息传回服务器。

这样的应用程序可能吗?是否有一些现有的示例?

推荐答案

由于您可以创建自己的inputoutput绑定–因此,您基本上可以在SHILY中做任何事情,所以您的问题的答案是肯定的,您所问的都是可能的。假设您有一个数据框,您将其发送到网页以供用户查看。例如,如果单元格是应该删除的离群值(替换为NA),您希望允许用户简单地单击该单元格。

假设数据框如下所示:

x <- data.frame(Age = c(10, 20, 1000), Weight = c(120, 131, 111))
x

# Age    Weight
# 10     120
# 20     131
# 1000   111

在SHILINY中,您将构建一个正常的HTML表格,该表格在网页上显示时可能如下所示:

 <table class="outlier-finder" id="outliers">
  <tr>
    <td>Age</td>
    <td>Weight</td>
  </tr>
  <tr>
    <td>10</td>
    <td>120</td>
  </tr>
  <tr>
    <td>20</td>
    <td>131</td>
  </tr>
  <tr>
    <td>1000</td>
    <td>111</td>
  </tr>
</table>
现在中断jQuery并绑定一个单击事件,这样当单元格被单击时,您可以记录行号和列号(see here),然后在SHILINY中用NA替换该单元格。您的输入绑定可能类似于(see here for details of what's going on here):

$(document).on("click", ".outlier-finder td", function(evt) {

  // Identify the clicked cell.
  var el = $(evt.target);

  // Raise an event to signal that the something has been selected.
  el.trigger("change");

});

var cell_binding = new Shiny.InputBinding();

$.extend(cell_binding, {

  find: function(scope) {
    return $(scope).find(".outlier-finder td");
  },

  getValue: function(el) {
    // Get the row and cell number of the selected td.
    var col = el.parent().children().index(el);
    var row = el.parent().parent().children().index(el.parent());
    var result = [row, col];
    return result;
  },

  setValue: function(el, value) {
    $(el).text(value);
  },

  subscribe: function(el, callback) {
    $(el).on("change.cell_binding", function(e) {
      callback();
    });
  },

  unsubscribe: function(el) {
    $(el).off(".cell_binding");
  }

});

Shiny.inputBindings.register(cell_binding);
这里发生了很多事情,但通常这些输入绑定彼此非常相似。最重要的是setValue()函数。在那里应该发生的事情(这是未经测试的)是记录正在单击的单元格的行号和列号,并将其回发到服务器。

然后,您只需在SHILINY中执行如下操作:

updateData <- reactive({

    # Get selection
    remove_outlier <- as.integer(RJSONIO::fromJSON(input$outliers))

    if (!is.null(remove_outlier)) {

      # Remove that outlier.
      x[remove_outlier[1], remove_outlier[2]] <- NA

    }

    return(x)

})

output$outliers <- renderText({

  # Update x.
  current_x <- updateData()

  # Write code to output current_x to page.
  # ... 
  # ...

})

您可能还需要为输出$异常值进行输出绑定。这显然是简化的代码,您需要应用错误检查等。

这只是一个示例。实际上,您可能不会在用户每次进行更改时都出色地更新您的数据框。您可能希望有某种类型的提交按钮,这样一旦用户完成了他/她的所有更改,就可以应用这些更改。


我甚至没有远程测试过这些,所以几乎可以肯定会有一些错误。但是因为你只是在问一个理论性的问题,所以我没有检查太多。不管怎样,总的战术应该会奏效。使用输入绑定,您可以将网页中的任何内容返回到服务器,而使用输出绑定,反之亦然。也许说"任何事"都有点牵强,但你可以做很多事情。

这篇关于闪亮的R应用程序,允许用户修改数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆