これを試して:
require(stringr)
x <- c("A'B'C","E!FG@H","I$JKL&M")
substr(x,2,2) <- ":"
str_sub(x, rep(-2, length(x)), rep(-2, length(x))) <- ":"
このように動作する理由は、 str_cstr_sub<-
の結果を渡すstr_sub(x, start, end)
ためです。これは、折りたたみがうまくいかない場所です。
ソース コードの関数は次のとおりです。
"str_sub<-" <- function(string, start = 1L, end = -1L, value) {
str_c(
str_sub(string, end = start - 1L),
value,
ifelse(end == -1L, "", str_sub(string, start = end + 1L)))
}
したがって、事実上、str_c
関数に 3 つの引数、1 つ以上の文字ベクトル、挿入文字列、および折りたたみパラメーター (ifelse ビット) を渡しています。代入関数を使用せずに実行した結果str_sub
が (最初の str_sub を既に実行した場合:
> (test.string <- str_sub(x, start = 1L, end = -2 - 1L)) #start defaults to 1L
[1] "A:B" "E:FG" "I:JKL"
> replace.string <- ":"
> (collapse.string <- ifelse(end == -1L, "", str_sub(string, start = end + 1L)))
[1] "C"
> str_c(test.string, replace.string, collapse.string)
[1] "A:B:C" "E:FG:C" "I:JKL:C"
最初に、置き換えたいシンボルの左側にあるものをすべて保存してから、折りたたみパラメーターを設定します。崩壊パラメーターは興味深いものです。str_c のドキュメントを見ると、次のように書かれていることがわかります。
collapse が ... non-'NULL' の場合、その文字列は各行の最後に挿入され、マトリックス全体が 1 つの文字列に折りたたまれます。
これがまさにここで起こっていることです。文字列を置き換えると、各文字列の末尾にcollapseパラメーターが追加されます。
しかし実際には、これは ifelse 関数が使用されていない場合に機能します。ifelse がないと、最初のインデックス "C" を取得する代わりにstr_sub(string, start = end + 1L)
返されるためです。[1] "C" "H" "M"
これが、代わりに c(-2, -2, -2) の開始値と終了値を追加すると、正しい答えが得られる理由です。
> (test.string <- str_sub(x, start = 1L, end = c(-2, -2, -2) - 1L)) #start defaults to 1L
[1] "A:B" "E:FG" "I:JKL"
> replace.string <- ":"
> (collapse.string <- ifelse(end == -1L, "", str_sub(string, start = c(-2, -2, -2) + 1L)))
[1] "C" "H" "M"
> str_c(test.string, replace.string, collapse.string)
[1] "A:B:C" "E:FG:C" "I:JKL:C"