Возможно, но ваши данные должны каким-то образом оказаться в источнике данных. Либо потому, что вы поместили его прямо туда в JavaScript, либо потому, что вы поместили его туда до того, как сгенерировал файл HTML с этим вызовом show(...)
, либо потому, что вы используете сервер Bokeh, который может добавлять столбцы к источникам данных динамически.
С учетом сказанного, вот кратчайший пример, который я мог бы привести:
from bokeh.io import show
from bokeh.layouts import column
from bokeh.models import DataTable, TableColumn, Button, CustomJS, ColumnDataSource
ds = ColumnDataSource(data=dict(a=[1, 2, 3], b=[2, 3, 4]))
t = DataTable(columns=[TableColumn(title='a', field='a'),
TableColumn(title='b', field='b')],
source=ds)
b = Button(label="Add random column")
b.js_on_click(CustomJS(args=dict(ds=ds, t=t),
code="""\
let column_name = null;
while (column_name == null || column_name in ds.data) {
column_name = Math.random().toString(36).substring(7);
}
const n = ds.get_length();
ds.data[column_name] = Array.from({length: n}, () => Math.random());
const TableColumn = Bokeh.Models('TableColumn');
t.columns.push(new TableColumn({title: column_name,
field: column_name}));
t.change.emit();
ds.change.emit();
"""))
show(column(b, t))