整数

2016-03-16 5 views
8

strtoi(x,base=36)が整数にbase36エンコードされた文字列を変換するbase36に変換:整数

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

この操作、すなわち、正の整数で指定されたbase36と同等の収率を反転させる機能がありますか?基本的に、私はしないよう

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

(私は36以外の任意の塩基を必要としませんが、base引数は持っていいだろう。)

+0

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

+0

重複はしませんが、同様の質問についてはこちら[こちら](http://stackoverflow.com/questions/23123314/converting-ascii-number-to) -strings-in-r) – RHertel

答えて

6

パッケージBBmiscをインストールすると、itostr機能が使用可能になります。

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

ことitostr()機能を探していますアルゴリズムの実装はそれほど難しくありません。ここには、32ビット符号付き整数で動作するものがあります。

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="")) 
} 

あなたはより大きな整数をサポートする必要がある場合は、bit64Rmpfrパッケージを使用することができます。

+0

ニース。私は、 'intToBase36(1679615)'を壊してしまったのですが、 'is.integer(1679615)'が 'FALSE'で、' intToBase36(1679615L) 'を使って少し強制してトリックします。 –

4

迅速Rcppはof thisをハックだけでなく、あなたにそれを取得します:

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" 

それは間違いなくしかし、本番用のビットより多くのコードを必要とします。

もう1つの回答で参照されているパッケージはC-backedなので、これはおそらく良い選択です。

+0

#ty Joshua。何が起こったのか分かりません(そして私はそれをキャッチしたはずです) – hrbrmstr

+0

これは面白そうですが、正直言って、私にとってはRcpp以外のユーザーではないと威張っています。私はドイツ語のデフォルトのロケールに関連するかもしれない暗号エラーを受け取ります: "include/Rcpp/Date.h:103(私はRcppユーザーになるべきだと私は仮定しています。 :エラー:フィールド "タイプが不完全です"。 –