Используйте объект R data.frame в d3.js, используя r2d3 - PullRequest
3 голосов
/ 14 марта 2019

Я пытаюсь понять, как кадр данных R передается в сценарий d3.js с помощью пакета r2d3. Было бы полезно расширение примера гистограммы r2d3 для доступа к переменным в объекте data.frame.

R код:

library(r2d3)
data <- data.frame(nums = c(0.3, 0.6, 0.8, 0.95, 0.40, 0.20))
r2d3(data, script = "test.js")

JS код:

var barHeight = Math.floor(height / data.length);

svg.selectAll('rect')
  .data(data.nums)
  .enter().append('rect')
    .attr('width', function(d) { return d * width; })
    .attr('height', barHeight)
    .attr('y', function(d, i) { return i * barHeight; })
    .attr('fill', 'steelblue');

Ошибка:

Error: svg.selectAll(...).data(...).enter is not a function in (test.js#5:4)
TypeError: svg.selectAll(...).data(...).enter is not a function

1 Ответ

4 голосов
/ 14 марта 2019

Эта ошибка возникает из-за того, что data.nums не определено.

Ваша переменная data не является объектом, содержащим массив следующим образом:

var data = {
      nums: [0.3,0.6,0.8,0.95,0.40,0.20]
    }

Но, скорее, массив, содержащий объекты:

var data = [
  {nums:0.3},
  {nums:0.6},
  {nums:0.8},
  {nums:0.95},
  {nums:0.40},
  {nums:0.2}
]

Чтобы сохранить сторонний код r, нам просто нужно передать сам массив данных в selection.data() и получить доступ к свойству nums каждого элемента данных:

var barHeight = Math.floor(height / data.length);

svg.selectAll('rect')
  .data(data)
  .enter().append('rect')
    .attr('width', function(d) { return d.nums * width; })
    .attr('height', barHeight)
    .attr('y', function(d, i) { return i * barHeight; })
    .attr('fill', 'steelblue');
...