Complex boolean expressions with .rx

Say I have

j = panel.rx(False)
k = panel.rx(False)
l = panel.rx(False)
u = panel.rx(False)

I want to do something like

b = panel.widgets.Button()
b.disabled = (j or k) and (l or u)

Is that possible with panel.rx?

I think so if you chain them like j.rx.or_(k) Reactive Functions and Expressions — param v2.2.1

But it could get pretty ugly and it’s probably better to use pn.bind instead?

For ref:

1 Like

So j.rx.or_(k) gives (j | k) part and I can do l.rx.or_(u) for (l or u) part, but my question is how do I apply and to these two afterwards? If I did:

j.rx.or_(k).rx.and_(l.rx.or_(u))

wouldn’t that give me this instead?

j or (k and (l or u))

With panel.bind, it would work like this, right?

j = panel.rx(False)
k = panel.rx(False)
l = panel.rx(False)
u = panel.rx(False)

b = panel.widgets.Button()
b.disabled = pn.bind(lambda j, k, l, u: (j or k) and (l or u), j, k, l, u)

For .rx you can experiment with

import panel as pn

j_input = pn.widgets.Checkbox(value=False, name="j")
k_input = pn.widgets.Checkbox(value=False, name="k")
l_input = pn.widgets.Checkbox(value=False, name="l")
u_input = pn.widgets.Checkbox(value=False, name="u")

j = j_input.rx()
k = k_input.rx()
l = l_input.rx()
u = u_input.rx()

j_or_k = j.rx.or_(k)
l_or_u = l.rx.or_(u)
j_or_k_and_l_or_u = j_or_k.rx.and_(l_or_u)

pn.Column(
    "Boolean Expressions with `.rx`",
    "Inputs",
    pn.Row(
        j_input,
        k_input,
        l_input,
        u_input,
    ),
    "Or",
    pn.Row(j_or_k, l_or_u),
    "And",
    j_or_k_and_l_or_u,
    " **Result**",
    pn.pane.Str(j_or_k_and_l_or_u)
).servable()

1 Like