2011-01-20 4 views
4

Je voudrais une fonction qui, lorsqu'elle est passée une chaîne contenant uniquement des lettres, fait tourner chaque lettre de la chaîne dans l'alphabet par X caractères, où X est un paramètre de la fonction. L'instance célèbre est lorsque X = 13, qui est appelé ROT-13Mettre en œuvre ROT-13 dans R

fonction < - ROTX (str, x) { ?? }

C'est le genre de chose que je m'attendrais à ce qu'un assistant R puisse faire en quelques lignes, alors que je finirais avec 10 ou plus.

Répondre

3
rotX <- function(ch,x) 
{ #rotate each letter of a string ch by x letters thru the alphabet, as long as x<=13 
    old <- paste(letters, LETTERS, collapse="", sep="") 
    new <- paste(substr(old, 2*x+1, 26*2), substr(old, 1, 26), sep="") 
    chartr(old, new, ch) 
} 

Cela corrige deux problèmes je le notais dans mon commentaire.

6

Voir ?chartr (section Exemples):

rot <- function(ch, k = 13) { 
    p0 <- function(...) paste(c(...), collapse="") 
    A <- c(letters, LETTERS, " '") 
    I <- seq_len(k) 
    chartr(p0(A), p0(c(A[-I], A[I])), ch) 
} 

ou ici http://rosettacode.org/wiki/Rot-13#R:

rot13 <- function(x) 
{ 
    old <- paste(letters, LETTERS, collapse="", sep="") 
    new <- paste(substr(old, 27, 52), substr(old, 1, 26), sep="") 
    chartr(old, new, x) 
} 
+0

merci, c'est génial - sauf que rot ('N') donne '' - espace, quand il devrait donner 'A'. Pour moi, cela ressemble à une erreur dans l'aide de chartr, où vous avez obtenu la fonction de - en supposant qu'ils avaient en effet l'intention d'implémenter le réel ROT-13. Cela peut être résolu en omettant la troisième chaîne de la définition A, donc la troisième ligne est à la place A <- c (lettre, LETTRES) Bien qu'elle diffère aussi de la norme ROT-13 en tournant parfois les majuscules en minuscules et vice versa –