版本1.11.0中引用字符列的fread行为

p-g*_*-gw 5 r data.table

最近对freaddata.table版本1.11.0(2018年5月1日)的更改似乎无法识别na.strings带引号的字符列的正确值.

结合使用的默认行为fwrite可以正常工作,如新闻中所述并在下面的工作示例(fread(fwrite(DT))==DT)中显示.

但是,如果使用fwrite(DT, quote = TRUE)模拟write.csv直接使用的文件或写入文件的行为来编写文件write.csv,则fread似乎在检测指定的正确字符串时出现问题na.strings(如下面的非工作示例所示).

工作实例

dt <- data.table(A = c(1, 2, 3), B = c("a", "b", NA))
fwrite(dt, "testfile.csv")

# expected output
str(fread("testfile.csv", na.strings = c("a", "")))

Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ A: int  1 2 3
 $ B: chr  NA "b" NA
 - attr(*, ".internal.selfref")=<externalptr> 
Run Code Online (Sandbox Code Playgroud)

规格na.strings似乎工作中使用未加引号字符这个例子就好了.

非工作的例子

使用dt上面示例中的data.table :

fwrite(dt, "testfile_quoted.csv", quote = TRUE)  # mimicing write.csv
Run Code Online (Sandbox Code Playgroud)

在这里,指定na.strings = ""也给出了预期的结果

str(fread("testfile_quoted.csv", na.strings = ""))

Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ A: int  1 2 3
 $ B: chr  "a" "b" NA
 - attr(*, ".internal.selfref")=<externalptr> 
Run Code Online (Sandbox Code Playgroud)

但是,尝试na.strings = c("a", "")在上面的示例中指定会产生意外结果:

str(fread("testfile_quoted.csv", na.strings = c("a", "")))

Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ A: int  1 2 3
 $ B: chr  "a" "b" NA
 - attr(*, ".internal.selfref")=<externalptr> 
Run Code Online (Sandbox Code Playgroud)

列的预期结果Bc(NA, "b", NA)与上面的工作示例相同.

na.strings直接指定引号也不会改变我的结果.

str(fread("testfile_quoted.csv", na.strings = c("\"a\"", "")))

Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ A: int  1 2 3
 $ B: chr  "a" "b" NA
 - attr(*, ".internal.selfref")=<externalptr> 
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

在版本1.11.0之前我没有遇到这些问题.有没有办法恢复旧的行为fread,以保持与旧文件的一致性write.csv


会话信息

sessionInfo()

R version 3.5.0 (2018-04-23)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=German_Austria.1252  LC_CTYPE=German_Austria.1252   
[3] LC_MONETARY=German_Austria.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Austria.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.11.0

loaded via a namespace (and not attached):
[1] compiler_3.5.0 tools_3.5.0   
  [1]: https://github.com/Rdatatable/data.table/blob/master/NEWS.md
Run Code Online (Sandbox Code Playgroud)