d2 r2d3

Published by onesixx on

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();
}
Categories: ggplot2

onesixx

Blog Owner

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x