Évaluer arguments dans match.call()

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Évaluer arguments dans match.call()

Messagepar Pierre-Yves Berrard » 17 Jan 2019, 13:57

Bonjour,

Je cherche un moyen de faire "évaluer" les arguments dans match.call().

Je ne sais pas trop comment le formuler donc un exemple :

Code : Tout sélectionner

fun <- function(x, y) match.call()

fun(4, 5)
#> fun(x = 4, y = 5)

Jusqu'ici tout va bien. Maintenant :

Code : Tout sélectionner

p <- 4
fun(p, 5)
#> fun(x = p, y = 5)
# alors que j'aimerais le même résultat que ci-dessus (avec p évalué) : fun(x = 4, y = 5)
PY

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Évaluer arguments dans match.call()

Messagepar Logez Maxime » 17 Jan 2019, 14:09

Bonjour,

Il y a surement plus propre :

Code : Tout sélectionner

fun <- function(x, y) {
  env1 <- environment()
  res <- match.call()
  for (i in 2:length(res)) {
    if (is.name(u <- res[[i]]))
      res[[i]] <- get(as.character(u), env = parent.env(env1)) # a la place de as.character : deparse
  }
  return(res)
}

# ou
fun <- function(x, y) {
  env1 <- environment()
  res <- match.call()
  for (i in 2:length(res)) {
    if (is.name(u <- res[[i]]))
      res[[i]] <- eval(u, env = parent.env(env1))
  }
  return(res)
}

Cordialement,
Maxime

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Évaluer arguments dans match.call()

Messagepar Pierre-Yves Berrard » 17 Jan 2019, 17:05

Merci Maxime.
PY

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Évaluer arguments dans match.call()

Messagepar Pierre-Yves Berrard » 18 Jan 2019, 14:54

Quand ma fonction est exécutée dans une appli shiny, cela ne fonctionne pas.

J'obtiens quelque chose de ce style

Code : Tout sélectionner

fun(x = input$widget_x, y = 5)
PY

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Évaluer arguments dans match.call()

Messagepar Logez Maxime » 18 Jan 2019, 19:31

Bonjour,

Code : Tout sélectionner

fun <- function(x, y) {
  env1 <- environment()
  res <- match.call()
  for (i in 2:length(res)) {
    if (is.name(u <- res[[i]]) || is.call(u))
      res[[i]] <- eval(u, env = parent.env(env1))
  }
  return(res)
}
Cordialement,
Maxime

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Évaluer arguments dans match.call()

Messagepar Pierre-Yves Berrard » 20 Jan 2019, 11:21

Malheureusement input n'est pas reconnu dans eval : Error in eval: object 'input' not found
Peut-être car hors contexte réactif ?

Un exemple reproductible :

Code : Tout sélectionner

library(shiny)

fun <- function(x, y) {
  env1 <- environment()
  res <- match.call()
  for (i in 2:length(res)) {
    if (is.name(u <- res[[i]]) || is.call(u))
      res[[i]] <- eval(u, env = parent.env(env1))
  }
  return(res)
}

ui <- fluidPage(
 numericInput("x","x", 4),
 verbatimTextOutput("res")
)

server <- function(input, output) {
  output$res <- renderText(deparse(fun(input$x, 5)))
}

shinyApp(ui = ui, server = server)
PY

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Évaluer arguments dans match.call()

Messagepar Logez Maxime » 20 Jan 2019, 19:39

Bonjour,

je ne sais pas comment sont gérer les variables avec shiny, c'est probablement un problème d'environnement.
La solution la plus simple :

Code : Tout sélectionner

fun <- function(x, y) {
  res <- match.call()
  x <- x
  y <- y
  res[[2]] <- x
  res[[3]] <- y
  return(res)
}
Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité