如何将数据驱动的 d3JS 图与 Shiny 集成?

2024-04-17

昨天我问 https://stackoverflow.com/questions/29301352如何将带有独立数据的 d3js javacript 文件引入 Shiny 中以绘制力网络图。现在我正在寻找下一步:server.R 将读取 JSON 数据文件以在图表中显示。我一直在努力适应这个例子 https://stackoverflow.com/questions/26650561/binding-javascript-d3-js-to-shiny它使用 messageHandlers 将数据传递到 d3JS。这超出了我的专业知识,所以我正在寻求一些帮助。我很确定是在 messageHandler 中出了问题。

我很乐意发布完整的工作示例,因为这将使我对 R、Shiny 和 d3JS 集成的理解达到一个新的水平。 PS:是的,我看过networkD3和其他工具。我的 d3JS 图表比这里的简单示例复杂得多。 :) 接下来的步骤还包括使图表对在 Shiny 中选择输入做出反应,但我当然需要首先解决这个问题。 太感谢了! 蒂姆

ui.R - 按下按钮,接收图表!

shinyUI(fluidPage(
  titlePanel("Shiny Binding to d3JS"),
  sidebarLayout(
    sidebarPanel(
      tags$head(tags$link(rel = "stylesheet", type = "text/css", href = "twoNodes.css")),
      actionButton("var_run",label="Create Graph!")
      ),
    mainPanel(
      h3("D3JS FN OUTPUT:"),
      # load D3JS library
      tags$script(src="d3.min.js"),
      # load javascript
      tags$script(src="twoNodes.js"),
      # create div
      tags$div(id="div_graph")
    )
  )
)) 

server.R - 当前读取两个节点及其链接。在现实生活中,它会查询数据存储。

library(shiny)
library(rjson)
# Read JSON from the file
json_data <- fromJSON(file="twoNodes.JSON")

shinyServer(
  function(input, output, session) {
    # exception handler for when action button is clicked
    # session$sendCustomMessage is where things start to fall apart
    observe({
      if (input$var_run == 0){
        return()
      } 
      session$sendCustomMessage(type="jsondata",json_data)
      })
  }
)

TwoNodes.JSON - 数据

{
        "nodes":[
          {"id":0,"name":"Observations","group":"1"},
          {"id":1,"name":"DataSet","group":"2"}
          ],
        "edges":[
          {"source":0,"target":1,"value":""}
          ]
    }

TwoNodes.css - 样式表

#nodegroup1{
    fill:#000000;
    fon-family: Serif, Georgia;
    font-size: 14px;   
     font-weight: bold;
  }              
  .nodetext{
     font-size:8;
     color: red;
  }
  .edgelabel{
    font-size:12px;
    fill:darkblue;
  }
  .edges{
    stroke: #ccc;
    stroke-width: 2;
   }

两个 Nodes.is - 我试图利用的 d3JS 魔力

Shiny.addCustomMessageHandler("jsondata",
  function(message){
    var dataset = [message];

   d3.select("#tempID").remove()

  // lines from original d3JS follow
  //Width and height for SVG area
  var w = 300;
  var h = 200;
  // changed from body to #div_graph. Added tempID
  var svg = d3.select("#div_graph").append("svg")
              .attr("id","tempID")
              .attr("width", w)
              .attr("height", h);

  svg.append("text")
     .text("Two Nodes in a Force Network")
     .attr("x",10)
     .attr("y",15);

// Data source   - Now comes in with message handler
// d3.json("/d3/CubeStructure/twoNodes.JSON", function(dataset) {

  var force = d3.layout.force()
                .nodes(dataset.nodes)
                .links(dataset.edges)
                .gravity(.05)
                .charge(-180)
                .linkDistance(100)
                .size([w, h])
                .start();
  var drag = force.drag()
                  .on("dragstart", dragstart);

  var edges = svg.selectAll("line")
                 .data(dataset.edges)
                 .enter()
                 .append("line")
                 .attr("id",function(d,i){return 'edge'+i})
                 .attr("class", "edges")
                 .attr("marker-end", "url(#end)");  

  var nodes = svg.selectAll("g.node")
                 .data(dataset.nodes)
                 .enter()
                 .append("g")
                 .attr("class", "node")
                 .on("dblclick", dblclick)
                 .call(drag);
  nodes.append("circle")
       .attr("r", 10)
       .style("stroke", "black") 
       // Mousover Node - highlight node by fading the node colour during mouseover
       .on('mouseover', function(d){
            var nodeSelection = d3.select(this).style({opacity:'0.5'});
       })
       //Mouseout Node  - bring node back to full colour   
       .on('mouseout', function(d){
            var nodeSelection= d3.select(this).style({opacity:'1.0',}) 
       })

 // Node label
  nodes.append("text")
       .attr("class", "nodetext")
       .attr("dx", 12)
       .attr("dy", ".35em")
       .attr("id", function(d,i){return 'nodegroup1'}) // all get the same style
       .text(function(d) { return d.name });            // Just the name
  // Paths along which to apply the edge label
  var edgepaths = svg.selectAll(".edgepath")
                     .data(dataset.edges)
                     .enter()
                     .append('path')
                     .attr({'d': function(d) {return 'M '+d.source.x+' '+d.source.y+' L '+ d.target.x +' '+d.target.y},
                            'class':'edgepath',
                            'fill-opacity':0,
                            'stroke-opacity':0,
                            'fill':'blue',
                            'stroke':'red',
                            'id':function(d,i) {return 'edgepath'+i}})
                     .style("pointer-events", "none");
  // dx : the starting distance of the label from the source node
  var edgelabels = svg.selectAll(".edgelabel")
                      .data(dataset.edges)
                      .enter()
                      .append('text')
                      .style("pointer-events", "none")
                     .attr({'class':'edgelabel',
                             'id':function(d,i){return 'edgelabel'+i},
                             'dx':40,
                             'dy':0
                            }) ;
    force.on("tick", function() {
             edges.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; });
    nodes.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

    edgepaths.attr('d', function(d) { var path='M '+d.source.x+' '+d.source.y+' L '+ d.target.x +' '+d.target.y;
                                        //console.log(d)
                                        return path});       
    // positioning of the label along the edge
    edgelabels.attr('transform',function(d,i){
                 if (d.target.x<d.source.x){
                   bbox = this.getBBox();
                   rx = bbox.x+bbox.width/2;
                   ry = bbox.y+bbox.height/2;
                   return 'rotate(180 '+rx+' '+ry+')';
                 }
                 else {
                   return 'rotate(0)';
                 }
    });
  });     
  // });  // not needed due to msg handler End of reading in JSON from file 
  // Double click to 'unfix' the node and have forces start to act on it again.
  function dblclick(d) {
    d3.select(this).classed("fixed", d.fixed = false);
  }
  // Set the "fixed" property of the dragged node to TRUE when a dragstart event is initiated,
  //   - removes "forces" from acting on that node and changing its position.
  function dragstart(d) {
    d3.select(this).classed("fixed", d.fixed = true);
  }
  }); // end of new function

你已经相当接近了。只需稍作修改即可使用; TwoNodes.js 中的第 3 行应该是

var dataset = message;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将数据驱动的 d3JS 图与 Shiny 集成? 的相关文章

  • 按具有作业的组划分的 R 分位数

    我有以下 df group rep seq 1 3 30 variable runif 90 5 0 7 5 df data frame group variable 我需要 i 按组定义分位数 ii 将每个人分配到相对于其组的分位数 因此
  • R-在多个图的外缘绘制居中图例

    我想在具有多个绘图的设备中的绘图区域之外绘制居中图例 SO 中提出了许多关于更改 R 图中图例位置的问题 略有不同 例如 1 R 组合图的通用标题和图例 https stackoverflow com questions 8736966 r
  • 将文本放置在矩形的中心

    在下面的代码中 文本没有放置在矩形的中心 我使用的是 attr dx x bandwidth 2 attr dy y bandwidth 2 有没有办法将文本中心放置在矩形中 而不是反复试验 目前它看起来像这样 朝底部和朝右 以下是我的代码
  • 抑制 R 中的错​​误消息

    我正在 R 中运行模拟研究 有时 我的模拟研究会产生错误消息 当我在函数中实现模拟研究时 当出现此错误消息时模拟停止 我知道抑制错误是不好的做法 但此时对我来说 除了抑制错误然后继续下一个模拟 直到达到我喜欢运行的模拟总数为止 没有其他选择
  • 在 Shiny 应用程序中过滤数据时,长度为 1 的字符向量除了第一个元素之外的所有元素都将被忽略错误

    我有以下闪亮的应用程序 library shiny library rhandsontable library shinydashboard library ggplot2 library dplyr setwd C Users Marc
  • 栅格堆叠后如何写入?

    我想操作几个光栅文件 然后再次写入它们 rasterfiles lt list files C data envi full names TRUE d1 lt overlay stack rasterfiles fun function x
  • R lubridate:当地语言的工作日

    如何获取本地语言的工作日和月份 My code library lubridate data lt c 10 02 2015 11 03 2015 data lubri lt dmy data wday data lubri label T
  • 有没有一种简单的方法可以根据多个标准进行排名,从而保留 R 中的联系?

    当单个标准排序良好时 rank 函数会返回明显的结果 rank c 2 4 1 3 5 1 2 4 1 3 5 当单个标准具有联系时 排名函数 默认情况下 将平均排名分配给联系 rank c 2 4 1 1 5 1 3 0 4 0 1 5
  • 具有动态变量数的公式

    假设有一些 data framefoo data frame想要找到目标列的回归Y由其他一些专栏 为此目的 通常使用一些公式和模型 例如 linear model lt lm Y FACTOR NAME 1 FACTOR NAME 2 fo
  • R:根据元素长度从向量中删除元素

    如何根据字符串的字符数或长度从字符串向量中删除元素 df lt c asdf fweafewwf af aewfawefwef awefWEfawefawef gt df 1 asdf fweafewwf af aewfawefwef aw
  • R:如何找到向量的模式[重复]

    这个问题在这里已经有答案了 下面是我的data frame我想知道每个内存类别 1 到 8 的模式是什么 gt dput d structure list MEMORY1 c 5 5 7 1 5 6 4 5 4 5 5 4 1 5 5 2
  • matplotlib 中的 R 风格数据轴缓冲区

    R 绘图自动设置 x 和 y 限制 以在数据和轴之间留出一些空间 我想知道 matplotlib 是否有办法自动执行相同的操作 如果没有 是否有一个好的公式或 经验法则 来说明 R 如何设置其轴限制 在 matplotlib 中 您可以通过
  • ggplot 图例标签内的希腊字母、符号和换行符

    我在尝试着 有换行符 自动或强制 对齐文本 左对齐或左右对齐 有希腊字母和百分号 在 gglot 图例标签内 我尝试了几种方法 但我似乎无法将我读到的所有技巧结合起来 我可以通过插入来换行 n进入标签 但这似乎不适用于希腊字母 不适用于图例
  • 将不同的 grViz 组合成一个图

    我想结合不同的DiagrammeR绘制成一个图形 生成的图如下例所示 library DiagrammeR pDia lt grViz digraph boxes and circles a graph statement graph ov
  • 使用自定义渐变填充直方图箱

    我想在 R 和 ggplot2 中创建一个直方图 其中根据连续的 x 值填充箱 大多数教程仅通过离散值或密度 计数进行着色 下列的这个例子 https stackoverflow com questions 40284227 how to
  • R闪亮主面板显示样式和字体

    我正在学习闪亮的应用程序 并且有一些关于调整布局的基本问题 特别是样式和字体 希望得到指点或明确的答案 谢谢 考虑一个基本的输入输出应用程序 用户在 sidebarPanel 中输入数据 然后在 mainPanel 中反应性地输出结果 如何
  • 美人鱼图:调整图表周围的空白

    我在用 Rstudio 编译的 Rmd 报告中使用了美人鱼图 在 HTML PDF 输出中 图表上方和下方有大量空白 请参见下面的示例 Header Text r library DiagrammeR mermaid graph TD cl
  • 如何有效地将多个光栅 (.tif) 文件导入 R

    我是 R 新手 尤其是在空间数据方面 我正在尝试找到一种方法来有效地将多个 600 单波段栅格 tif 文件导入到 R 中 所有文件都存储在同一文件夹中 不确定这是否重要 但请注意 在我的 Mac 和 Windows 并行 VM 上的文件夹
  • R data.table 连接不等式条件

    我想使用 data table 包根据多个不等式条件对数据进行子集化 data table 手册中的示例展示了如何使用字符变量执行此操作 但不显示数字不等式 我还了解了如何使用子集函数来执行此操作 但我真的很想利用 data table 二
  • R闪亮:使用闪亮的JS从数据表中获取信息

    我想读出所有列名称以及它们在数据表中显示的顺序 由于不同的原因 我无法使用 stateSave 等选项 我对 JS 没有什么把握 但我确信用它可以完成 所以我需要你帮助我 我尝试过类似的代码片段 datatable data callbac

随机推荐

  • ACRA 行号不正确

    我使用 android proguard ACRA 谁能告诉我为什么我收到的崩溃报告的行号不正确 行号显然指向错误的陈述 我无法知道崩溃的确切行号 因此无法修复用户报告的错误 这真的很烦人 谢谢 PS 我使用的是我发布的版本对应的映射文件
  • 如何设置 QBrush 的颜色动画

    我想要动画颜色QBrush 更多详情请看下面的代码 这是我的 h 文件 class Cell public QObject public QGraphicsRectItem Q OBJECT Q PROPERTY QBrush brush
  • Jquery 动态更改链接扩展名

    我在很多页面都设置了链接 例如 ul li a href someurl somefile html Some file a li li a href someurl somefile1 html Some file1 a li li a
  • CMake+Xcode:应用程序存档失败,具体取决于同一解决方案中的库。在 BUILD_TREE 而不是 Xcode/DerivedData 中构建 Archive?

    几周前 我们移植了代码库以使用 CMake 进行构建管理 我们现在意识到 当我们试图做到这一点时 存在一个重大问题Archive依赖于同一 Xcode 解决方案中构建的一个 或多个 库的应用程序 链接器失败 因为它找不到所依赖的库 并且该库
  • 以编程方式更改小部件的渐变背景

    我正在努力实现的目标 int colors new int colorDark colorLight GradientDrawable gd new GradientDrawable TOP BOTTOM colors remoteView
  • IIS 7.5 405 不允许从 StaticFileModule 进行 PUT 方法

    我将第 3 方 xml 编辑器集成到我们的 Web 应用程序中 并且保存函数直接对 Web 服务器上的文件执行 HTTP PUT 操作系统是使用 IIS 7 5 的 Windows Server 2008 R2 我们安装了 Web API
  • 使用 API 蓝图记录查询参数

    我正在尝试在 API 蓝图中记录查询参数 但我不完全确定我是否正确完成了操作 该资源如下所示 DELETE http baasar apiary mock com user appId userId 该请求将停用用户 而以下请求将删除用户对
  • 中可以有 吗?

    故事如下 我正在使用 SWFObject 将 Flash 对象插入到我的页面中 嵌入吃掉了我的span 所以 我为此失去了所有 CSS 我正在考虑将所有 CSS 移至父级 这样当 Flash 出现时我就不会丢失 CSS 样式 我尝试过使用s
  • CSS :focus-within 选择器,用于具有 iframe 子元素的元素

    我有一个这样的场景 container background yellow padding 40px container focus within background red iframe background white div cla
  • 异步作业出错

    我正在尝试创建一个不会阻止请求的异步任务 用户发出请求 任务将启动 控制器将呈现 作业正在运行 这是为了避免请求被阻止等待任务完成 任务完成后 它将执行 onComplete 并对该任务的结果执行某些操作 例如调用将向用户发送邮件的服务 E
  • 循环遍历 Silverlight DataGrid 中的行

    我有一种感觉 我在这里遗漏了一些明显的东西 但我找不到迭代 DataGrids DataGridRow 集合的方法 我有一个网格 其中包含我的班级集的集合的项目源 我试图迭代这些行并突出显示满足特定条件的任何行 但我一生都看不到如何实现 您
  • 在循环语句中生成 MVC3 RadioButton 列表

    我的一位同事创建了一个模型 如下所示 Model Serializable public class ModifyCollegeListModel public List
  • HTTP 错误 999:请求被拒绝

    我正在尝试使用 BeautifulSoup 从 LinkedIn 抓取一些网页 但不断收到错误 HTTP 错误 999 请求被拒绝 有没有办法避免这个错误 如果您查看我的代码 我尝试过 Mechanize 和 URLLIB2 两者都给了我相
  • 如何在 Visual Studio 2019 的 CMakeLists.txt 中启用 clang-tidy?

    视觉工作室 2019文档 https learn microsoft com en us visualstudio code quality clang tidy view只谈改变CMakeSettings json启用clang tidy
  • 为什么标题重复了?

    我正在获取当前正在播放的歌曲 捕获标题和艺术家 并将其存储在解析中 由于某种原因 当歌曲播放时 程序会添加 4 首左右相同的标题 艺术家 相反 我只想要一个 我该如何解决 在解析数据浏览器中看到的我的对象 https i stack img
  • 通过 PageController 路由除现有控制器之外的所有请求 (Zend Framework)

    对于新的 CMS 我开发了一个页面模块 它允许我管理网站的树结构 每个页面都可以通过 url 访问http www example com pageslug http www example com pageslug 其中pageslug
  • 亚马逊 Linux 上的 mysql - MySQL 守护进程无法启动

    我尝试重新启动 EC2 实例并sudo service httpd restart 但我仍然收到这样的消息 ec2 user ip sudo service mysqld start MySQL Daemon failed to start
  • Unicode 对象必须在哈希错误之前进行编码

    处理类似问题的问题 SO 1 https stackoverflow com questions 7585307 typeerror unicode objects must be encoded before hashing SO 2 h
  • 更新 Python virtualenv? [复制]

    这个问题在这里已经有答案了 能够更新使用生成的虚拟环境将非常方便virtualenv system site packages path to myvirtenv考虑到基础 Python 中所做的更改 例如 如果已在 virtualenv
  • 如何将数据驱动的 d3JS 图与 Shiny 集成?

    昨天我问 https stackoverflow com questions 29301352如何将带有独立数据的 d3js javacript 文件引入 Shiny 中以绘制力网络图 现在我正在寻找下一步 server R 将读取 JSO