我一直在尝试在streamlit应用程序中构建多个图,该应用程序使用streamlit.radio为每个图接收多个用户输入(例如:为图X设置阈值,为图Y选择变量等)。尽管该应用程序运行良好,但每次更改任何输入时它都会从头重新加载。由于它体积庞大,我希望仅重新加载那些输入已更改的图表。如何才能做到这一点?虚拟代码可以考虑如下
x = st.radio('',(1,2,3))
plt.bar(a,b,width=x)
y = st.radio('',('left','right'))
plt.bar(a,b,align=y)
现在的问题是,即使我只是更改“y”,应用程序也会重新加载我希望避免的第一个图表。
在此回答:如何避免在用户输入时重新运行完整的 Streamlit 应用程序?
简而言之,Streamlit 最近(1.33.0)发布了 st.experimental_fragment 来解决这个问题。
@st.experimental_fragment
def chart1(a,b) -> None:
x = st.radio('',(1,2,3))
plt.bar(a,b,width=x)
@st.experimental_fragment
def chart2(a,b) -> None:
y = st.radio('',('left','right'))
plt.bar(a,b,align=y)
chart1(a,b)
chart2(a,b)
在此设置中,与片段(即函数)内的小部件交互只会重新执行该函数。
因此,我不建议从片段返回值,因为它们只会在完整应用程序重新运行时影响应用程序的其余部分。