2010-07-24 6 views
3

J'ai écrit une fonction qui va transformer un nombre en base 10 en une autre base (je ne m'intéresse qu'aux bases 2 - 9). Mes fonctions actuelles pour convertir la base 10 à la base 2 ressemble à:mapply recyclage arguments

cb2 <- function(num){ 
    td<-{} 
    a <- {} 
    while (num 2 > 0){ 
     a <- num %% 2 
     td <- paste(td,a, sep="") 
     num <- as.integer(num/2)    
    } 
    return(td) 
} 

Et l'utilisation serait:

sapply(1:10, cb2) 

Je voudrais généraliser cette fonction et inclure la base préférée (s) comme arguments à la fonction, ala ...

convertbase <- function(num, base){ 
    td<-{} 
    a <- {} 
    while (num/base > 0){ 
     a <- num %% base 
     td <- paste(td,a, sep="") 
     num <- as.integer(num/base)    
    } 
    return(td) 
} 

Si je ne suis intéressé par un numéro unique converti dans la base 2-10, tout va bien:

mapply(convertbase, 10, 2:10) 

Cependant, si je veux chiffres 1:10 pour la base 02h10, je rencontre des problèmes:

mapply(convertbase, 1:10, 2:10) 
Warning message: 
In mapply(convertbase, 1:10, 2:10) : 
    longer argument not a multiple of length of shorter 

Idéalement, cette fonction ou un ensemble de fonctions renverrait une trame de données avec des colonnes séparées pour la base 2 -10, mais je réalise qu'il manque quelque chose entre le code que j'ai et le but. Toute aide serait appréciée.

+0

Vous n'avez pas besoin d'initialiser les variables dans R, en particulier avec des blocs de code vides. Donc 'td <- {}' et 'a <- {}' peuvent être supprimés. – mbq

+0

Merci pour le conseil mbq - encore apprendre la structure de base de R évidemment. Je reçois l'erreur suivante si je n'instancie pas la variable td: Erreur dans le collage (a, t, sep = ""): ne peut pas forcer le type 'fermeture' à un vecteur de type 'caractère' Je suppose que c'est parce que le La fonction pousse les nouvelles valeurs sur le vecteur, similaire à "push/pop" ou "shift/unshift" dans Perl? – Chase

Répondre

7

mapply applique la fonction à chaque ligne, alors qu'il me semble que vous souhaitez appliquer la fonction à toutes les combinaisons de nombre et de base. Cela fait l'affaire:

outer(1:10,2:9,Vectorize(convertbase)) 
+0

C'était exactement ce que je cherchais - je n'étais pas au courant de la fonction extérieure. Merci! – Chase