回答:
を参照してください?substring
。
x <- 'hello stackoverflow'
substring(x, 1, 1)
## [1] "h"
substring(x, 2)
## [1] "ello stackoverflow"
pop
値を返すメソッドと、格納されているデータを更新する副作用があるメソッドをx
用意するという考え方は、オブジェクト指向プログラミングのコンセプトのほとんどです。したがってpop
、文字ベクトルを操作する関数を定義するのではなく、メソッドを使用して参照クラスを作成できpop
ます。
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"
stringi
パッケージからこの関数を使用する
> x <- 'hello stackoverflow'
> stri_sub(x,2)
[1] "ello stackoverflow"
もう1つの方法は、正規表現関数regmatches
とを使用して部分式をキャプチャすることregexec
です。
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
これは、文字列全体、最初の文字、および「ポップ」結果を長さ1のリストで返します。
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
これはと同等list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
です。つまり、目的の要素のスーパーセットと完全な文字列が含まれます。
追加する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"
これで、trusty sapply
+ [
メソッドを使用して、目的の部分文字列を取り出すことができます。
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"
sapply
抽出に使用するコードの最後のブロックを参照してください。質問で指定されているように、最初の文字を「ポップ」することは、結果のベクター(mySecondStrings)でこのプロセスを繰り返すことです。