web-dev-qa-db-ja.com

ベクターを連結するにはどうすればよいですか?

「p30s4」「p28s4」から「p30s4 p28s4」に移動するなど、2つの文字の連結である単一の変数を生成しようとしています。以下に示すように猫と貼り付けを試しました。どちらも空の変数を返します。私は何を間違えていますか?

> blah = c("p30s4","p28s4")
> blah
[1] "p30s4" "p28s4"

> foo = cat(blah)
p30s4 p28s4
> foo
NULL

> foo = paste(cat(blah))
p30s4 p28s4
> foo
character(0)
32
John

使用してみてください:

> paste(blah, collapse = "")
[1] "p30s4p28s4"

または、間にスペースが必要な場合:

> paste(blah, collapse = " ")
[1] "p30s4 p28s4"
60
shuttle87

Paste()の 'collapse'引数の代わりに、do.call()を使用して、ベクトルの各値を引数として渡します。

do.call(paste,as.list(blah))

利点は、このアプローチが「貼り付け」以外の機能に一般化できることです。

10
wkmor1

この質問に対する答えは素晴らしく、私のものよりもはるかに単純です。それ以来、「崩壊」の使用を採用しました。

ただし、疑問がある場合は独自の関数を作成できるという考えを促進するために、以前のエレガントではないソリューションを紹介します。

  vecpaste <- function (x) {
     y <- x[1]
     if (length(x) > 1) {
         for (i in 2:length(x)) {
             history
             y <- paste(y, x[i], sep = "")
         }
     }
     #y <- paste(y, "'", sep = "")
     y
 }

vecpaste(blah)

引用符やカンマなどを追加することもできます-これは私が書いた元のバージョンです:

vecpaste <- function (x) {
y <- paste("'", x[1], sep = "")
if (length(x) > 1) {
    for (i in 2:length(x)) {
        history
        y <- paste(y, x[i], sep = "")
    }
}
y <- paste(y, "'", sep = "")
y
}
2
David LeBauer

上記のcatの使用に関する問題は、cat(x)xを変数ではなく出力に書き込むことです。文字列に書き込みたい場合は、次のようにします。

capture.output(cat(blah))

名前が示すとおり、出力を文字列にキャプチャして、目的の結果を返します。ただし、これはnot推奨される方法であり、代替ソリューションによる説明にすぎません。

1
C8H10N4O2