req

req(*args, cancel_output=False)

Throw a silent exception for falsy values.

This is a convenient shorthand for throwing SilentException / SilentCancelOutputException if any of the arguments are falsy.

The term "falsy" generally indicates that a value is considered False when encountered in a logical context. We use the term a little loosely here; our usage tries to match the intuitive notions of "Is this value missing or available?", or "Has the user provided an answer?", or in the case of action buttons, "Has the button been clicked?". So False, None, 0, and "" would be examples of Falsy values.

Parameters

*args : T = ()

Any number of arguments to check.

cancel_output : bool | Literal[‘progress’] = False

If True, throw SilentCancelOutputException instead of SilentException.

Returns

: T | None

The first argument. If no arguments are provided, returns None.

Examples

#| standalone: true
#| components: [editor, viewer]
#| layout: vertical
#| viewerHeight: 400

## file: app.py
from shiny import App, Inputs, Outputs, Session, reactive, render, req, ui
from shiny.types import SafeException

app_ui = ui.page_fluid(
    ui.input_action_button("safe", "Throw a safe error"),
    ui.output_ui("safe"),
    ui.input_action_button("unsafe", "Throw an unsafe error"),
    ui.output_ui("unsafe"),
    ui.input_text(
        "txt",
        "Enter some text below, then remove it. Notice how the text is never fully removed.",
    ),
    ui.output_ui("txt_out"),
)


def server(input: Inputs, output: Outputs, session: Session):
    @reactive.calc
    def safe_click():
        req(input.safe())
        return input.safe()

    @render.ui
    def safe():
        raise SafeException(f"You've clicked {str(safe_click())} times")

    @render.ui
    def unsafe():
        req(input.unsafe())
        raise Exception(f"Super secret number of clicks: {str(input.unsafe())}")

    @reactive.effect
    def _():
        req(input.unsafe())
        print("unsafe clicks:", input.unsafe())
        # raise Exception("Observer exception: this should cause a crash")

    @render.ui
    def txt_out():
        req(input.txt(), cancel_output=True)
        return input.txt()


app = App(app_ui, server)
app.sanitize_errors = True