Это потому, что здесь txt
- это фрейм данных одной переменной, который также является списком длины один, тогда как txt[,]
- это просто вектор (тогда и только тогда, когда txt
имеет только одну переменную, и эта переменная вектор). Когда вы paste()
список, он дает вам такое представление объектов в каждом элементе.
Я приведу небольшой пример для демонстрации:
dat <- data.frame(x = letters[1:3])
paste0(dat[,], collapse = "")
# [1] "abc"
paste0(dat, collapse = "")
# [1] "c(\"a\", \"b\", \"c\")"
Эти обратные косые черты просто экранируются внутренние кавычки:
cat(paste0(dat, collapse = ""))
# c("a", "b", "c")
Теперь рассмотрим, что произойдет, если во фрейме данных будет вторая переменная:
dat <- data.frame(x = letters[1:3], y = LETTERS[1:3])
paste0(dat[,], collapse = "")
# [1] "c(\"a\", \"b\", \"c\")c(\"A\", \"B\", \"C\")"
paste0(dat, collapse = "")
# [1] "c(\"a\", \"b\", \"c\")c(\"A\", \"B\", \"C\")"
Теперь мы можем увидеть, что происходит. Когда фрейм данных имеет только одну переменную, dat[,]
вернет вектор, а если у него больше одной, он все равно вернет список ( фрейм данных также является списком ):
dat <- data.frame(x = letters[1:3])
str(dat[,])
# chr [1:3] "a" "b" "c"
dat <- data.frame(x = letters[1:3], y = LETTERS[1:3])
str(dat[,])
# 'data.frame': 3 obs. of 2 variables:
# $ x: chr "a" "b" "c"
# $ y: chr "A" "B" "C"
Другой пример, демонстрирующий это общее поведение при вставке списка:
l <- list(1:3)
l
# [[1]]
# [1] 1 2 3
paste(l)
# [1] "1:3"
paste(l[[1]])
# [1] "1" "2" "3"