R 3.1 sapply到文件列表

时间:2014-07-31 13:13:03

标签: r

我想将read.table()函数解析为 .txt 文件列表。这些文件位于我当前的目录中。

 my.txt.list <-
 list("subject_test.txt", "subject_train.txt", "X_test.txt", "X_train.txt")

在将read.table()应用于此列表的元素之前,我想检查 dt 是否尚未计算并且位于缓存目录中。来自缓存目录的 dt 已经在我的environment()中,格式为 file_name.dt

 R> ls()
 "subject_test.dt"  "subject_train.dt"

在这个例子中,我只想计算&#34; X_test.txt&#34;和&#34; X_train.txt&#34;。我写了一个小函数来测试是否已经缓存了 dt ,并且如果没有则应用read.table()

 my.rt <- function(x,...){
 # apply read.table to txt files if data table is not already cached
 # x is a character vector
 y <- strsplit(x,'.txt')
 y <- paste(y,'.dt',sep = '')
 if (y %in% ls() == FALSE){
     rt <- read.table(x, header = F, sep = "", dec = '.') 
}        
}

如果我以这种方式使用一个元素,则此函数有效:

 subject_test.dt <- my.rt('subject_test.txt')

现在我希望以这种方式sapply到我的文件列表:

 my.res <- saply(my.txt.list,my.rt)

我有my.res作为 df 的列表,但问题是该函数计算所有文件,并考虑已计算的文件。

我必须遗漏一些东西,但我不明白为什么。

TY建议。

1 个答案:

答案 0 :(得分:1)

我认为这与您的示例中使用strsplit有关。 strsplit返回一个列表。

这个怎么样?

my.txt.files <- c("subject_test.txt", "subject_train.txt", "X_test.txt", "X_train.txt")
> ls()
[1] "subject_test.dt"  "subject_train.dt"
my.rt <- function(x){
  y <- gsub(".txt", ".dt", x, fixed = T)
  if (!(y %in% ls())) {
    read.table(x, header = F, sep = "", dec = '.') }        
}
my.res <- sapply(my.txt.files, FUN = my.rt)

请注意,我将.txt替换为.dt,而我正在执行&#34;而不是&#34;。如果未处理文件,您将在结果列表中获得NULL个条目。

这是未经测试的,但我认为它应该有用......