我创建了一个允许将csv分配给变量的函数。然而,它不起作用,我不知道为什么。这是代码:
file_id <- readline("Type a common word for your files: ")
file_list <- list.files(pattern = file_id)
multi.csv <- function(pattern.seq)
{
for(i in 1:length(pattern.seq))
{
assign(pattern.seq[i], read.csv(pattern.seq[i]))
}
}
multi.csv(pattern.seq = file_list)
cat(" Now your .csv files are stored in variables: ", file_list)
让我解释一下这里发生了什么。让我们假设我有十个csv。只在名称中有一定数量的文件,例如。 file_01,file_02 ...函数list.files重新识别文件名中的模式并将其存储在char矢量c中(&#34; file_02&#34;,&#34; file_02&#34; ...)。然后我编写了函数multi.csv,它应该分配存储在csv中的数据。变成变量。然而,它不起作用。更重要的是,当我使用file_list vector的某个元素调用multi.csv函数外的assign
函数时:
assign(file_list[1], read.csv(file_list[1]))
它可以正常工作:变量file_01存储来自file_01.csv的数据。
您是否知道为什么它不能在multi.csv函数内工作?
我完全清楚读取许多csv文件的整个问题可以用不同的方式解决,但我想知道这里有什么问题。
答案 0 :(得分:1)
此处的问题与范围有关。
在R中,每个变量都存储在一个环境中。
new.env()
创建自定义环境。save()
文件复制到attach()
的新环境中,但不鼓励这样做。 assign()
上的文档在准确地传递哪个环境接收到要分配的变量时有点分散,但我会尝试引用所有相关的通道:
pos 在哪里完成作业。默认情况下,分配到当前环境中。有关其他可能性,请参阅“详细信息”。
envir 要使用的environment。请参阅“详细信息”。
pos 参数可以用以下几种方式指定分配对象的环境:as -1(默认值),作为正整数({{3}中的位置) } list);作为搜索列表中元素的字符串名称;或者作为search(包括使用environment访问当前活动的函数调用)。 envir 参数是指定环境的另一种方法,但主要用于反向兼容。
如果未指定 envir ,则分配将在当前活动的环境中进行。
如果 inherits 为TRUE,则会搜索所提供环境的封闭环境,直到遇到变量 x 。然后在遇到变量的环境中分配该值(假设绑定未锁定:请参阅with:如果是,则发出错误信号)。如果未遇到符号,则在用户的工作空间(全局环境)中进行分配。
如果 inherits 为FALSE,则赋值发生在 envir 的初始框架中,除非现有绑定被锁定或者没有现有绑定且环境被锁定(当发出错误信号时)。
由于您未在pos
调用中指定任何envir
,inherits
或assign()
个参数,因此该变量最终会被分配到“当前”又名“活跃”的环境。由于assign()
调用是在对multi.csv()
函数的调用内发生的,因此“当前”又称“活动”环境是对multi.csv()
函数进行特定评估的评估环境。当multi.csv()
的评估完成时,环境被破坏,变量被破坏(注意:关闭评估环境可以防止它被破坏,但是你的代码没有进行任何关闭,所以不会在这里申请。)
这也有助于解释为什么对assign()
的顶级调用有效:因为在这种情况下,“当前”又称“活动”环境是全局环境,因此变量正好位于您期望的位置:在您的工作区环境中。
您可以在pos=1L
来电中传递envir=globalenv()
或assign()
来解决问题。
(您也可以通过传递inherits=T
来解决问题,这类似于使用超级对齐运算符lockBinding,但不鼓励这样做。)
有关详细信息,请参阅<<-
。
答案 1 :(得分:0)
抱歉,为什么你需要任何模式?您是不是只需遍历文件夹中的所有文件并将内容合并到一个数据集中?尝试下面的脚本,看看它是否能满足您的需求。
setwd("C:/Users/xxx/")
file_list <- list.files()
file_list <- list.files("C:/Users/xxx/")
for (file in file_list){
# if the merged dataset doesn't exist, create it
if (!exists("dataset")){
dataset <- read.table(file, header=TRUE, sep="\t")
}
# if the merged dataset does exist, append to it
if (exists("dataset")){
temp_dataset <-read.table(file, header=TRUE, sep="\t")
dataset<-rbind(dataset, temp_dataset)
rm(temp_dataset)
}
}