2016-03-16 20 views
8

strtoi(x,base=36) convertirà una stringa base36 codifica per un numero intero:convertire un intero in base36

strtoi("zzzz",base=36) 
[1] 1679615 

Esiste una funzione che inverte questa operazione, cioè, dato un intero positivo produce il base36 equivalente? In sostanza, sto cercando un itostr() funzione tale che

itostr(1679615,base=36) 
[1] "zzzz" 

(Non ho bisogno di alcuna base diverso da 36, ​​ma un argomento base sarebbe bello avere.)

+0

anche https://github.com/statsmaths/baseN –

+0

Non è un duplicato, ma una domanda simile è discussa [qui.] (Http://stackoverflow.com/questions/23123314/converting-ascii-number-to -strings-in-r) – RHertel

risposta

6

Credo che se si installa il pacchetto BBmisc, ha la funzione itostr è disponibile.

library(BBmisc) 
itostr(1679615,base=36) 
[1] "zzzz" 
5

non lo faccio Conoscere eventuali implementazioni, ma l'algoritmo non è così difficile. Ecco uno che funziona su interi con segno a 32 bit.

intToBase36 <- function(int) { 
    stopifnot(is.integer(int) || int < 0) 

    base36 <- c(as.character(0:9),LETTERS) 
    result <- character(6) 
    i <- 1L 
    while (int > 0) { 
    result[i] <- base36[int %% 36L + 1L] 
    i <- i + 1L 
    int <- int %/% 36L 
    } 
    return(paste(result, sep="", collapse="")) 
} 

è possibile utilizzare i pacchetti bit64 e Rmpfr se è necessario supportare interi più grandi.

+0

Bello. Sono rimasto un po 'sorpreso che si è rotto su 'intToBase36 (1679615)', ma poi di nuovo, ovviamente 'is.integer (1679615)' è 'FALSE', e un po' di coercizione usando' intToBase36 (1679615L) 'fa il trucco . –

4

Un rapido Rcpp incidere of this ti porterà pure:

library(inline) 

cxxfunction(signature(x="numeric"), body=' 
unsigned int val = as<unsigned int>(x); 
static char const base36[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
std::string result; 
result.reserve(14); 
do { 
    result = base36[val % 36] + result; 
} while (val /= 36); 
return wrap(result); 
', plugin="Rcpp") -> base36enc 

base36enc(36) 
## [1] "10" 

base36enc(72) 
## [1] "20" 

base36enc(73) 
## [1] "21" 

decisamente ha bisogno di un po 'più di codice per l'uso in produzione, però.

Il pacchetto BBmisc a cui si fa riferimento in un'altra risposta è anche C-backed quindi è probabilmente una buona scelta.

+0

#ty Joshua. Non ho idea di come sia successo (e avrei dovuto prenderlo) – hrbrmstr

+0

Questo sembra interessante, ma ad essere onesti, è un po 'intimidatorio per me come utente non Rcpp. (Suppongo che la replica canonica sia che io * dovrei * diventare un utente di Rcpp. Supplico la mancanza di tempo.) In più, ottengo errori criptici che possono essere collegati alla mia localizzazione predefinita tedesca: "include/Rcpp/Date.h: 103 : errore: campo "m_tm" ha tipo incompleto ". –