Python 将.filter()应用于Bokeh JS回调中的ColumnDataSource

Python 将.filter()应用于Bokeh JS回调中的ColumnDataSource,python,python-3.x,bokeh,bokehjs,Python,Python 3.x,Bokeh,Bokehjs,问题是:我无法将筛选函数应用于columndatasource,即使在应用它之后,也会给出整个数组。我对JS的不熟悉使事情变得更糟 所以我一直在尝试从这里复制结果: 但是使用我自己的数据源 以下是JS回调的代码: # Create slider callback SliderCallback = CustomJS(args = dict(sliceCDS=sliceCDS, fullCDS=fullCDS, indexCDS=indexCDS), code = """ const ne

问题是:我无法将筛选函数应用于columndatasource,即使在应用它之后,也会给出整个数组。我对JS的不熟悉使事情变得更糟

所以我一直在尝试从这里复制结果:

但是使用我自己的数据源

以下是JS回调的代码:

# Create slider callback
SliderCallback = CustomJS(args = dict(sliceCDS=sliceCDS, fullCDS=fullCDS, indexCDS=indexCDS), code = """
    const new_value = cb_obj.value;

    // Take the 'Slice' column from the full data
    const slice_col = fullCDS.data['Slice'];

    // Select only the values equal to the new slice number
    const mask = slice_col.map((item) => item==new_value);

    sliceCDS.data['x'] = fullCDS.data['x'].filter(item => mask);
    sliceCDS.data['y'] = fullCDS.data['y'].filter(item => mask);
    sliceCDS.data['label'] = fullCDS.data['label'].filter(item => mask);

    //console.log('Here is the data');
    console.log(sliceCDS.data['x']);
    console.log(sliceCDS.data['y']);
    console.log(sliceCDS.data['label']);


    // Update the sliceCDS
    sliceCDS.change.emit();
    """)

# Set up slider
slider = bokeh.models.Slider(title="Slice view number: ",start=0, end=49,value=0,step=1)
slider.js_on_change('value', SliderCallback)

以下是SliceCD(JS回调的输入):

以下是完整CD(JS回调的输入):

使用上述代码,我无法更新我的CD。它仍然包含所有89850行,而在应用.filter()之后,它应该只包含1797行。 编辑:根据建议,我还尝试了以下功能:

sliceCDS.data['x'] = fullCDS.data['x'].filter((item,idx) => mask[idx]);
它给了我以下错误:

VM499:17 Uncaught TypeError: Cannot read property 'filter' of undefined
并尝试了这一点:

sliceCDS.data['x'] = fullCDS.data['x'].filter((item,0) => mask[0]);
这给了我这个错误:

VM505:31 Uncaught SyntaxError: Invalid destructuring assignment target
但如果我尝试上面给出的链接中的方法,columndatasources中的列名称为Line1代表x,Line2代表y,Line3代表label:

// Update the data for sliceCDS with a slice of data from fullCDS
    for(i=1; i<3; i++){
        sliceCDS.data['Line' + i.toString()] = fullCDS.data['Line' + i.toString()].filter((item,i) => mask[i]);
    }
//使用FULLCD中的数据片段更新SliceCD的数据
对于(i=1;i掩码[i]);
}
上面的代码工作得很好


但为什么在开始时提到的案例代码不起作用?我确信我使用.filter()的方式有问题。

这里有这个表达式

fullCDS.data['x'].filter(项=>mask);
item=>mask
总是返回
mask
,而不管
item
是什么。在JavaScript中,数组总是truth-y,无论内容如何


filter函数的第二个参数是项的索引。尝试使用
(item,idx)=>mask[idx]
lambda代替。

Hi@Eugene,谢谢您的回复。我意识到了面具的部分,但是这里怎么使用lambda呢?例如,我尝试了:
sliceCDS.data['x']=fullCDS.data['x'].filter((item,0)=>mask[0])在html中,控制台错误显示:VM108:31未捕获的语法错误:无效的解构分配目标请勿更改我发布的内容-使用
(item,idx)=>掩码[idx]
逐字记录
idx
是一个合适的变量,你不必用它来代替你自己。我也尝试过,在问题中发布了EDIT。请检查一下,我用错了吗?它告诉我:
VM499:17未捕获类型错误:无法读取未定义的属性“filter”
您可能设法从
fullCDS.data
中删除了
x
列,或者从其他位置抛出了错误。如果没有完整的代码和异常的完整stacktraces,我无法添加任何其他内容。很高兴听到这一切都解决了。我认为这一行不需要再突出显示了——在上面的原始答案中,它已经被格式化为代码。而想要使用答案的人通常应该以两种方式阅读评论。
VM505:31 Uncaught SyntaxError: Invalid destructuring assignment target
// Update the data for sliceCDS with a slice of data from fullCDS
    for(i=1; i<3; i++){
        sliceCDS.data['Line' + i.toString()] = fullCDS.data['Line' + i.toString()].filter((item,i) => mask[i]);
    }