如何在没有临时对象的情况下进行textConnection

时间:2016-07-13 01:58:09

标签: r

我尝试将带有列分隔符的文本表导入为' |'和行分隔符为" ----------"。我可以使用grep()和gsub()删除垂直条和短划线,但我无法弄清楚如何避免将编辑的行保存为临时对象。此代码有效:

foo <- gsub("|", " ",
            grep("-------", readLines(
                file("myfile", open="r")),
                 value=T, invert=T),
            fixed=T)
the.con <- textConnection(foo, "r")
agency <- read.fwf(the.con, widths=dif.widths)

但如果我尝试在一行中完成整个事情而不保存临时对象&#34; foo&#34;那就失败了。

agency <- read.fwf(textConnection( 
                   gsub("|", " ",
                        grep("-------", readLines(
                            file("myfile", open="r")),
                             value=T, invert=T),
                        fixed=T)), widths=dif.widths)

我收到此消息:

Error in textConnection(gsub("|", " ", grep("-------", readLines(file("myfile",  : 
  argument 'object' must deparse to a single character string

我很难过。有人有什么想法吗?

2 个答案:

答案 0 :(得分:1)

deparse(substitute(...))执行一些myread <- function(filename, widths) { tmp <- readLines(filename) tmp <- grep("^[-]+$", tmp, value = TRUE, invert = TRUE) tmp <- gsub("|", " ", tmp, fixed = TRUE) con <- textConnection(tmp) on.exit(close(con)) read.fwf(con, widths = widths) } agency <- myread("myfile", dif.widths) 魔术,将输入表达式转换为字符向量,并将其与调用环境一起传递给较低级别​​的C例程。这意味着您只能传递简单的表达式。

我不打算讨论,如果这是阅读文件的最佳方式,因为我不知道你文件中的内容,这不是你的问题。

首先,我不确定你为什么要避开临时对象。即使你没有明确地创建它们,R也会在执行你的代码时创建它们,所以你不会在性能方面获得任何好处。但是,您将获得难以阅读的代码。如果您想避免使用临时变量使您的环境混乱,可以将代码放入函数中:

file

在这里,我还避免了对创建文件连接的readLines的不必要的调用,在您的示例中,之后不会关闭。将文件名直接传递给readLines %>%时,会为您打开并关闭连接。

如果您真的希望将所有内容放在一行并保持可读性,我会使用magrittr中的library(magrittr) agency <- readLines("myfile") %>% grep("-----", ., value=TRUE, invert=TRUE) %>% gsub("|", " ", ., fixed=TRUE) %>% textConnection %>% read.fwf(, widths = dif.widths) 运算符:

{{1}}

答案 1 :(得分:0)

如果列分隔符是“|”然后不要扔掉它们,使用它们。使用readLines删除“行分隔符”作为初始输入,然后使用read.table删除sep ="|"

 inp <- readLines(con="file.nam")
 inp <- inp[ !grepl(grep("-------", inp) ]  # overwrite inp; drop "---------"
 dat <- read.table(text=inp, sep="|")

否则,您可能会考虑使用scan进行多行读取。如果你想要测试代码,你应该提供一个例子。

这是一种不在R工作区中创建临时文件的方法,而是使用awk过滤掉-------行:

 inp <- read.table( pipe("awk '!/------/'  '/full_path/to/fwftest.txt'"), 
                    sep="|")