为什么combine会产生与readLines()函数

时间:2015-09-28 00:08:18

标签: r

我正在学习R,到目前为止,除了以下问题我没有遇到任何麻烦,我希望有人能帮助我理解。

如果我按以下方式创建角色向量test1 <- c("a", "b", "c") 我得到一个字符类型的向量,我可以通过索引器test1[n]访问向量的每个成员。

这是有道理的,并做我理解应该做的事情。

但是,如果我test2 <- readLines("file1.txt")其中 file1.txt 包含一行(几个随机单词空格分隔),我会得到一个类字符的向量(与第一个案例),我不能使用索引器(除非有方法,我还不知道)。

问题:

  1. 为什么两者都是基于字体的,但它们的存储方式不同
  2. 如何在不知道如何创建
  3. 的情况下告诉他们
  4. 除了使用strsplit()之外,还有一种方法可以像c()那样在加载时从文件中分解它吗?
  5. 非常感谢任何有助于理解这种语言内容的帮助!

1 个答案:

答案 0 :(得分:1)

  

为什么两者都是基于字符类型的,但它们的存储方式不同

两者都以完全相同的方式存储。 R没有特定的类型来表示单个字符,因此字符不是集合。

在第一种情况下,您只需要一个长度为3的字符向量,其中每个元素的大小为1

test1 <- c("a", "b", "c")
typeof(test1)
# [1] "character"
length(test1)
# [1] 3
nchar(test1)
# [1] 1 1 1

在第二种情况下,长度等于输入文件中行数的字符向量,每个元素的大小等于字符串的长度:

writeLines("foobar", con="file1.txt")
test2 <- readLines("file1.txt")
typeof(test2)
# [1] "character"
length(test2)
# [1] 1
nchar(test2)
# [1] 6
  

除了使用strsplit()之外,还有一种方法可以像c()那样在加载时从文件中分解它吗?

如果你有固定尺寸的元素,你可以尝试readBin,但一般来说strisplit是要走的路:

f <- "file1.txt"
readBin(f, what = 'raw', size = 1, n = file.info(f)$size) %>% sapply(rawToChar)
# [1] "f"  "o"  "o"  "b"  "a"  "r"  "\n"