Como resetar o shiny::actionButton para cada modificação nos Shiny Widgets?

Eu fiz uma aplicação com flexdashboard e usei a função actionButton do pacote Shiny. Entretanto, quando o actionButton é acionado, ele é acionado definitivamente. Isto é, tudo funciona (ex. renderValueBox/ renderGauge) após qualquer modificação nos widgets (ex. sliderInput) após o clique.

E está bem, é sua característica mesmo.

Entretanto, eu gostaria que essa ação fosse única. Ou seja, “clicou, acionou e acabou”. Em outras palavras, quando fosse clicado, ele funcionaria uma vez e, mesmo após modificações nos widgets, os renderValueBox e renderGauge não se alterassem, a não ser se eu mudasse os widgets e clicasse de novo no actionButton.

Meu código:

---
title: "Vamos somar?"
runtime: shiny
output: 
  flexdashboard::flex_dashboard:
orientation: rows
vertical_layout: fill
theme: yeti
---

side{.sidebar}
-------------------------------------------

```{r}
library(tibble)
library(shiny)
library(shinyWidgets)
library(flexdashboard)
library(scales)
```


**Análise**

```{r}
autonumericInput(
inputId = "a", 
value = 0, 
label = "Valor 1", 
align = "center", 
currencySymbol = "R$", 
currencySymbolPlacement = "p",
decimalPlaces = 2,
digitGroupSeparator = ".",
decimalCharacter = ","
)

autonumericInput(
inputId = "b", 
value = 0, 
label = "Valor 2", 
align = "center", 
currencySymbol = "R$", 
currencySymbolPlacement = "p", 
decimalPlaces = 2,
digitGroupSeparator = ".",
decimalCharacter = ","
)

actionButton("execute", "Calcule")
```

```{r}
f_1 <- function(a, b) {
  a + b
}
```

```{r}
reac <- eventReactive(input$execute, {
  x = tibble(
    a = input$a, 
    b = input$b
  )
}, ignoreNULL = FALSE)

pred <- reactive({
  temp <- reac()
  f_1(
    a = input$a, 
    b = input$b
  )
})
```

abc{}
--------------------------------------

###
```{r}
renderValueBox({
  valueBox(
    value = scales::dollar(x = round(x = pred(), digits = 4), prefix = "R$ ", suffix = " real(is)", big.mark = ".", decimal.mark = ","), 
    caption = "Soma", 
    color = "steelblue", 
    icon = "fa-plus"
  )
})
```

O código funciona, mas não da forma que eu gostaria. Eu tentei inserir o argumento ignoreNULL = FALSE dentro da função eventReactive. Ela ajuda, pois os renderValueBox precisam aparecer quando eu executo o dashboard mas, o actionButton deve funcionar apenas uma vez após cada clique.

Em outras palavras, procuro algo semelhante a função submitButton, mas preciso de uma solução com actionButton, por ser esta uma função mais recomendada.

1 Curtida

Oi @giovani

O problema é que a sua variável pred está se referindo aos inputs input$a e input$b diretamente, sem isolates, então assim que input$a é invalidado, pred também é.

Se você trocar por algo assim:

pred <- reactive({
  temp <- reac()
  f_1(
    a = temp$a, 
    b = temp$b
  )
})

Isso vai funcionar porque agora pred só depende de input$a e input$b por meio de reac(), no entanto, reac() só é invalidado quando input$execute muda (já que ele usa eventReactive.

1 Curtida