我想将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建议。
答案 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
个条目。
这是未经测试的,但我认为它应该有用......