attach dans .onLoad

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 : 575
Enregistré le : 12 Jan 2016, 23:30

Re: attach dans .onLoad

Messagepar Pierre-Yves Berrard » 13 Fév 2019, 14:05

Une solution qui fonctionne, à un détail près (la ligne en commentaire) :

Code : Tout sélectionner

obj <- list(data = data.frame(id = 1:2, val1 = 11:12, val2 = 101:102))
class(obj) <- "ma_classe"

`[.ma_classe` <- function(x, i, j, drop = TRUE) {

  # if (missing(j)) return(`[.list`(x, i))
  `[.data.frame`(x$data, i, j, drop)
 
}

Ça fonctionne quand j'utilise deux arguments dans le crochet : obj[2, "val1"]
Par contre, j'aimerais que lorsque je n'utilise qu'un argument obj[1], je souhaiterais une sélection "standard" sur la liste.
D'où ma ligne en commentaire, mais je n'arrive pas à trouver la méthode par défaut pour une liste, même après avoir consulté

Code : Tout sélectionner

methods("[")
PY

Mickael Canouil
Messages : 483
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: attach dans .onLoad

Messagepar Mickael Canouil » 13 Fév 2019, 15:06

Que veut dire 'sélection "standard"' ?
Le comportement par défaut de la méthode "[" n'est pas suffisant ?

Code : Tout sélectionner

obj <- list(data = data.frame(id = 1:2, val1 = 11:12, val2 = 101:102))
class(obj) <- "ma_classe"
`[.ma_classe` <- function(x, i, j, drop = TRUE) {
  # if (missing(j)) return(`[.list`(x, i))
  `[.data.frame`(x$data, i, j, drop)
}

obj[1, 'val1']
#> [1] 11
obj[2, 'val1']
#> [1] 12
obj[1]
#> $id
#> [1] 1
#>
#> $val1
#> [1] 11
#>
#> $val2
#> [1] 101
obj[c(1, 2)]
#>   id val1 val2
#> 1  1   11  101
#> 2  2   12  102


EDIT:
On peut éventuellement forcer le format de sorti à être un data.frame si j est manquant (et i atomique)

Code : Tout sélectionner

obj <- list(data = data.frame(id = 1:2, val1 = 11:12, val2 = 101:102))
class(obj) <- "ma_classe"
`[.ma_classe` <- function(x, i, j, drop = TRUE) {
  out <- `[.data.frame`(x$data, i, j, drop)
  if (missing(j)) {
    as.data.frame(out)
  } else {
    out
  }
}

obj[1, 'val1']
#> [1] 11
obj[2, 'val1']
#> [1] 12
obj[1]
#>   id val1 val2
#> 1  1   11  101
obj[c(1, 2)]
#>   id val1 val2
#> 1  1   11  101
#> 2  2   12  102
Mickaël

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

Re: attach dans .onLoad

Messagepar Pierre-Yves Berrard » 13 Fév 2019, 15:22

J'ai trouvé, on peut supprimer la classe pour retomber sur la méthode par défaut.

Code : Tout sélectionner

`[.ma_classe` <- function(x, i, j, drop = TRUE) {
  if (missing(j)) return(unclass(x)[i])
  `[.data.frame`(x$data, i, j, drop)
}

Encore merci Mickael.
PY


Retourner vers « Questions en cours »

Qui est en ligne

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