在 Spotfire Mods 中,作为 reader 的一部分,我可以确定数据视图中发生了什么变化吗?

In Spotfire Mods can I determine what has changed in the dataview as part of the reader?

我能够在 Spotfire 中为我的 D3 网络图表 mod 成功实施对数据视图整体变化和任何 mod 属性的监控,如 。效果很好。

但是,在 D3 网络图表中有模拟 运行 并且您只希望在呈现的实际数据发生变化时重新启动此模拟,有没有办法在 dataView 对象中检查更详细的变化。例如,如果颜色依据或大小依据列的轴表达式发生变化,我不需要重新运行网络模拟,只需更新节点的颜色或大小,甚至当某些标记应用于网络图表时(也会影响数据视图)。但是,如果我的数据列发生变化,我希望网络重新运行模拟。

另一个示例用例是,如果应用了过滤,我们可能希望仅在过滤掉大量数据后才更新网络。

API 中是否有任何方法可以用来检查传递给 reader 的 DataView 中这些更详细的更改?

我的 reader 看起来像这样:

/**
 * Create the read function.
 */
const reader = readerWithChangeChecker(
    mod.createReader(
        mod.visualization.data(),
        mod.windowSize(),
        mod.property("network_strength"),
        mod.property("display_labels"),
        mod.property("network_type"),
        mod.property("apply_color")
    )
);

并且我在订阅 reader 的异步渲染函数中有一个 updateNetwork 函数。然后我进行一些简单的逻辑检查,这些检查将传递给 updateNetwork 图表函数:

// check what has changed
let data_requires_update = false;
let simulation_requires_update = false;
let window_requires_update = false;
let rendering_requires_update = false;

if (reader.hasValueChanged(dataView)) {
    data_requires_update = true;
    simulation_requires_update = true;
}

if (
    reader.hasValueChanged(network_strength) ||
    reader.hasValueChanged(network_type)
) {
    simulation_requires_update = true;
}

if (reader.hasValueChanged(windowSize)) {
    window_requires_update = true;
}

if (
    reader.hasValueChanged(display_labels) ||
    reader.hasValueChanged(apply_color)
) {
    rendering_requires_update = true;
}

// trigger loading network
updateNetwork(
    data_requires_update,
    simulation_requires_update,
    window_requires_update,
    rendering_requires_update
);

所以我希望在 dataView 检查中添加更多细节,以便我可以检测轴变化、主要数据 table 变化,以及是否发生过滤。这可能吗?

Spotfire Mods 中的数据视图可能因多种不同原因而失效和替换;新的轴表达式、更改的数据 table、更改的标记或过滤、新的流数据或 refreshed/replaced 数据 table 甚至修改的文档属性(如果在轴表达式中使用这些属性)。

因此,并非总能获得关于哪些因素导致计算新数据视图的详细信息,但您可以订阅轴表达式中的更改,从而至少在用户时强制刷新模拟更改任何重要的轴表达式。

在您的情况下,添加除 ColorBy 和 SizeBy 之外的所有轴可能会让您更接近您的目标。如果你得到一个新的数据视图但没有新的轴,那么你可以尝试更新可视化而不使用 d3 刷新模拟。例如,如果更改仅是标记、颜色或尺寸,则不需要新的模拟过程。为了识别可视化中的节点和连接,您应该使用层次叶节点的 key 属性。

如果新数据视图的原因是例如过滤或新数据(流式传输或刷新数据 table),您将改为拥有一组 d3 enter/exit DOM 元素。如果这些集合相对较小,可以不刷新模拟吗?

但还要记住,即使轴表达式未更改,定义连接强度的度量也可能具有新值。因此可能很难确定更新是否正常。手动刷新模拟按钮可能是最简单的方法,除非您想比较整个数据视图以想出一种方法来确定是更新还是完全刷新它。

结论是,确定是否更新当前可视化或重新运行整个布局过程所需的大部分信息都可通过 API 获得,但要做出出色的响应 Mod 需要一些关于可视化内容的知识。