Votre dernière mission consistait à trouver la fonction locf
(qui remplace les NA
par la dernière valeur connue) la plus compacte possible (étant bien entendu, comme d'habitude, que les espaces, les indentations et les retours à la ligne ne sont pas considérés comme des caractères). L’exemple que je vous ai donné était le suivant :
> x <- 10:20 > x[5:6] <- NA > locf(x) [1] 10 11 12 13 13 13 16 17 18 19 20 >
Ce faisant, j’ai commis une petite erreur : j’aurais dû préciser que locf
devrait aussi faire ça :
> x <- 10:20 > x[c(1:2, 5:6)] <- NA > locf(x) [1] NA NA 12 13 13 13 16 17 18 19 20 >
En tenant compte de cet oubli de ma part, vous êtes deux à remporter ce 4ème ChallengeR avec un corps de fonction d’à peine 34 caractères.
La première solution est de @dickoah :
locf = function(x) { x[cummax((!is.na(x)) * 1:length(x))] }
La seconde, qui présente l'avantage de traiter les NA
en début de vecteur, nous est proposée par @navarre_julien :
locf = function(x) { i = !is.na(x) c(NA, x[i])[cumsum(i)+1] }
Notez que, pour répondre strictement à mon énoncé (et donc sans supporter les NA
en début de vecteur), on pouvait raccourcir la version de Julien comme suit :
locf = function(x) { i = !is.na(x) x[i][cumsum(i)] }
La fonction locf
idéale est donc quelque chose du genre :
locf = function(x) { if(is.matrix(x)) { res <- apply(x, 2, locf) } else { i <- !is.na(x) res <- c(NA, x[i])[cumsum(i)+1] } res }
Bravo à tous les deux ! Voici donc ChallengeR, 5ème du nom.
Votre mission, si vous l’acceptez, consiste à coder le tricheur parfait dans mon petit tournois d’algos pour un dilemme du prisonnier répété. Vous devez concevoir une fonction de la forme :
msp = function(p, o, n = 2000) { # faire quelque chose... return(res) }
De telle sorte qu’elle pulvérise tous les records en trichant vilement. Edit : Tout le code est accessible sur Github.
Aucun commentaire:
Enregistrer un commentaire