Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pourquoi passer en valeur d'un input une expression ? #64

Closed
FrancoisGuillem opened this issue Jun 24, 2019 · 5 comments
Closed

Pourquoi passer en valeur d'un input une expression ? #64

FrancoisGuillem opened this issue Jun 24, 2019 · 5 comments

Comments

@FrancoisGuillem
Copy link
Contributor

Salut @bthieurmel,

Le commit ci-dessous introduit quelques bugs:

  • updates inutiles de certains inputs et des graphiques
  • possible désynchronisation entre plusieurs graphiques
  • Impossible de passer en valeur d'un input un objet qui a le même nom

Est-ce que tu te souviens de pourquoi tu avais fait ça ? Tu as un cas d'usage en tête ?

commit fc5740c
Author: Benoit Thieurmel [email protected]
Date: Tue Sep 5 15:01:07 2017 +0200

can now pass value as expr (and can depend of sharedValue or current variable) +fix dateRange control
@bthieurmel
Copy link
Collaborator

Salut @FrancoisGuillem,

Ca commence à remonter à loin tout ça... A priori, c'était pour pouvoir notamment définir des paramètres dynamiques qui dépendent entre autre de mwSharedValue comme dans cet exemple :

require(manipulateWidget)
require(dygraphs)

ui <- fillPage(
  fillRow(
    flex = c(NA, 1),
    div(
      textInput("title", label = "Title", value = "glop"),
      sliderInput("obs", "Number of observations:",
                  min = 10, max = 1000, value = 500)
    ),
    mwModuleUI("ui", height = "100%")
  )
)

server <- function(input, output, session) {

  data <- reactive({
    if(runif(1) > 0.5){
      data.frame(
        year = 2000+1:input$obs,
        series1 = rnorm(input$obs),
        series2 = rnorm(input$obs),
        series3 = rnorm(input$obs)
      )
    } else {
      data.frame(
        year = 2000+1:input$obs,
        series1 = rnorm(input$obs),
        series2 = rnorm(input$obs)
      )
    }
  })

  c <- manipulateWidget(
    {
      dygraph(data[range[1]:range[2] - 2000, c("year", series)], main = title)
    },
    range = mwSlider(min = 2010,
                     max = 2001 + (nrow(data)-1), c(2001, 2001 + (nrow(data)-1))),
    series = mwSelect(choices = colnames(data)[-1],
                      value = {
                        if(ncol(data) == 3){
                          colnames(data)[3]
                        } else {
                          colnames(data)[2]
                        }
                      }, .display = TRUE),
    title = mwSharedValue(),
    data = mwSharedValue(), .runApp = FALSE,
    .compare = "range"
  )
  mwModule("ui", c, title = reactive(input$title), data = data)
}

shinyApp(ui, server)

@bthieurmel
Copy link
Collaborator

Je n'ai à l'époque pas observé de soucis... D'ailleurs, cela à l'air de marcher de passer un input qui a le même nom ? :

require(manipulateWidget)
require(dygraphs)

ui <- fillPage(
  fillRow(
    flex = c(NA, 1),
    div(
      textInput("title", label = "Title", value = "glop"),
      sliderInput("obs", "Number of observations:",
                  min = 10, max = 1000, value = 500)
    ),
    mwModuleUI("ui", height = "100%")
  )
)

series = "series2"

server <- function(input, output, session) {

  data <- reactive({
    if(runif(1) > 0.5){
      data.frame(
        year = 2000+1:input$obs,
        series1 = rnorm(input$obs),
        series2 = rnorm(input$obs),
        series3 = rnorm(input$obs)
      )
    } else {
      data.frame(
        year = 2000+1:input$obs,
        series1 = rnorm(input$obs),
        series2 = rnorm(input$obs)
      )
    }
  })

  c <- manipulateWidget(
    {
      dygraph(data[range[1]:range[2] - 2000, c("year", series)], main = title)
    },
    range = mwSlider(min = 2010,
                     max = 2001 + (nrow(data)-1), c(2001, 2001 + (nrow(data)-1))),
    series = mwSelect(choices = colnames(data)[-1],
                      value = series, .display = TRUE),
    title = mwSharedValue(),
    data = mwSharedValue(), .runApp = FALSE,
    .compare = "range"
  )
  mwModule("ui", c, title = reactive(input$title), data = data)
}

shinyApp(ui, server)

@FrancoisGuillem
Copy link
Contributor Author

Cool merci pour ta réactivité. Dans l'exemple, quand on change l'input "obs", la valeur de l'input "range" est automatiquement actualisée à "c(2001, 2001 + (nrow(data)-1))", au lieu de garder la valeur actuelle si elle est valide.

Ce comportement m'embête aujourd'hui parce que je suis en train d'implémenter la possibilité de faire des comparaisons à la volée, et quand je rajoute des graphiques, la valeur de "range" est réinitialisée à ""c(2001, 2001 + (nrow(data)-1))" quand bien même rien n'a changé.

Est-ce que ça te parait pertinent que je change ce comportement (ie. update uniquement si la valeur n'est pas valide) ? Sachant que c'est juste une ligne de code à modifier donc ça m'arrangerait bien 😄

@FrancoisGuillem
Copy link
Contributor Author

Je n'ai à l'époque pas observé de soucis... D'ailleurs, cela à l'air de marcher de passer un input qui a le même nom ?

Effectivement j'arrive plus à reproduire le problème. J'ai dû l'inventer

@bthieurmel
Copy link
Collaborator

Pour l'erreur en passant un input du même nom, c'était effectivement le cas au-moment du commit en question, mais cela avait ensuite été corrigé.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants