Почему этот код работает для подсчета одного элемента в списке, но не других? - PullRequest
2 голосов
/ 07 июля 2019

Я использую попытку подсчитать количество "Manager" "MIT" и "Instore" в файле .csv.Код, который у меня есть, работает для нахождения всех «Менеджеров», но не работает для остальных двух.

Я попытался разделить функцию на 3 отдельные функции, так как я думал, что проблема, возможно, заключалась в использовании большего количествачем один dc.numberDisplay в функции, но это не сработало.Я попробовал эту функцию, поэтому есть только одна, если она ищет Менеджеров, она работает, MIT - нет, а Instores - нет.Я попытался изменить порядок кода и до сих пор ничего.Я поместил console.log (p.mit_count) в каждой строке add_item, remove_item и initialize.Я поместил console.log (d.value.mit_count) в valueAccessor.

Scott,Instore,3,BMC,96
Mark,Instore,4,Intro,94
Wendy,Instore,3,Intro,76
Lucas,Instore,2,Intro,96
    .defer(d3.csv, "data/Results.csv")
    .await(makeGraphs)

//function for making and rendering graphs
function makeGraphs(error, staffData) {
    var ndx = crossfilter(staffData);
    show_number_of_staff(ndx);
    dc.renderAll();
}

function show_number_of_staff(ndx) {
    var dim = ndx.dimension(dc.pluck('Rank'));

    function add_item(p, v) {
        if (v.Rank == "Manager") {
            p.manager_count++;
        }
        else if (v.Rank == "MIT") {
            p.mit_count++;
        }
        else if (v.Rank == "Instore") {
            p.instore_count++;
        }
        return p;
    }

    function remove_item(p, v) {
        if (v.Rank == "Manager") {
            p.manager_count--;
        }
        else if (v.Rank == "MIT") {
            p.mit_count--;
        }
        else if (v.Rank == "Instore") {
            p.instore_count--;
        }
        return p;
    }

    function initialise(p, v) {
        return { manager_count: 0, mit_count: 0, instore_count: 0 };

    }

    var staffCounter = dim.group().reduce(add_item, remove_item, initialise);;

    dc.numberDisplay("#managerCount")
        .formatNumber(d3.format(".0"))
        .valueAccessor(function(d) {
            return d.value.manager_count;
        })
        .group(staffCounter);

    dc.numberDisplay("#mitCount")
        .formatNumber(d3.format(".0"))
        .valueAccessor(function(d) {
            return d.value.mit_count;
        })
        .group(staffCounter);

    dc.numberDisplay("#instoreCount")
        .formatNumber(d3.format(".0"))
        .valueAccessor(function(d) {
            return d.value.instore_count;
        })
        .group(staffCounter);
}

console.log(p.mit_count) показывает, что он считается до 13 (как я и ожидал), но затемв valueAccessor console.log(d.value.mit_count) показывает 0. Я не могу понять, почему это работает для «Менеджера», но ничего больше.Я почти смущен, что это заняло у меня больше недели.Это кажется таким простым!

1 Ответ

1 голос
/ 08 июля 2019

Я думаю, что если вы войдете в систему staffCounter.all(), вы обнаружите, что он считает менеджеров, MIT и Instores в 3 отдельных корзинах. Это потому, что ваше измерение сортируется по Rank, затем ваша группа снова складывается по Rank, поэтому вы получаете один бин на ранг.

Обычно вы хотите передать объект groupAll с одним мусорным ведром в numberDisplay. Тем не менее, он разрешающий и также будет принимать обычные группы с несколькими ячейками ( source ). Он отсортирует мусорные ведра и возьмет последние.

Почему? Я не уверен. Я думаю, что почти в каждом случае вы захотите уменьшить количество бинов до одного, но у кого-то явно был сценарий использования, в котором он хотел отобразить наибольшее значение из множества бинов.

Я был удивлен, обнаружив, что поведение не задокументировано, поэтому я обновил документацию numberDisplay .

С groupAll ваш код будет выглядеть примерно так:

var staffCounter = ndx.groupAll().reduce(add_item, remove_item, initialise);
dc.numberDisplay("#managerCount")
    .formatNumber(d3.format(".0"))
    .valueAccessor(function(d) {
        return d.manager_count; // no .value here
    })
    .group(staffCounter);

Обратите внимание, что здесь не используется размер перекрестного фильтра.

...