如何将一个d3JS javascript文件引入R Shiny以绘制强制网络图?

时间:2015-03-27 13:02:49

标签: r d3.js shiny

我正在尝试构建一个闪亮的应用程序,显示我在d3JS中编码的复杂的力网络图。这超出了我所能做的R包network3,我试过了。我想要引入我高度自定义的.js文件来处理显示,这就是我迷失的地方。

为了简单起见,让我们考虑从这里改编的最简单的力网络图:http://bl.ocks.org/sathomas/11550728 如果有人可以告诉我如何使用示例ui.R和server.R引入SimpleFN.js文件(见下文),然后我可以将方法扩展到更复杂的示例。我知道如何引入style.css文件。还没有显示对d3.min.js库(http://d3js.org/d3.v3.min.js)的必需引用,我也知道如何引用它。

我知道你在说什么:“这不是反应图!你为什么烦心?”我会到那里,相信我。 :)

非常感谢对这个最基本的例子的任何帮助!

干杯!

注意:交叉发布到Shiny Google Group,但迄今为止没有回复。

文件style.css:

.node {
    fill: #ccc;
    stroke: #fff;
    stroke-width: 2px;
}

.link {
    stroke: #777;
    stroke-width: 2px;
}

文件SimpleFN.js:

var width = 640,
    height = 480;

var nodes = [
    { x:   width/3, y: height/2 },
    { x: 2*width/3, y: height/2 }
];

var links = [
    { source: 0, target: 1 }
];

var svg = d3.select('body').append('svg')
    .attr('width', width)
    .attr('height', height);

var force = d3.layout.force()
    .size([width, height])
    .nodes(nodes)
    .links(links);

force.linkDistance(width/2);

var link = svg.selectAll('.link')
    .data(links)
    .enter().append('line')
    .attr('class', 'link');

var node = svg.selectAll('.node')
    .data(nodes)
    .enter().append('circle')
    .attr('class', 'node');
force.on('end', function() {
    node.attr('r', width/25)
        .attr('cx', function(d) { return d.x; })
        .attr('cy', function(d) { return d.y; });
    link.attr('x1', function(d) { return d.source.x; })
        .attr('y1', function(d) { return d.source.y; })
        .attr('x2', function(d) { return d.target.x; })
        .attr('y2', function(d) { return d.target.y; });
});
force.start();

1 个答案:

答案 0 :(得分:2)

如果d3.min.jsstyle.cssSimpleFN.js个文件与ui.Rserver.R文件位于同一目录中,则可以执行以下操作:

<强> ui.R

library(shiny)

shinyUI(fluidPage(tags$head(includeScript("d3.min.js")),
                  includeCSS('style.css'),
    mainPanel(uiOutput("chart"))
    ))

<强> server.R

library(shiny)

shinyServer(function(input, output) {
  output$chart <- renderUI({
    includeScript('SimpleFN.js')
  }) 
})

在我的机器上加载需要几秒钟。如果您不需要该部分被动反应,也可以直接在SimpleFN.js中添加ui.R脚本。