Menggabungkan vektor string / karakter

273

Jika saya memiliki vektor tipe karakter, bagaimana saya bisa menggabungkan nilai ke dalam string? Inilah yang akan saya lakukan dengan paste () :

sdata = c('a', 'b', 'c')
paste(sdata[1], sdata[2], sdata[3], sep ='')

menghasilkan "abc".

Tapi tentu saja, itu hanya berfungsi jika saya tahu panjang sdata sebelumnya.

Nick
sumber

Jawaban:

480

Coba gunakan argumen runtuh kosong dalam fungsi tempel:

paste(sdata, collapse = '')

Terima kasih kepada http://twitter.com/onelinetips/status/7491806343

Matt Turner
sumber
7
Hanya sebuah catatan bahwa jika sdatadapat berisi string yang semuanya memiliki panjang yang sama atau panjang variabel maka paste(sdata, sep = '', collapse = '')harus digunakan untuk menghindari hasil yang tidak terduga.
zelanix
42

Jawaban Matt jelas merupakan jawaban yang tepat. Namun, inilah solusi alternatif untuk keperluan bantuan komik:

do.call(paste, c(as.list(sdata), sep = ""))
Ken Williams
sumber
6
Anda benar-benar bisa mengerjakan pernyataan apply () di sana. Jika Anda melakukannya saya akan memilih Anda;)
JD Long
ini sebenarnya akan menjadi solusi paling elegan jika collapseparameter tidak ada. jadi tidak banyak komedi lega jika Anda baru-baru ini benar-benar harus melakukan sesuatu yang sangat mirip :)
terbang domba
9

Anda dapat menggunakan stri_pastefungsi dengan collapseparameter dari stringipaket seperti ini:

stri_paste(letters, collapse='')
## [1] "abcdefghijklmnopqrstuvwxyz" 

Dan beberapa tolok ukur:

require(microbenchmark)
test <- stri_rand_lipsum(100)
microbenchmark(stri_paste(test, collapse=''), paste(test,collapse=''), do.call(paste, c(as.list(test), sep="")))
Unit: microseconds
                                      expr     min       lq     mean   median       uq     max neval
           stri_paste(test, collapse = "") 137.477 139.6040 155.8157 148.5810 163.5375 226.171   100
                paste(test, collapse = "") 404.139 406.4100 446.0270 432.3250 442.9825 723.793   100
do.call(paste, c(as.list(test), sep = "")) 216.937 226.0265 251.6779 237.3945 264.8935 405.989   100
bartektartanus
sumber
2
Saya belum pernah melakukan benchmark pada R. Nice untuk mempelajari sesuatu yang baru.
Torrien
6

Untuk sdata:

gsub(", ","",toString(sdata))

Untuk vektor bilangan bulat:

gsub(", ","",toString(c(1:10)))
Patrick
sumber
6
Ini adalah jawaban yang berbahaya - jika ada urutan koma-ruang pada elemen vektor, jawaban ini akan menghapusnya.
C8H10N4O2
5

Jawaban Matt Turner jelas merupakan jawaban yang tepat. Namun, dalam semangat jawaban Ken Williams, Anda juga bisa melakukan:

capture.output(cat(sdata, sep="")) 
C8H10N4O2
sumber
1

Berikut ini adalah fungsi utilitas kecil yang menciutkan daftar nilai yang disebutkan atau tidak disebutkan namanya menjadi satu string untuk pencetakan yang lebih mudah. Ini juga akan mencetak baris kode itu sendiri. Itu dari contoh daftar saya di halaman R.

Buat beberapa daftar dengan nama atau tanpa nama:

# Define Lists
ls_num <- list(1,2,3)
ls_str <- list('1','2','3')
ls_num_str <- list(1,2,'3')

# Named Lists
ar_st_names <- c('e1','e2','e3')
ls_num_str_named <- ls_num_str
names(ls_num_str_named) <- ar_st_names

# Add Element to Named List
ls_num_str_named$e4 <- 'this is added'

Berikut adalah fungsi yang akan mengkonversi daftar nama atau daftar tanpa nama ke string:

ffi_lst2str <- function(ls_list, st_desc, bl_print=TRUE) {

  # string desc
  if(missing(st_desc)){
    st_desc <- deparse(substitute(ls_list))
  }

  # create string
  st_string_from_list = paste0(paste0(st_desc, ':'), 
                               paste(names(ls_list), ls_list, sep="=", collapse=";" ))

  if (bl_print){
    print(st_string_from_list)
  }
}

Menguji fungsi dengan daftar yang dibuat sebelumnya:

> ffi_lst2str(ls_num)
[1] "ls_num:=1;=2;=3"
> ffi_lst2str(ls_str)
[1] "ls_str:=1;=2;=3"
> ffi_lst2str(ls_num_str)
[1] "ls_num_str:=1;=2;=3"
> ffi_lst2str(ls_num_str_named)
[1] "ls_num_str_named:e1=1;e2=2;e3=3;e4=this is added"

Menguji fungsi dengan subset elemen daftar:

> ffi_lst2str(ls_num_str_named[c('e2','e3','e4')])
[1] "ls_num_str_named[c(\"e2\", \"e3\", \"e4\")]:e2=2;e3=3;e4=this is added"
> ffi_lst2str(ls_num[2:3])
[1] "ls_num[2:3]:=2;=3"
> ffi_lst2str(ls_str[2:3])
[1] "ls_str[2:3]:=2;=3"
> ffi_lst2str(ls_num_str[2:4])
[1] "ls_num_str[2:4]:=2;=3;=NULL"
> ffi_lst2str(ls_num_str_named[c('e2','e3','e4')])
[1] "ls_num_str_named[c(\"e2\", \"e3\", \"e4\")]:e2=2;e3=3;e4=this is added"
kipas
sumber