На самом деле, lapply()
является избыточным для этой задачи.
string1 = "Now reading book"
words = c("alpha","beta","gamma")
Простой paste()
может уже делать то, что вы хотите:
paste(1:length(words), string1, words) # sep = " " is default
[1] "1 Now reading book alpha"
[2] "2 Now reading book beta"
[3] "3 Now reading book gamma"
Примечание: string1
является вектором длины 1, тогда как первый числовой вектор и words
являются векторами длины 3. Во многих функциях в R происходит то, что R умножает / повторяет более короткий вектор, циклически повторяя его содержимое снова и снова.В этом случае циклический переход по единственной строке «Сейчас читаем книгу» повторяется 3 раза.Это типичный способ решения таких ситуаций.Исходя из другого языка, это поведение удивительно.(Python просто выдаст ошибку и остановит выполнение в такой ситуации или срежет другие два с некоторым предупреждением).С этим, иногда удивительным, а иногда и очень неожиданным поведением R иногда бывает так трудно справиться.
Просто помните о концепции cycling
.
sep = <delimiter>
находится между содержаниемкаждый из векторов, которые ставятся из стороны в сторону.Каким-то образом, благодаря такому «соединительному» поведению, можно подумать, что paste()
является join()
заменой.Но это на самом деле не плоский нормальный join()
.Он «соединяет» вещи параллельно (как вы видите в примере, первые элементы заданных векторов рядом, вторые элементы рядом и т. Д.)
Однако paste0( , collapse="")
, которыйсинтаксический сахар для paste( , sep="", collapse="")
ведет себя немного как join()
в Python ... (при применении к векторам R, но не применительно к спискам).
l <- list("a", "b", "c")
paste0(l)
## [1] "a" "b" "c"
v <- c("a", "b", "c")
paste0(v)
## [1] "a" "b" "c"
paste0(v, collapse="")
## [1] "abc"
paste0(l, collapse="")
## [1] "abc"
# so paste0(, collapse="") or paste( , sep = "", collapse = "")
# applied on single vector or list behaves like python's join with separator as "" (which argument is ONE python list.