将包含不同类元素的列表写入文本文件



如何使用R基函数将不同类变量的列表写入文本文件?

writecat 无法处理 data.frames,并且write.table仅特定于表。它们都无法正确处理列表。示例列表:

> test
[[1]]
[1] "a" "b" "c"
[[2]]
[1] "d" "e" "f"
[[3]]
[1] 1 2 3
[[4]]
  X.g. X.h. X.i.
1    g    h    i
[[5]]
[[5]][[1]]
[1] "k"
[[5]][[2]]
[1] "l"
[[5]][[3]]
[1] "m" "n"

[[6]]
[1] "2015-03-23 11:15:00 CET"

它由characternumericPOSIXlt时间变量和另一个列表组成。

期望的结果 - 这样的文本文件:

a b c
d e f
1 2 3
X.g.    X.h.    X.i.
1   g   h   i
k
l
m n
2015-03-23 11:15:00

我制作了一个脚本来处理按元素类的列表并将其逐个打印到文件中:

write_list <- function (outlist, outfile,append=FALSE) {
    for (i in 1:length(outlist)) {
      if (i==1) app=append else app=TRUE
      if (is.character(outlist[[i]]) || is.numeric(outlist[[i]])) write(paste(outlist[[i]],collapse = " "),outfile, append=app)
      else 
        if (is.data.frame(outlist[[i]])) write.table(outlist[[i]],outfile, append=app, quote=FALSE, sep="t")
        else 
          if (is.POSIXlt(outlist[[i]])) write (as.character(outlist[[i]]),outfile, append=app)
          else
            if  (is.list(outlist[[i]])) write_list(outlist = outlist[[i]], outfile, append = TRUE)
    }
}

is.POSIXlt是一个自定义函数:

is.POSIXlt <- function (ts) {
isPOS=c("POSIXlt", "POSIXt")
identical (class(ts),isPOS)
}

最后的if语句是一个递归调用 - "列表列表"情况的情况。它为内部列表调用自身并按元素处理它。

最新更新