javascript - 使用 R 读取动态 HTML 元素

标签 javascript html r shiny google-visualization

首先,我想说我对 R 完全陌生。我已阅读文档,但找不到解决以下情况的方法:

我使用谷歌图表库(org-chart)制作了一个图表,它可以工作。问题是,层次结构中的每个节点都有一个输入,当用户单击按钮或单击 Enter 时,我必须读取该输入并将其发送到 R。这是我的问题

  1. 我不知道如何设置动态创建的节点的 react 性
  2. 我不知道我必须读取多少个节点,因为它们是完全随机的。我的想法是在每个节点上设置一个类并稍后进行迭代,但我不确定。

我所做的只是为了测试:

library(shiny)
# Define server logic for random distribution application
shinyServer(function(input, output) {
    output$num <- renderText ({
        paste('Number has changed to : ', input$qty_1)
      })
})

其中 $qty_1 是

<input name="qty_1" id="qty_1" value="10" type="number"></input>

但运气不佳。

附注我正在使用Shiny框架来开发后端。

我的 HTML 是

<html>
  <head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.min.js"></script>

    <style type="text/css">
        input[type="number"] {
            background-color : #fdfdd2;
        }
    </style>

    <script>
    "use strict";
        var tree = {
            name: "ROOT",
            desc: "Root",
            qty : 0,
            parent: '',
            children: {
                name: "FIRST",
                desc: "first",
                qty : 0,
                parent: 'ROOT',
                children: [{
                    name: "SECOND",
                    desc: "second",
                    qty : 0,
                    parent: 'FIRST',
                    children: {}
                }, {
                    name: "THIRD",
                    desc: "third",
                    qty : 0,
                    parent: 'FIRST',
                    children: [{
                        name: "FOURTH",
                        desc: "fourth",
                        qty: 0,
                        parent: 'THIRD',
                        children:{}
                    },{
                        name: "FIFTH",
                        desc: "fifth",
                        qty : 0,
                        parent: 'THIRD',
                        children: [{
                            name: "SIXTH",
                            desc: "sixth",
                            qty : 0,
                            parent: 'FIFTH',
                            children: {}
                        }]
                    }]
                }]
            }
        }
    </script>

    <script type="text/javascript">
        google.charts.load('current', {packages:["orgchart"]});
        google.charts.setOnLoadCallback(drawChart);

        function drawChart() {
            var data = new google.visualization.DataTable();
            data.addColumn('string', 'Name');
            data.addColumn('string', 'Desc');
            data.addColumn('string', 'Qty');

            // For each orgchart box, provide the name, description, and quantity to show.
            addRows(data, tree);

            // Create the chart.
            var chart = new google.visualization.OrgChart(document.getElementById('chart_div'));

            // Draw the chart, setting the allowHtml option to true for the tooltips.
            chart.draw(data, { allowHtml: true });
        }

        function addRows(data, Tree) {
            if (jQuery.isEmptyObject(Tree)) return;

            appendToChart(data, Tree.name, Tree.desc, Tree.qty, Tree.parent);

            var children = Tree.children;

            if (Object.prototype.toString.call( children ) == '[object Array]'){ // more than 1 child
                for (var i = children.length - 1; i >= 0; i--) {
                    addRows(data, children[i]);
                }
            }
            else
            {
                addRows(data, children);
            }
        }

        function appendToChart(data, name, desc, qty, parent) {
            data.addRows([
                //[name, parent, desc]
                [{ v:name, f: name + '<div style="color:red; font-style:italic">' + desc + 
                    '</div><input id="qty" size="4" value="' + qty + '" type="number"></input>' }, parent, desc]
            ]);
        }

    </script>
    </head>
    <body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-12">
                <div id="chart_div"></div>
            </div>
        </div>
    </div>

    <script>
    $(function(){
        $(document).on('keypress', function(e) {
            if (e.which == 13)
                if ($.isNumeric($("#qty").val()))
                    alert($("#qty").val());
                else
                    alert("not a number");
        });
    });
  </script>
  </body>

</html>

最佳答案

您可以尝试以下几种方法:

  1. 将shiny.js添加到您的head中(我一般也会放 Shiny 的jquery版本):

    <script src="shared/jquery.js" type="text/javascript"></script>

    <script src="shared/shiny.js" type="text/javascript"></script>

  2. 将数字输入包装在 <div class="shiny-input-container"> 中为了让shiny将它们识别为输入并绑定(bind)它们,它们将需要一个名称属性,然后您可以使用该属性在 server.R 中引用它们。例如,您可以在 addRows 中执行此操作功能:

[{ v:name, f: name + '<div style="color:red; font-style:italic" >' + desc + '</div><div class="shiny-input-container"><input name="qty-'+name+'" size="4" value="' + qty + '" type="number"></input></div>' }, parent, desc]

  • 由于您是通过js添加输入,因此您应该调用Shiny.unbindAll()drawChart 开头功能和Shiny.bindAll()最后让所有 Shiny 的输入绑定(bind)正常工作。
  • 在 server.R 中,您可以引用输入,它们都有一个类似 qty-name 的名称。 ,您可以通过执行 grepl("qty",names(input)) 将它们从输入列表中过滤出来。例如,您可以在 server.R 中打印它们。 :

    observe({
       lapply(names(input)[grepl("qty",names(input))],function(x){
            print(paste(x,input[[x]]))
       })
    }) 
    

    关于javascript - 使用 R 读取动态 HTML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35583593/

    相关文章:

    javascript - 仅动态删除特定元素中的字母,并将其包装在 SPAN 中

    javascript - 你能用 jquery 定位类吗?

    javascript - 响应式 HTML/CSS TreeView

    css - 页脚菜单栏的代码

    html - 使用 CSS 将图像水平居中

    r - 将字符线串转换为 sf 中的几何图形

    r - 如何在散点图上的 stat_smooth 曲线下创建一个区域?

    javascript - 发送不同或额外的参数到 Backbone 销毁/删除?

    javascript - 模式弹出窗口在项目的所有按钮上显示第一个项目详细信息

    r - 用于 R 中两个数据集之间计算的 for 循环矢量化