Q:

Travar o limite de um widget (Shiny) em função de outro

Eu tentei travar o limite de um widget com base na alteração de outro. Suponha estes dois casos:
Primeiro caso: A soma de dois botões não pode superar o valor 100. Por exemplo, quando eu colocar o valor 60 em um botão (chamado Price 1), um outro botão (chamado Price 2) nunca poderá exceder o valor 40. E vice-versa.
Segundo caso: O valor de um botão não pode ser maior ou igual o valor de outro botão. Por exemplo, quando eu mover a métrica de Price 1 para 70, Price 2 nunca poderá passar o valor 69. O contrário também é válido.
Meu código (escrito em Rmarkdown) é este:
---
title: "Untitled"
runtime: shiny
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: fill
---

```{r}
df_1 <- data.frame(
  m = .01, 
  d = .02, 
  q = 1
)

dis <- function(mc, desc, qtde) {
  ((((mc) / (mc - desc)) - 1) * qtde + qtde)
}

prp <- dis(
  mc = df_1$m, 
  desc = df_1$d, 
  qtde = df_1$q
)
```

```{r FRONT-END}
library(flexdashboard)
library(shiny)
library(scales)
```

Stack Overflow
=================================

Sidebar{.sidebar data-width=290}
--------------------------------

```{r}
sliderInput(
  inputId = 'm', label = 'Price 1', 
  value = 50, 
  min = 0, 
  max = 100, 
  step = 5
)

sliderInput(
  inputId = 'd', label = 'Price 2', 
  value = 25, 
  min = 0, 
  max = 100, 
  step = 5
)
```

Isso ajudará o usuário a se guiar sem ter alguém que saiba R por perto. Às vezes, mesmo deixando uma recomendação à pessoa leiga, ela pode errar (o que é normal).

A:

O que você precisa fazer é incluir um observador nos sliders. Isso pode ser feito com observe() ou com observeEvent() (que recomendo nesse caso).
Quando o evento observado ocorrer o que vamos fazer é atualizar o outro slider. Para isso usamos updateSliderInput().
Então iremos adicionar o trecho abaixo app
observeEvent(input$m, {
  updateSliderInput(session, inputId = "d", max = 100 - input$m)
})

observeEvent(input$d, {
  updateSliderInput(session, inputId = "m", max = 100 - input$d)
})

O que fazemos para cada caso é observar um dos sliders e, baseado nos valores que o usuários escolher, atualizar o máximo possível no outro slider.
O código do app todo fica assim:
---
title: "Untitled"
runtime: shiny
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: fill
---

```{r}
df_1 <- data.frame(
  m = .01, 
  d = .02, 
  q = 1
)

dis <- function(mc, desc, qtde) {
  ((((mc) / (mc - desc)) - 1) * qtde + qtde)
}

prp <- dis(
  mc = df_1$m, 
  desc = df_1$d, 
  qtde = df_1$q
)
```

```{r FRONT-END}
library(flexdashboard)
library(shiny)
library(scales)
```

Stack Overflow
=================================

Sidebar{.sidebar data-width=290}
--------------------------------

```{r}
sliderInput(
  inputId = 'm', label = 'Price 1', 
  value = 50, 
  min = 0, 
  max = 100, 
  step = 5
)

sliderInput(
  inputId = 'd', label = 'Price 2', 
  value = 25, 
  min = 0, 
  max = 100, 
  step = 5
)

observeEvent(input$m, {
  updateSliderInput(session, inputId = "d", max = 100 - input$m)
})

observeEvent(input$d, {
  updateSliderInput(session, inputId = "m", max = 100 - input$d)
})
```

