闪亮的自定义输出未渲染

2024-03-11

我正在尝试将 D3.js 的网络可视化绑定到 Shiny 中的自定义输出。由于某种原因,我的渲染函数似乎没有被调用。这是我的代码:

绑定.js

var forceNetworkOB = new Shiny.OutputBinding();

forceNetworkOB.find = function(scope) {
  return $(scope).find("svg.rio-force-network");
};

forceNetworkOB.renderValue = function(el, graph) {

  alert('rendering')

  //actual rendering code here...

};

Shiny.outputBindings.register(forceNetworkOB, "jumpy.forceNetworkOB");

定制IO.R

renderForceNetwork <- function(expr, env=parent.frame(), quoted=FALSE) {

  func <- exprToFunction(expr, env, quoted)

  function() {

    # Never called
    browser()

    graph <- func()

    list(nodes = graph$nodes,
         links = graph$edges
    )
  }
}

forceNetwork <- function(id, width = '400px', height = '400px') {

  tag('svg', list(id = id, class = 'rio-force-network', width = width, height = height))

}

ui.R

library(shiny)
source('customIO.R')

shinyUI(fluidPage(

  tags$script(src = 'js/d3.min.js'),
  tags$script(src = 'js/rbindings.js'),

  titlePanel('Network Visualization'),

  tabsetPanel(
    tabPanel('D3.js Force Layout',
      forceNetwork('vis.force', width = '800px', height = '800px'),
    )
  )

))

和服务器.R

library(shiny)

source('cytoscape.R')
source('customIO.R')

shinyServer(function(session, input, output) {


  # Load the network
  network <- networkFromCytoscape('network.cyjs')

  output$vis.force <- renderForceNetwork({

    # Never called
    print('rendering')
    browser()

    list(
      nodes = data.frame(name = network$nodes.data$Label_for_display, group = rep(1, nrow(network$nodes.data))),
      edges = data.frame(from = network$edges[,1], to = network$edges[,2])
    )

  })

})

从注释中可以看到,我的 R 渲染函数中的 browser() 行从未被调用,js 渲染函数中的alert() 也从未被调用。通过一些 js 调试,我可以看到我的自定义绑定正确地给出了要渲染的 svg 元素及其 id。这可能很简单,但我无法弄清楚。


好吧,虽然代码看起来都是合法的,但你确实必须深入研究 Shiny 的源代码才能找到罪魁祸首。

当 Shiny 初始化时,它会调用initShiny(),然后调用bindOutputs。 现在,这就是bindOutputs函数看起来像:

function bindOutputs(scope) {

  if (scope === undefined)
    scope = document;

  scope = $(scope);

  var bindings = outputBindings.getBindings();

  for (var i = 0; i < bindings.length; i++) {
    var binding = bindings[i].binding;
    var matches = binding.find(scope) || [];
    for (var j = 0; j < matches.length; j++) {
      var el = matches[j];
      var id = binding.getId(el);

      // Check if ID is falsy
      if (!id)
        continue;

      var bindingAdapter = new OutputBindingAdapter(el, binding);
      shinyapp.bindOutput(id, bindingAdapter);
      $(el).data('shiny-output-binding', bindingAdapter);
      $(el).addClass('shiny-bound-output'); // <- oops!
    }
  }

  // Send later in case DOM layout isn't final yet.
  setTimeout(sendImageSize, 0);
  setTimeout(sendOutputHiddenState, 0);
}

我标记的线<- oops是导致所有问题的原因。 这确实不是 Shiny 的 bugper se: 这行代码依赖于jQuery添加一个类el, 哪一个是svg您创建的 DOM 元素forceNetwork()功能。

班上shiny-bound-output对于actual与工作绑定。

问题是$.addClass不适合<svg>.作为一个很好的参考,看这篇文章 http://toddmotto.com/hacking-svg-traversing-with-ease-addclass-removeclass-toggleclass-functions/ or stackoverflow 上的这个问题 https://stackoverflow.com/questions/8638621/jquery-svg-why-cant-i-addclass.

所以,结果是,你的<svg>元素缺少所需的shiny-bound-output可以定制您的课程OutputBinding才能正常运行。


解决方案:

不要使用<svg>作为输出的容器. Use a <div>反而。 这意味着,你应该改变你的forceNetwork函数:

forceNetwork <- function(id, width = '400px', height = '400px') {    
  tag('div', list(id = id, class = 'rio-force-network', width = width, height = height))
}

您可以轻松地附加一个<svg> using d3.select(...).append('svg')并在那里设置宽度和高度。

(记得修改你的find()函数于rbindings.js以及)。


最后一句话

如果你以某种方式添加d3.select(...).append('svg')您的 javascript 代码,请记住clear() the <div>输出绑定中的容器renderValue()实际 d3 绘图之前的函数。不然每次renderForceNetwork被调用时,它将添加一个新的<svg>元素给你的<div>容器。

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

闪亮的自定义输出未渲染 的相关文章

随机推荐

  • Hadoop 减少多种输入格式

    我在 HDFS 中有两个数据格式不同的文件 如果我需要减少两个数据文件 那么作业设置会是什么样子 例如想象一下常见的字数统计问题 在一个文件中使用空格作为世界分隔符 在另一个文件中使用下划线 在我的方法中 我需要针对各种文件格式使用不同的映
  • 谷歌地图用多边形模拟折线

    几年前 我编写了一些代码 突出显示了 Google 地图上的一条路径 其中用户输入了宽度 用户确定突出显示的路径有多宽 以米为单位 这样他们就可以看到他们所覆盖的地面 例如草坪施肥等 我计算了距一个点的距离 并使用 Google 地图com
  • “你的意思?” Lucene.net 中的功能

    有人可以告诉我如何在 Lucene net 中实现 您是说 功能吗 Thanks 你应该调查一下拼写检查器 https svn apache org repos asf lucene lucene net trunk C 23 contri
  • PHP - 电子邮件验证[重复]

    这个问题在这里已经有答案了 可能的重复 电子邮件地址验证 https stackoverflow com questions 1025466 email address validation 你好 我有这个功能来验证电子邮件地址 funct
  • 仅当我省略 usePublicVapidKey 方法时,Firebase Cloud Messaging 的 getToken() 才有效,为什么?

    我在实施 Firebase for Firebase Cloud Messaging FCM 时遇到具体问题 正如您在下面的代码中看到的 messaging usePublicVapidKey
  • Android:无法转换为 java.lang.CharSequence

    我不知道我哪里出了问题 我试图在 recyclerView 中列出食谱的成分 但我无法让 onBindViewHolder 正常工作 无论我尝试过什么 下面是适配器代码以及 xml Recipe class 本质上我需要将 Recipe 类
  • 了解内核-前端通信——为什么我的前端冻结?

    EDIT 只需确认您是否可以重现此内容就会很有用 只需一台计算机即可尝试此操作 无需远程连接 Update似乎其他人无法在 Mac 或 Win7 上重现此问题 因此它要么是 WinXP 特定的 要么是我的机器特定的 此时我要放弃了 最好有一
  • 查找块中游标或表列的数据类型

    可以找出块内游标或变量的列的数据类型without使用系统表 虽然我知道我可以使用系统表来查找此信息 但速度会慢很多 就像是 declare my column data type varchar2 30 begin my column d
  • 如何在Windows 10下卸载Docker Machine

    我没有找到任何从 Windows 10 Edu 中删除 Docker Machine 的解决方案 但 Windows 上的 Docker Machine 文档非常少 我是 Powershell 的新手 所以也许有一个我没有找到的简单命令 g
  • oci_bind_by_name 是什么?

    what is oci bind by name http php net manual en function oci bind by name php为了 我读了 php 手册 但什么也看不懂 请有人向我解释一下 看这个例子 name
  • mongodb中_id的长度有限制吗

    背景 我已经正在接管一个应用程序 原始工程师正在离开 该应用程序充当一些相对较慢的后端服务的缓存层 因为它是 RESTful 风格的 URL 所以每个 URL 都是唯一的 应用程序使用MongoDb作为缓存的存储 并使用哈希值作为缓存 虽然
  • .pgpass 用于 Docker 化环境中的 PostgreSQL 复制

    我尝试使用 Docker 和 bash 脚本 我使用 Coreos 设置 PostgreSQL 从属服务器 我还没有找到任何方法来提供有效的 pgpass 我知道我可以创建一个 PGPASSWORD 环境变量 但出于安全原因不想这样做 如此
  • 有人可以向我指出一个使用最新路由系统的 ember.js 项目吗?如果它也使用 ember-data 则奖励积分

    我正在使用 ember js 制作我的第一个项目 到目前为止尚未找到任何使用新路由系统的示例项目 ember 文档中的所有示例都使用旧的路由 另外 如果有人知道的话 我很想看到一个使用 Ember Data 的项目示例 Thanks 您可以
  • 在 C# 中更改选项卡页时,如何将面板设置为始终位于顶部?

    我在 TabController 中有两个选项卡的程序 我还有一个我想始终放在前面的面板 不管我在哪个标签页 我尝试将面板设置为BringToFront 但是当我更改标签页时这似乎不起作用 有什么建议如何解决这个问题吗 如果面板是包含通过
  • 如何在 MySQL 中滞后列?

    考虑下表 SELECT id value FROM table ORDER BY id ASC id value 12 158 15 346 27 334 84 378 85 546 The id列自动递增但包含间隙 这value列是数字
  • CSS 嵌套 Div 具有绝对位置?

    这是一个更为复杂的案例的再现 div style width 200px background color red AS HDSKLAJD KLASJD KLASJ DKLASJDKL JASKLD JKLAS JDKLASD AS HDS
  • 如何在连接到 lein swank 的 ClojureBox (EmacsW32) REPL 中抑制 ^M 字符

    我正在从我的服务器连接到一个 swank 服务器ClojureBox http clojure billhugh com安装 IE lein swank从我的项目目录然后M x slime connect来自 EmacsW32 然而 当我这
  • 如何在方案中调试gimp的script-fu脚本?

    我尝试使用 script fu scheme 为 gimp 制作一些脚本 当然 作为一个初学者 会有很多错误和误解 现在我正在寻找一种调试这些脚本的方法 我找到了 gimp message 但结果没有显示 我不知道是否有可能将调试消息打印到
  • Magento 2:“找不到所请求的商店。请验证商店并重试。”

    每次我从英语商店视图切换到意大利语商店视图 反之亦然 时 它都会将我带到等效的主页 无论我在哪里 并抛出此错误 这是我的设置 Magento 2 3 4 全新安装 自托管 1 个网站 1 个商店 2 个商店浏览次数 对于每个商店视图一个不同
  • 闪亮的自定义输出未渲染

    我正在尝试将 D3 js 的网络可视化绑定到 Shiny 中的自定义输出 由于某种原因 我的渲染函数似乎没有被调用 这是我的代码 绑定 js var forceNetworkOB new Shiny OutputBinding forceN