各文字に異なる値を割り当てて、文字列を使用して2次元ウォークを行いたいと思います。私は、文字列の最初の文字を「ポップ」し、それを使用し、残りの文字列について繰り返すことを計画していました。
どうすればこのようなことを達成できますか?
x <- 'hello stackoverflow'
私はこのようなことをしたいです:
a <- x.pop[1]
print(a)
'h'
print(x)
'Ello stackoverflow'
?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"
ストリンガーパッケージのstr_sub
もあります
x <- 'hello stackoverflow'
str_sub(x, 2) # or
str_sub(x, 2, str_length(x))
[1] "Ello stackoverflow"
stringi
パッケージのこの関数を使用します
> x <- 'hello stackoverflow'
> stri_sub(x,2)
[1] "Ello stackoverflow"
substring
は間違いなく最高ですが、ここに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"
最初の文字を削除する:
x <- 'hello stackoverflow'
substring(x, 2, nchar(x))
アイデアは、2からxの文字数までのすべての文字を選択することです。これは、Wordまたはフレーズの文字数が異なる場合に重要です。
前の回答のように、最初の文字を選択するのは簡単です。
substring(x,1,1)
もう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"
これで、信頼できるsapply
+ [
メソッドを使用して、必要なサブストリングを取り出すことができます。
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "Ello stackoverflow" "ight back" "t yah"