使用this answer,我创建了一个应该读入目录中所有文本数据集的函数:
read.delims = function(dir, sep = "\t"){
# Make a list of all data frames in the "data" folder
list.data = list.files(dir, pattern = "*.(txt|TXT|csv|CSV)")
# Read them in
for (i in 1:length(list.data)) {
assign(list.data[i],
read.delim(paste(dir, list.data[i], sep = "/"),
sep = sep))
}
}
但是,即使指定目录中有.txt和.csv文件,也不会创建R对象(我猜测这是因为我在函数中使用read.delim
)。如何纠正这个?
答案 0 :(得分:1)
正如我在评论中所说,分配后需要return()
一个值。我真的没有看到使用assign()
的重点,所以这里有一个简单的for循环,假设你希望你的输出是一个数据帧列表。
请注意,为了方便起见,我将阅读功能更改为read.table()
。您可能想要调整它。
read.delims <- function(dir, sep = "\t"){
# Make a list of all data frames in the "data" folder
list.data <- list.files(dir, pattern = "*.(txt|TXT|csv|CSV)")
list.out <- as.list(1:length(list.data))
# Read them in
for (i in 1:length(list.data)) {
list.out[[i]] <- read.table(paste(dir, list.data[i], sep = "/"), sep = sep)
}
return(list.out)
}
也许您还应该在正则表达式中添加$
。
干杯。
答案 1 :(得分:1)
您可以在作业中添加参数envir
,如下所示:
read.delims = function(dir, sep = "\t"){
# Make a list of all data frames in the "data" folder
list.data = list.files(dir, pattern = "*.(txt|TXT|csv|CSV)")
# Read them in
for (i in 1:length(list.data)) {
assign(list.data[i],
read.delim(paste(dir, list.data[i], sep = "/"),
sep = sep),
envir=.GlobalEnv)
}
}
这样做,您的对象将在全局环境中创建,而不仅仅在函数环境中创建