Vega中能否基于布尔信号is_filter、is_stack条件执行数据转换?
基于布尔信号条件执行Vega数据转换的实现方法
Vega转换文档里给出过这类基础转换示例:
{ "data": [ { "name": "table", "transform": [ { "type": "filter", "expr": "datum.value > 5" }, { "type": "stack", "field": "value", "groupby": ["category"] } ] } ] }
现在有两个布尔信号is_filter和is_stack,想要基于这两个信号的状态,决定是否执行对应的filter和stack转换。之前尝试给转换加run_if参数的写法不生效,同时不想为每种转换组合单独创建数据集,也不想在marks里写条件逻辑。
可行实现方案
Vega本身没有原生的run_if参数,但可以通过以下两种方式实现条件触发转换:
方法1:在转换逻辑中嵌入信号判断
- 对于filter转换,直接把信号判断加入
expr表达式,用三元运算符控制是否过滤; - 对于stack转换,利用其支持的
signal参数,当信号为false时自动跳过转换。
示例代码:
{ "data": [ { "name": "table", "transform": [ // 仅当is_filter为true时执行过滤,否则返回所有数据 { "type": "filter", "expr": "is_filter ? datum.value > 5 : true" }, // 仅当is_stack为true时执行堆叠转换 { "type": "stack", "field": "value", "groupby": ["category"], "as": ["y0", "y1"], "signal": "is_stack" } ] } ], "signals": [ { "name": "is_filter", "value": false }, { "name": "is_stack", "value": false } ] }
方法2:使用condition转换包裹目标转换
Vega的condition转换可以根据信号值选择执行对应的转换流程,else字段设为空数组就表示不执行任何操作,完全符合条件触发的需求。
示例代码:
{ "data": [ { "name": "table", "transform": [ { "type": "condition", "test": "is_filter", "transform": [{ "type": "filter", "expr": "datum.value > 5" }], "else": [] }, { "type": "condition", "test": "is_stack", "transform": [{ "type": "stack", "field": "value", "groupby": ["category"] }], "else": [] } ] } ], "signals": [ { "name": "is_filter", "value": false }, { "name": "is_stack", "value": false } ] }
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

