Есть ли разница между выбором объекта и выбором объекта [,]? - PullRequest
2 голосов
/ 20 июня 2020

Возьмите какой-нибудь большой txt файл. Скажем, этот и прочтите его в:

loc<-[file location]
txt<-read.delim(loc, header = FALSE,stringsAsFactors=FALSE)

Если мы склеим все это вместе вот так, мы получим вполне разумный результат (я показал только его немного) :

> paste0(txt[,],collapse = "")
[1] "                    GNU GENERAL PUBLIC LICENSE                       Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies"

Но если вместо использования txt[,] мы просто используем txt, мы получим векторный вывод с множеством обратных косых черт (опять же, я усек).

> paste0(txt,collapse = "")
[1] "c(\"                    GNU GENERAL PUBLIC LICENSE\", \"                       Version 2, June 1991\", \" Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\", \" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\", \" Everyone is permitted to copy and distribute verbatim copies\"

Это означает, что существует разница между txt и txt[,]. Но что это?

1 Ответ

1 голос
/ 20 июня 2020

Это потому, что здесь 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...