0

文字が異なる文字列ベクトルのすべての要素の文字を置き換えようとしていますが、常に文字列の先頭または末尾から一定の距離にあります。substr文字列の先頭から文字を置き換えるために正常に使用できます。str_subパッケージstringrから使用して、文字列の末尾の文字を置き換えようとしています (負の数で逆方向にカウントできるため)。文字を置き換えますが、最初の要素の後のすべての要素について、文字の右側のすべてを最初の要素の文字列の末尾に置き換えます。

> require(stringr)
> x <- c("A'B'C","E!FG@H","I$JKL&M")
> substr(x,2,2) <- ":"
> x
[1] "A:B'C"   "E:FG@H"  "I:JKL&M"
> str_sub(x,-2,-2) <- ":"
> x
[1] "A:B:C"   "E:FG:C"  "I:JKL:C"
4

2 に答える 2

6

これを試して:

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"
于 2012-11-02T18:30:35.247 に答える
1

の何が問題なのかわかりませんがstr_sub、自分でロールすることができます:

my_sub <- function(x,n,s) {
  N <- nchar(x)-n+1
  substr(x,n,n) <- substr(x,N,N) <- s
  x 
}
my_sub(x,2,":")
# [1] "A:B:C"   "E:FG:H"  "I:JKL:M"
于 2012-11-02T18:25:10.403 に答える