2015-09-28 55 views
0

我正在學習R,到目前爲止,除了以下問題外,我沒有遇到任何麻煩,我希望有人能幫助我理解。爲什麼組合產生一個不同於readLines()函數的行爲

如果創建以下列方式test1 <- c("a", "b", "c") 字符矢量I得到類型字符之一矢量,我可以通過一個索引test1[n]訪問該向量中的每個成員。

這是有道理的,並做我理解它應該做的。

但是如果我做test2 <- readLines("file1.txt")其中FILE1.TXT包含一個線路(幾個隨機字空格分隔)。我得到類字符的一個矢量(同第一種情況),並我不能使用索引器(除非有辦法,我還不知道)。

問題:

  1. 爲什麼兩者都基於char類型,但它們存儲不同
  2. 如何人能告訴他們分開不知道他們是如何被創建
  3. 除了使用strsplit()是有辦法打破它像c()在加載時從文件?

任何幫助理解這種語言的內部是狂熱讚賞!

+0

嘗試'掃描( 「FILE1.TXT」, 「」,九月=「「) '而不是'readLines()'來獲得分隔值 –

回答

1

爲什麼都是char類型基礎,但它們存儲不同

兩者都存儲在完全相同的方式。 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" 
相關問題