在R中自动运行文件

时间:2018-07-22 20:24:35

标签: r automation

我需要在R中自动执行一个过程。基本上,我有一个R脚本(我将其称为 R1 ),该脚本需要三个单独的文件才能运行。这三个文件是我研究中一项试验的结果输出。

对于这三个文件上的R1的每次运行,我都可以在一个csv文件中获得一个试验的摘要结果,以及该试验中每个决策点的32张图表。

一个受试者经历了九次试验

我当时正在考虑将一个对象最初生成的所有文件放在一个大文件夹中,所以我将拥有27个文件(三个文件乘以九次试用)。这样,我就不必多次更改工作目录(我想知道是否有一种方法可以让R打开一个具有特定名称的文件夹作为目录,运行脚本,将目录移至下一个文件夹,然后再次运行脚本...)

这9个试验由标签指定: AA AB AM BA BB BM MA MB MM

因此对于subject 1trial 1,我将有三个文件,其结尾为…mov1_AA

在运行了与一个试用版相对应的三个文件之后,R应将csv摘要输出保存在名为“summary_mov1”的单独文件夹中,并将文件命名为summary_mov1_AA,依此类推。 R应该将这32个图形保存在名为mov1_graphsgraph1_mov1_AAgraph1_mov1_AB等的另一个文件夹中。

理想情况下,脚本经过9次试验后,另一个名为 R2 的R脚本应获取9个CSV文件并从中构建一些图形。

一旦R运行R1脚本九次,我将继续学习新主题。

所以基本上:

  • 将R1与三个mov1文件一起使用,在summary文件夹中获得一个摘要csv文件(在另一个文件夹中添加32个图形)。

  • 执行此操作九次。一旦在同一个文件夹中获得了九个CSV摘要文件,请使用R2对其求平均值并生成图形。

  • 然后针对每个主题执行此操作(现在我有7个)。

我从未做过这种自动化,所以我有点迷茫。有什么建议么?您能指出我什么例子吗?哪个是最佳的工作流程?我应该在哪个级别上实现自动化,而我宁愿手动执行哪些操作?

1 个答案:

答案 0 :(得分:1)

以下内容并未就您使用的所有名称回答您的问题,因为我没有完全获得所需的所有组合。但是,以下代码演示了如何基本创建目录,读取/写入csv文件,将图写入文件等,以及如何遍历各种文件。我仅使用了一些废话数据,曲线图等进行演示(在以后的问题中,请尝试提供一些示例性数据。)。您将不得不根据需要调整计算和绘图。另请注意,您可能会使用不同的数据结构来存储对象,我只是在此处使用列表作为简单示例。

# make sure you are in a safe directory!
# define dirs
dir_project = "test"
dirs = list(
dir_project = dir_project
,dir_data = paste0(dir_project, "/data")
,dir_summary = paste0(dir_project, "/summary")
,dir_plots= paste0(dir_project, "/plots")
)
# create dirs
lapply(dirs, dir.create)
# create some exemplary data and write it in dir
m = matrix(1:4, nrow = 2)
data = list(m1 = m, m2 = m, m3 = m
            ,n1 = m, n2 = m, n3 = m)
for (i in 1:length(data)) {
  write.csv(data[[i]], file = paste0(dirs[["dir_data"]], "/", names(data[i]), ".csv"))  
}

# read data as if it were your files 
# assuming that the desired patterns of the filenames are known
# you can loop over them
patterns = c("m", "n")
for (p in patterns) {
files = list.files(dirs[["dir_data"]], pattern = paste0(p, "\\d.csv"), full.names = T)
data = lapply(files, read.csv)
names(data) = gsub(".csv", "", basename(files), fixed = T)
for (i in 1:length(data)) {
  png(file = paste0(dirs[["dir_plots"]], "/", names(data)[i],  "_plot.png"))
  plot(data[[i]])
  #turn off the graphics device
  dev.off()
}
# do some summary thing - of course, this depends on what you want as summary
# here I just bind all matrices together and call the standard summary()
data_summary = do.call(rbind, data)
#      X V1 V2
# m1.1 1  1  3
# m1.2 2  2  4
# m2.1 1  1  3
# m2.2 2  2  4
# m3.1 1  1  3
# m3.2 2  2  4
write.csv(as.data.frame(summary(data_summary))
          , file = paste0(dirs[["dir_summary"]], "/", paste0(names(data), collapse = "_"), "_summary.csv")) 
}

# check output
list.files(dirs[["dir_plots"]])
# [1] "m1_plot.png" "m2_plot.png" "m3_plot.png"
# [4] "n1_plot.png" "n2_plot.png" "n3_plot.png"
list.files(dirs[["dir_summary"]])
# [1] "m1_m2_m3_summary.csv" "n1_n2_n3_summary.csv"
read.csv("test/summary/m1_m2_m3_summary.csv")
# X Var1     Var2          Freq
# 1   1   NA        X Min.   :1.0  
# 2   2   NA        X 1st Qu.:1.0  
# 3   3   NA        X Median :1.5  
# 4   4   NA        X Mean   :1.5  
# 5   5   NA        X 3rd Qu.:2.0  
# 6   6   NA        X Max.   :2.0  
# 7   7   NA       V1 Min.   :1.0  
# 8   8   NA       V1 1st Qu.:1.0  
# 9   9   NA       V1 Median :1.5  
# 10 10   NA       V1 Mean   :1.5  
# 11 11   NA       V1 3rd Qu.:2.0  
# 12 12   NA       V1 Max.   :2.0  
# 13 13   NA       V2 Min.   :3.0  
# 14 14   NA       V2 1st Qu.:3.0  
# 15 15   NA       V2 Median :3.5  
# 16 16   NA       V2 Mean   :3.5  
# 17 17   NA       V2 3rd Qu.:4.0  
# 18 18   NA       V2 Max.   :4.0 

# delete the test directory and all data (just to have a clean example here)
unlink("test", recursive = TRUE)