d2 r2d3
var d3Script = function(d3, r2d3, data, svg, width, height, options, theme, console) {
this.d3 = d3;
svg = d3.select(svg.node());
http://curran.github.io/screencasts/introToD3/examples/viewer/#/6
SVG Example

var height = 250; //console.log("h"+height);
var width = 250; //console.log("w"+width);
var bars = r2d3.svg.selectAll('rect');
bars
.data(r2d3.data)
.enter().append('rect')
.attr('x', function(d){ return d.x; })
.attr('y', function(d){ return d.y; })
.attr('width', 100)
.attr('height', 100)
.attr('fill',function(d){ return d.color; })
.attr("d", function(d) { return d; })
.on("click", function(){
Shiny.setInputValue(
id="bar_clicked",
value=d3.select(this).attr("d", function(d){ return d;}),
{priority: "event"}
);
});
bars.exit().remove();
library("r2d3")
ui <- fluidPage(
verbatimTextOutput("selected"),
d3Output("d3")
)
server <- function(input, output) {
dd00 <- data.table( x=c(0,120, 0),
y=c(0, 0,120),
color=c("red","rgba(0,255,0,0.5)","#0000FF"))
output$d3 <- renderD3({
r2d3(dd00, script = "bar3.js")
})
output$selected <- renderText({
bar_value <- input$bar_clicked %>% req() %>% unlist()
if(!is.null(bar_value)) bar_value
})
}
shinyApp(ui, server)
circle

var shape = r2d3.svg.selectAll('circle');
shape
.data(r2d3.data)
.enter().append('circle')
.attr('r', 16)
.attr('cx', function(d){ return d.x + 60; })
.attr('cy', function(d){ return d.y + 60; })
.attr('fill', "none")
.attr('stroke', function(d){ return d.color; })
.attr('stroke-width', "6")
.attr("d", function(d) { return d; })
shape.exit().remove();
line, path,
Array
var height = 250;
var width = 250;
console.log(r2d3.data);
console.log("x0 = " + r2d3.data[0].x);
console.log("y0 = " + r2d3.data[0].y);
console.log("x1 = " + r2d3.data[1].x);
console.log("y1 = " + r2d3.data[1].y);
console.log("x2 = " + r2d3.data[2].x);
console.log("y2 = " + r2d3.data[2].y);
r2d3.data.forEach(function (d){
console.log(d.x + "," +d.y);
});
https://rstudio.github.io/r2d3/articles/gallery/population/
http://www.r2d3.us/decision-trees-part-1-v1/
참고> r2d3 object
> r2d3
function R2D3(el, width, height) {
var self = this;
var x = null;
var version = null;
self.data = null;
self.shadow = null;
self.root = self.svg = self.canvas = null;
self.width = 0;
self.height = 0;
self.options = null;
self.resizer = null;
self.renderer = null;
self.rendererDefaut = true;
self.captureErrors = null;
self.theme = {};
self.style = null;
self.useShadow = true;
self.setX = function(newX) {
x = newX;
self.data = x.data;
if (x.type == "data.frame") {
self.data = HTMLWidgets.dataframeToD3(self.data);
}
if (x.theme) {
self.theme = themeCapable() ? x.theme.runtime : x.theme.default;
}
self.options = x.options;
if (!x.useShadow) {
self.useShadow = false;
}
};
self.setContainer = function(container) {
self.container = container;
};
self.setRoot = function(root) {
self.root = self.svg = self.canvas = root;
};
var createContainer = function() {
if (self.container == "svg")
return document.createElementNS("http://www.w3.org/2000/svg", "svg");
else
return document.createElement(self.container);
};
self.createRoot = function() {
if (self.shadow === null) {
if (self.useShadow && el.attachShadow) {
self.shadow = el.attachShadow({
mode: "open"
});
}
else {
self.shadow = el;
}
}
if (self.root !== null) {
self.d3().select(self.shadow).select(self.container).remove();
self.setRoot(null);
}
var container = createContainer();
self.shadow.appendChild(container);
var root = self.d3().select(container)
.attr("width", self.width)
.attr("height", self.height);
if (self.theme.background) root.style("background", self.theme.background);
if (self.theme.foreground) {
root.style("fill", self.theme.foreground);
root.style("color", self.theme.foreground);
}
self.setRoot(root);
self.addStyle();
};
self.setWidth = function(width) {
self.width = width;
};
self.setHeight = function(height) {
self.height = height;
};
self.onRender = function(renderer) {
self.renderer = renderer;
self.rendererDefaut = false;
};
self.onResize = function(resizer) {
self.resizer = resizer;
};
self.render = function() {
if (self.renderer === null) return;
try {
self.renderer(self.data, self.root, self.width, self.height, self.options);
}
catch (err) {
self.showError(err, null, null);
}
};
self.resize = function() {
if (self.resizer === null) return;
try {
self.resizer(self.width, self.height);
}
catch (err) {
self.showError(err, null, null);
}
};
var simpleHash = function(data) {
var step = Math.max(1, Math.floor(data.length / 1000));
var hash = 0;
for (var idx = 0; idx < data.length; idx += step) {
\t\t hash = ((hash << 5) - hash) + data.charCodeAt(idx);
\t\t hash = hash & hash;
}
return Math.abs(hash) % 1000;
};
self.addScript = function(script) {
var el = document.createElement("script");
el.type = "text/javascript";
var debugHeader = "//# sourceURL=r2d3-script-" + simpleHash(script) + "\
";
el.text = debugHeader + script;
self.captureErrors = function(msg, url, lineNo, columnNo, error) {
self.showError({
message: msg,
stack: null
}, lineNo, columnNo);
};
document.head.appendChild(el);
self.captureErrors = null;
};
self.setStyle = function(style) {
self.style = style;
};
self.addStyle = function() {
if (!self.style) return;
var el = document.createElement("style");
el.type = "text/css";
if (el.styleSheet) {
el.styleSheet.cssText = self.style;
} else {
el.appendChild(document.createTextNode(self.style));
}
self.root.node().appendChild(el);
};
self.setVersion = function(newVersion) {
version = newVersion;
};
self.d3 = function() {
switch(version) {
case 3:
return window.d3;
case 4:
return window.d3v4;
case 5:
return window.d3v5;
}
};
var consoleLog = function(data) {
console.log(data);
var entry = document.createElement("div");
lastConsoleEntry = entry;
entry.style.bottom = "0";
entry.style.left = "0";
entry.style.right = "0";
entry.style.background = "rgb(244, 248, 249)";
entry.style.border = "1px solid #d6dadc";
entry.style.padding = "8px 15px 8px 15px";
entry.style.position = "absolute";
entry.style.fontFamily = "'Lucida Sans', 'DejaVu Sans', 'Lucida Grande', 'Segoe UI', Verdana, Helvetica, sans-serif, serif";
entry.style.fontSize = "9pt";
self.shadow.appendChild(entry);
entry.style.transform = "translateY(40px)";
entry.style.opacity = "0";
entry.style.transition = "all 0.25s";
entry.onmouseenter = function(e) {
consoleHovering = true;
};
entry.onmouseleave = function(e) {
if (lastConsoleEntry == e.target) consoleHovering = false;
};
setTimeout(function() {
entry.style.transform = "translateY(0)";
entry.style.opacity = "1";
entry.style.transition = "all 0.5s";
}, 50);
entry.innerText = data;
(function(entry) {
setTimeout(function() {
var hideConsole = function() {
entry.style.opacity = "0";
entry.addEventListener("transitionend", function(event) {
event.target.parentNode.removeChild(event.target);
});
};
var retryHide = function() {
if (consoleHovering && lastConsoleEntry == entry) {
setTimeout(retryHide, 100);
}
else {
hideConsole();
}
};
retryHide();
}, 3000);
})(entry);
};
var consoleHovering = false;
var lastConsoleEntry = null;
var createConsoleOverride = function(type) {
return function(data) {
consoleLog(type + data);
};
};
self.console = {
assert: console.assert,
clear: console.clear,
count: console.count,
error: createConsoleOverride("Error: "),
group: console.group,
groupCollapsed: console.groupCollapsed,
groupEnd: console.groupEnd,
info: createConsoleOverride("Info: "),
log: createConsoleOverride(""),
table: console.table,
time: console.time,
timeEnd: console.timeEnd,
trace: console.trace,
warn: console.warn
};
self.callD3Script = function() {
var d3Script = self.d3Script;
try {
d3Script(self.d3(), self, self.data, self.root, self.width, self.height, self.options, self.theme, self.console);
}
catch (err) {
self.showError(err, null, null);
}
};
self.widgetRender = function(x) {
self.setX(x);
self.setWidth(width);
self.setHeight(height);
if (!self.root) {
self.setVersion(x.version);
self.setStyle(x.style);
self.addScript(x.script);
self.d3Script = d3Script;
self.setContainer(x.container);
self.createRoot();
self.callD3Script();
}
self.render();
if (self.renderer === null) {
self.renderer = function(data, container, width, height, options) {
self.callD3Script();
};
}
if (self.resizer === null) {
self.resizer = function(width, height) {
self.createRoot();
self.callD3Script();
if (!self.rendererDefaut) self.render();
};
}
};
self.debounce = function(f, wait) {
var timeout = null;
return function() {
if (timeout) window.clearTimeout(timeout);
timeout = window.setTimeout(f, wait);
};
};
self.resizeDebounce = self.debounce(self.resize, 100);
self.widgetResize = function(width, height) {
self.root
.attr("width", width)
.attr("height", height);
self.setWidth(width);
self.setHeight(height);
self.resizeDebounce();
};
var openSource = function(filename, line, column, domain, highlight) {
if (window.parent.postMessage) {
window.parent.postMessage({
message: "openfile",
source: "r2d3",
file: filename,
line: line,
column: column,
highlight: highlight
}, domain);
}
};
var themesLoaded = false;
var registerTheme = function(domain) {
domain = domain ? domain : window.location.origin;
if (window.parent.postMessage) {
window.addEventListener('message', function(event) {
if (typeof event.data != 'object')
return;
\tif (event.origin !== domain)
\t return;
\t if (event.data.message !== "ontheme")
return;
document.body.style.background = event.data.background;
self.theme.background = event.data.background;
self.theme.foreground = event.data.foreground;
\t
\t// resize to give script chance to pick new theme
\tif (themesLoaded) self.resize();
\tthemesLoaded = true;
}, false);
window.parent.postMessage({
message: "ontheme",
source: "r2d3"
}, domain);
}
};
var errorObject = null;
var errorLine = null;
var errorColumn = null;
var errorFile = null;
var errorHighlightOnce = false;
var hostDomain = null;
var queryParameter = function(param) {
var query = window.location.search.substring(1);
var entries = query.split('&');
for (var idxEntry = 0; idxEntry < entries.length; idxEntry++) {
var params = entries[idxEntry].split('=');
if (decodeURIComponent(params[0]) == param) {
return decodeURIComponent(params[1]);
}
}
return null;
};
var themeCapable = function() {
return queryParameter("capabilities") === "1";
};
var registerMessageListeners = function(event) {
if (!themeCapable()) {
hostDomain = null;
} else {
hostDomain = queryParameter("host");
registerTheme(hostDomain);
}
};
var cleanStackTrace = function(stack) {
var cleaned = stack.substr(0, stack.indexOf("at d3Script"));
cleaned = cleaned.replace(new RegExp("\\\\(.*/session/view[^/]*/lib/[^/]+/", "g"), "(");
cleaned = cleaned.replace(new RegExp("\\\\(.*/session/view[^/]*/", "g"), "(");
return cleaned;
};
var parseLineFileRef = function(line) {
var lines = x.script.split("\
");
line = Math.min(lines.length - 1, line);
var header = "/* R2D3 Source File: ";
var file = null;
for (var maybe = line; line && maybe >= 0; maybe--) {
if (lines[maybe].includes(header)) {
var data = lines[maybe].split(header)[1];
var source = data.split("*/")[0].trim();
line = line - (maybe + 2);
file = source;
break;
}
}
return {
file: file,
line: line
};
};
var parseCallstackRef = function(callstack) {
var reg = new RegExp("at [^\\\
]+ \\\\((|r2d3-script-[0-9]+):([0-9]+):([0-9]+)\\\\)");
var matches = reg.exec(callstack);
if (matches && matches.length === 4) {
var line = parseInt(matches[2]);
var column = parseInt(matches[3]);
var file = null;
var lineRef = parseLineFileRef(line);
if (lineRef) {
file = lineRef.file;
line = lineRef.line;
}
return {
file: file,
line: line,
column: column
};
}
else {
return null;
}
};
var createSourceLink = function(path, line, column, domain) {
var name = baseName(path);
var linkEl = document.createElement("a");
linkEl.innerText = "(" + name + "#" + line + ":" + column + ")";
linkEl.href = "#";
linkEl.color = "#4531d6";
linkEl.style.display = "inline-block";
linkEl.style.textDecoration = "none";
linkEl.onclick = function() {
openSource(path, line, column, domain, false);
};
return linkEl;
};
var baseName = function(path) {
var parts = path.split(new RegExp("/|\\\\\\\\"));
return parts[parts.length - 1];
};
var showErrorImpl = function() {
var message = errorObject, callstack = "";
if (errorObject.message) message = errorObject.message;
if (errorObject.stack) callstack = errorObject.stack;
if (errorLine === null || errorColumn === null) {
var parseResult = parseCallstackRef(callstack);
if (parseResult) {
errorFile = parseResult.file;
errorLine = parseResult.line;
errorColumn = parseResult.column;
}
}
else {
var parseLineResult = parseLineFileRef(errorLine);
if (parseLineResult) {
errorFile = parseLineResult.file;
errorLine = parseLineResult.line;
}
}
if (errorFile) {
message = message + " in ";
}
var container = document.getElementById("r2d3-error-container");
if (!container) {
container = document.createElement("div");
self.shadow.appendChild(container);
}
else {
container.innerHTML = "";
}
container.id = "r2d3-error-container";
container.style.fontFamily = "'Lucida Sans', 'DejaVu Sans', 'Lucida Grande', 'Segoe UI', Verdana, Helvetica, sans-serif, serif";
container.style.fontSize = "9pt";
container.style.color = "#444";
container.style.position = "absolute";
container.style.top = "0";
container.style.left = "8px";
container.style.right = "8px";
container.style.overflow = "scroll";
container.style.lineHeight = "16px";
var header = document.createElement("div");
header.innerText = "Error: " + message.replace("\
", "");
header.style.marginTop = "8px";
header.style.background = "rgb(244, 248, 249)";
header.style.border = "1px solid #d6dadc";
header.style.padding = "8px 15px 8px 15px";
header.style.lineHeight = "24px";
container.appendChild(header);
if (errorFile) {
if (hostDomain) {
if (!errorHighlightOnce) {
openSource(errorFile, errorLine, errorColumn, hostDomain, true);
errorHighlightOnce = true;
}
var linkEl = createSourceLink(errorFile, errorLine, errorColumn, hostDomain);
header.appendChild(linkEl);
}
else {
header.innerText = "Error: " + message.replace("\
", "") + " " + errorFile + "#" + errorLine + ":" + errorColumn;
}
}
if (callstack) {
var stack = document.createElement("div");
var cleanStack = cleanStackTrace(callstack);
stack.style.display = "block";
stack.style.border = "1px solid #d6dadc";
stack.style.padding = "12px 15px 12px 15px";
stack.style.background = "#FFFFFF";
stack.style.borderTop = "0";
var allEmpty = true;
var entries = cleanStack.split("\
");
for (var idxEntry in entries) {
var entry = entries[idxEntry];
var stackEl = document.createElement("div");
var stackRes = parseCallstackRef(entry);
if (idxEntry === "0") {
header.appendChild(document.createElement("br"));
header.appendChild(document.createTextNode(entry));
} else if (hostDomain && stackRes) {
stackEl.innerText = entry.substr(
0,
Math.max(entry.indexOf("( 0) stack.appendChild(stackEl);
}
if (stack.childElementCount > 0)
container.appendChild(stack);
}
};
self.showError = function(error, line, column) {
errorObject = error;
errorLine = line;
errorColumn = column;
showErrorImpl();
};
window.onerror = function (msg, url, lineNo, columnNo, error) {
if (self.captureErrors) {
self.captureErrors(msg, url, lineNo, columnNo, error);
}
return false;
};
registerMessageListeners();
}