我正在尝试将 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。这可能很简单,但我无法弄清楚。