st.rerun()
は、Streamlitアプリケーションのスクリプトを再実行するための関数です。
この関数を呼び出すと、Streamlitは現在のスクリプト実行を停止し、再実行をキューに入れます。
rerun()の使い方
st.rerun()
は、特にユーザーが特定の操作を行ったときに、アプリケーションの特定の部分を再実行したい場合に便利です。
例えば、ボタンをクリックしたときに特定の部分を再実行したい場合などです。
ボタンをクリックしてテキストを更新
import streamlit as st
if "value" not in st.session_state:
st.session_state.value = "Title"
st.header(st.session_state.value)
if st.button("Update"):
st.session_state.value = "Updated"
st.rerun()
この例では、ボタンをクリックすると、st.session_state.value
が更新され、その後st.rerun()
が呼び出されてスクリプトが再実行されます。
フラグメントを使用した場合
Streamlitでは、st.fragment()
を使用して特定の部分のみを再実行することができます。
これにより、アプリケーション全体を再実行するのではなく、特定の部分だけを再実行することができます。
import streamlit as st
@st.fragment
def update_fragment():
if st.button("Update Fragment"):
st.write("Fragment Updated")
update_fragment()
この例では、update_fragment()
関数がフラグメントとして定義されており、ボタンがクリックされたときにフラグメントのみが再実行されます。
注意点
st.rerun()
を使用する際には、無限ループにならないように注意が必要です。
例えば、ボタンの状態が常にTrue
のままになると、無限ループに陥る可能性があります。
この場合、ボタンにキーを設定し、そのキーを削除することで対処できます。
import streamlit as st
if "button_clicked" not in st.session_state:
st.session_state.button_clicked = False
if st.button("Rerun", key="rerun_button"):
st.session_state.button_clicked = True
st.rerun()
del st.session_state.button_clicked
rerun()を活用するユースケース
動的なデータ更新
例えば、外部APIからデータを取得するアプリケーションでは、ユーザーがデータの更新を要求した際にst.rerun()を活用することで、効率的に画面を更新できます。
import streamlit as st
import random
if "data" not in st.session_state:
st.session_state.data = random.randint(1, 100)
st.write(f"Current Data: {st.session_state.data}")
if st.button("Refresh Data"):
st.session_state.data = random.randint(1, 100)
st.rerun()
この例では、「Refresh Data」ボタンをクリックするたびに、データがランダムな値に更新され、画面が即座に反映されます。
ユーザー設定の保存と反映
st.rerun()は、ユーザーが設定を変更した直後にその設定を反映させたい場合にも役立ちます。
以下はテーマ設定を切り替える例です。
import streamlit as st
if "theme" not in st.session_state:
st.session_state.theme = "Light"
st.write(f"Current Theme: {st.session_state.theme}")
if st.button("Switch to Dark Theme"):
st.session_state.theme = "Dark"
st.rerun()
if st.button("Switch to Light Theme"):
st.session_state.theme = "Light"
st.rerun()
このコードでは、ユーザーがボタンをクリックするたびにテーマが即座に切り替わります。
st.rerun()とst.session_stateの組み合わせ
st.session_stateをうまく活用すると、再実行の際にユーザーの操作履歴や状態を保持できます。
たとえば、以下の例では複数のフォーム入力を保持しながら再実行を行っています。
import streamlit as st
if "form_data" not in st.session_state:
st.session_state.form_data = {"name": "", "age": 0}
name = st.text_input("Name", value=st.session_state.form_data["name"])
age = st.number_input("Age", value=st.session_state.form_data["age"], step=1)
if st.button("Submit"):
st.session_state.form_data["name"] = name
st.session_state.form_data["age"] = age
st.rerun()
st.write(f"Submitted Data: {st.session_state.form_data}")
rerun()とパフォーマンス
rerun()は便利ですが、頻繁に使用するとアプリケーションのパフォーマンスに影響を与える場合があります。
以下の方法で最適化が可能です。
- 条件付きで再実行
再実行が必要な場合にのみst.rerun()を呼び出すことで、不要なリソース消費を避けられます。 - キャッシュの活用
cache_data
やcache_resource
を使用して、再実行時でも変わらないデータを効率的に管理できます。
import streamlit as st
@st.cache_data
def get_data():
return {"value": 42}
data = get_data()
st.write(f"Data: {data['value']}")
if st.button("Rerun Example"):
st.rerun()
@st.cache_data
は、データのキャッシュ機能を提供します。
get_data
関数が呼び出されると、結果がキャッシュされ、同じ引数での再実行時に計算が省略されます。
まとめ
rerun()
は、Streamlitアプリケーションの特定の部分を効率的に再実行するためのツールです。適切に使用することで、アプリケーションのパフォーマンスを向上させることができます。無限ループに注意し、必要に応じてキーを使用して対処することが重要です。