Reactive programming
https://shiny.posit.co/py/docs/reactive-programming.html
from shiny import App, render, ui app_ui = ui.page_fluid( ui.h2("Hello Shiny!"), ui.input_slider("n", "N", 0, 100, 20), ui.output_text_verbatim("txt"), ) def server(input, output, session): @output @render.text def txt(): return f"n*2 is {input.n() * 2}" app = App(app_ui, server)
from shiny import App, render, ui, reactive app_ui = ui.page_fluid( ui.h2("Hello Shiny!"), ui.input_slider("n", "N", 0, 100, 20), ui.output_text_verbatim("txt"), ) def server(input, output, session): @reactive.calc def reactive_result(): return input.n() * 2 @output @render.text def txt(): return reactive_result() app = App(app_ui, server)
기본 Reactive 프로그래밍: (reactive) input이 수정되면 (reactive) output 함수를 다시 실행
Shiny는 이를 자동으로 수행하며, 특정 값이 변경될 때 함수를 명시적으로 다시 실행할 필요가 없습니다.
좀 더 복잡한 reactive를 활용해 보면
reactive.Value
:
value가 변경될 때, reactive함수를 실행시키는 객체
An object that causes reactive functions to run when its value changes.
– show_markers = reactive.Value(False)
– zip_selected = reactive.Value(None)
– selected_table_row = reactive.Value(pd.DataFrame())
==>
zip_selected._value
selected_table_row._valuereactive.Calc
:
return값으로 사용되는 반응형 함수를 생성
Create a reactive function that is used for its return value.
@reactive.Calc
def zips_in_bounds():
input.aa
return
@reactive.Calc
def zips_marker_color():
read_reactive()
return
reactive.effect
reactive.Effect
:
부작용에 사용되는 반응형 함수를 생성합니다. 반환 값이 아닌 부작용 자체에 관심이 있습니다.
Create a reactive function that is used for its side effects (and not its return value).
@reactive.Effect
def _():
nzips = zips_in_bounds().shape[0]
show_markers.set(nzips < 200)
@reactive.Effect
@reactive.event(input.variable)
def _():
@output
: outputs (wrapped up in areactive.Effect
)
There are a few utility functions that help with managing reactivity:
with isolate():
Run blocks of code inside a reactive function, but without taking a reactive dependency on code inside the block.@reactive.event()
: A decorator that controls what causes a reactive function to invalidate.
@output(id=”density_pop”)
@render_widget
def _():
return density_plot(