2015-04-10 1 views
4

Использование d3.js v3.55, crossfilter.js v1.311 и dc.js v1.73 и попытка создания функция уменьшения, которая возвращает среднее значение, а не сумму или счет. УменьшениеSum, который встроен, работает отлично, но когда я пытаюсь добавить свою собственную функцию сокращения, основанную на многих примерах в Интернете. Я получаю сообщения: d3.js: 5942 Ошибка: Недопустимое значение для атрибута преобразования = "перевести (NaN, 0)" d3.js: 8718 Ошибка: Недопустимое значение ширины атрибута = "NaN"d3.js: 5942 Ошибка: недопустимое значение для <g> атрибут transform = "translate (NaN, 0)"

Здесь код уменьшается настолько, насколько я могу без устранения какой-либо важной информации:

<script type="text/javascript"> 
// 
// Create the Chart Objects 
// 
var GeoZoneChart    = dc.rowChart("#chart-geo-zone"); 
var pdcData = [ 
{GeoZone: 'New York Metro', PDCLast365: 0.43}, 
{GeoZone: 'New York Metro', PDCLast365: 0.427}, 
{GeoZone: 'New York Metro', PDCLast365: 0.418}, 
{GeoZone: 'Los Angeles Metro', PDCLast365: 0.4085}, 
{GeoZone: 'Los Angeles Metro', PDCLast365: 0.40565}, 
{GeoZone: 'Chicago Metro', PDCLast365: 0.46789457}, 
{GeoZone: 'Chicago Metro', PDCLast365: 0.46366023}, 
{GeoZone: 'Chicago Metro', PDCLast365: 0.447781455} 
]; 
// 
// normalize/parse data 
// in this case, turn the decimel into a percentage 
pdcData.forEach(function(d) { 
    d.PDCLast365 = d.PDCLast365 * 100; 
    d.PDCLast365 = d.PDCLast365.toFixed(2); 
}); 

function isNumeric(n) { 
    return !isNaN(parseFloat(n)) && isFinite(n); 
} 

function reduceAddAvg(attr) { 
    return function(p,v) { 
    if (isNumeric(v[attr])){ 
     ++p.count; 
     p.sum += v[attr]; 
     p.avg = p.sum/p.count; 
    } 
    return p; 
    }; 
} 
function reduceRemoveAvg(attr) { 
    return function(p,v) { 
    if (isNumeric(v[attr])){ 
     --p.count; 
     p.sum -= v[attr]; 
     p.avg = p.sum/p.count; 
    } 
    return p; 
    }; 
} 
function reduceInitAvg() { 
    return {count:0, sum:0, avg:0}; 
} 

// 
// set crossfilter 
// 
var ndx = crossfilter(pdcData), 
    GeoZoneDim   = ndx.dimension(function(d) {return d.GeoZone;}), 
    PDCLast365PerGeoZone = 
      GeoZoneDim.group().reduce(
      reduceAddAvg('PDCLast365'), 
      reduceRemoveAvg('PDCLast365'), 
      reduceInitAvg); 


GeoZoneChart 
    .width(400).height(200) 
    .dimension(GeoZoneDim) 
    .group(PDCLast365PerGeoZone) 
    .elasticX(true); 

dc.renderAll(); 
</script> 

ответ

1

Вам нужен охранник для того, когда p.count падает до нуля. Итак:

function reduceRemoveAvg(attr) { 
    return function(p,v) { 
    if (isNumeric(v[attr])){ 
     --p.count; 
     p.sum -= v[attr]; 
     p.avg = p.count ? p.sum/p.count : 0; 
    } 
    return p; 
    }; 
} 

Обязаны, если вы можете указать на любые такие плохие примеры здесь на SO или на сайте dc.js или группе пользователей.

EDIT: Я не уверен, какой эффект он будет иметь здесь, но toFixed() фактически возвращает строку, а не число. И ваш isNumeric проверяет, может ли значение быть преобразовано в число, а не является ли оно числом. Таким образом, вы можете конкатенации строк не добавлять.

Как я уже сказал ниже, верный способ понять это или поместить точки останова в функции сокращения и увидеть, что на самом деле вычисляется.

+0

Привет Гордон, спасибо за ответ. Я проверил это на Add, но забыл проверить его на Remove. В исходном примере также не было числовой проверки. Однако у меня все еще есть такое же сообщение об ошибке. –

+0

Неплохо отлаживать этот материал вслепую. Такой же совет, как всегда: 1. Установите точку останова перед тем, как нарисовать диаграмму, и посмотрите, есть ли у PDCLast365PerGeoZone.all() 'NaNs. 2. Если это так, поместите контрольные точки в конце каждой функции сокращения и посмотрите, почему производятся NaN. Или создайте скрипку, и я или один из других полезных людей здесь сделают именно это. – Gordon

+0

Добавлена ​​еще одна подсказка выше. – Gordon

-1

Обычно я получаю эту ошибку, когда диапазон не является массивом.

Проверить, если переменная, которая принимает .range является фактическим

составлять список присяжных заседателей
+0

Почему вы голосуете? Вот что случилось со мной! –