2011-10-11 28 views
67

各文字に異なる値を割り当てることによって、文字列を使用して2次元ウォークを行いたいとします。私は、文字列の最初の文字を「ポップ」して使用し、残りの文字列について繰り返すことを計画していました。文字列の最初の文字の取得と削除

どうすればこのようにすることができますか?

x <- 'hello stackoverflow' 

私はこのような何かをできるようにしたいと思います:

a <- x.pop[1] 

print(a) 

'h' 
print(x) 

'ello stackoverflow' 

答えて

109

?substringを参照してください。

x <- 'hello stackoverflow' 
substring(x, 1, 1) 
## [1] "h" 
substring(x, 2) 
## [1] "ello stackoverflow" 

両方が値を返すとxに格納されたデータを更新する副作用を有するpop方法を有するという考えは非常にオブジェクト指向プログラミングの概念です。したがって、文字ベクトルを操作する関数popを定義するのではなく、popメソッドを使用してreference classを作成することができます。

PopStringFactory <- setRefClass(
    "PopString", 
    fields = list(
    x = "character" 
), 
    methods = list(
    initialize = function(x) 
    { 
     x <<- x 
    }, 
    pop = function(n = 1) 
    { 
     if(nchar(x) == 0) 
     { 
     warning("Nothing to pop.") 
     return("") 
     } 
     first <- substring(x, 1, n) 
     x <<- substring(x, n + 1) 
     first 
    } 
) 
) 

x <- PopStringFactory$new("hello stackoverflow") 
x 
## Reference class object of class "PopString" 
## Field "x": 
## [1] "hello stackoverflow" 
replicate(nchar(x$x), x$pop()) 
## [1] "h" "e" "l" "l" "o" " " "s" "t" "a" "c" "k" "o" "v" "e" "r" "f" "l" "o" "w" 
8

使用stringiパッケージ

> x <- 'hello stackoverflow' 
> stri_sub(x,2) 
[1] "ello stackoverflow" 
3

からこの関数除去最初の文字:

x <- 'hello stackoverflow' 
substring(x, 2, nchar(x)) 

アイデアは、すべての文字は、xの文字数に2から出発して選択されます。これは、単語やフレーズに不等な文字数がある場合に重要です。

substring(x,1,1) 
6

substringは間違いなくベストですが、私はまだ1を見ていないので、ここでは、1つのstrsplitの代替です:

最初の文字を選択すると、以前の回答としては簡単です。

> x <- 'hello stackoverflow' 
> strsplit(x, '')[[1]][1] 
## [1] "h" 

または同等

> unlist(strsplit(x, ''))[1] 
## [1] "h" 

そして、あなたが一緒に戻って、文字列の残りの部分をpasteすることができます。

> paste0(strsplit(x, '')[[1]][-1], collapse = '') 
## [1] "ello stackoverflow" 
4

x <- 'hello stackoverflow' 
str_sub(x, 2) # or 
str_sub(x, 2, str_length(x)) 
[1] "ello stackoverflow" 
1

別の方法は、正規表現関数regmatchesregexecでキャプチャサブ表現を使用することですstringrパッケージからもstr_subあります。

# the original example 
x <- 'hello stackoverflow' 

# grab the substrings 
myStrings <- regmatches(x, regexec('(^.)(.*)', x)) 

これは、文字列全体、最初の文字を返し、そしてlist(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))に相当する長さのリスト1.

myStrings 
[[1]] 
[1] "hello stackoverflow" "h"     "ello stackoverflow" 

に結果を「ポップ」。つまり、目的の要素とフルストリングのスーパーセットが含まれています。


sapplyを追加すると、この方法は、これが最初の要素として一致文字列全体とによって捕捉整合部分式のリストを返す> 1.

# a slightly more interesting example 
xx <- c('hello stackoverflow', 'right back', 'at yah') 

# grab the substrings 
myStrings <- regmatches(x, regexec('(^.)(.*)', xx)) 

長の文字ベクトルのために働くことを可能にします()を以下の要素として含む。したがって、正規表現'(^.)(.*)'では、(^.)が最初の文字と一致し、(.*)が残りの文字と一致します。

myStrings 
[[1]] 
[1] "hello stackoverflow" "h"     "ello stackoverflow" 

[[2]] 
[1] "right back" "r"   "ight back" 

[[3]] 
[1] "at yah" "a"  "t yah" 

今、私たちは希望のサブストリングを引き出すために信頼できるsapply + [メソッドを使用することができます。

myFirstStrings <- sapply(myStrings, "[", 2) 
myFirstStrings 
[1] "h" "r" "a" 
mySecondStrings <- sapply(myStrings, "[", 3) 
mySecondStrings 
[1] "ello stackoverflow" "ight back"   "t yah" 
+0

これは非常に素晴らしいトリックですが、私はその質問を逃すと思います。 – pedrosaurio

+0

他の回答と同じ出力を生成できるので、さらに説明する必要があります。抽出に 'sapply'を使うコードの最後のブロックを見てください。質問で指定されている最初の文字を「ポップ」することは、結果のベクトル(mySecondStrings)に対してこのプロセスを繰り返すことです。 – lmo

+0

あなたが追加した余分な説明と一緒に動作することは確かですが、私はまだそれをもっと複雑にする必要があります。 – pedrosaurio

関連する問題