【问题标题】:How can I generate unique names for my plots generated in a loop, so they don't end up overwritting one another?如何为循环中生成的图生成唯一名称,以免它们最终相互覆盖?
【发布时间】:2021-03-28 16:49:57
【问题描述】:

我目前正在尝试在 Linux“cartesius surfsara”环境中运行 bash 脚本和 R 脚本。该脚本的目标是了解大量文件的内容。我查看文件的结构、特定列的摘要,并尝试绘制它们。绘图是我的问题所在,我无法生成唯一的绘图名称。因此,生成的地块相互重叠,整个过程只生成了两个地块。任何有关此问题的帮助将不胜感激!

这是我调用 R 脚本的 bash 脚本

#!/bin/bash
#SBATCH -N 1
#SBATCH -t 2:10:00

module load 2019
module load R

#copy files
cp  $HOME/Donders/Brain_volumes/*.gz $TMPDIR

cp $HOME/Donders/plotting.R $TMPDIR 

#go into scratch
cd $TMPDIR 

ncors=15
for file in *.gz; do 
((k=k%ncors)); ((k++==0)) && wait
{
  Rscript plotting.R $file --no-save --slave --quiet
} &
done
wait

#copy files back to homedir 
cp *.csv $HOME
cp *.png $HOME

这是我绘制多个文件内容的 R 脚本,但是,在循环结束时只生成了 2 个图,因为我不生成唯一名称并且它们彼此重叠。

#load libraries
library("R.utils")
library("data.table")

A=commandArgs(trailingOnly=T)[1]

#read in data
data <- read.table(A, header = TRUE)
 
b <- as.numeric(data$beta) 
se <- as.numeric(data$se)

str(data)

summary_dat <- summary(data) 


png(filename = "b.png", 
    width = 640, height = 480, units = "px", pointsize = 12, 
    bg = "white", res = NA, 
    type = c("cairo", "cairo-png", "Xlib", "quartz"))
hist(b)
dev.off() 

png(filename = "se.png",
    width = 640, height = 480, units = "px", pointsize = 12, 
    bg = "white", res = NA, 
    type = c("cairo", "cairo-png", "Xlib", "quartz"))
hist(se)
dev.off()

write.csv(summary_dat, "summary.csv") 

【问题讨论】:

    标签: r bash shell loops


    【解决方案1】:

    您可以在 R 中运行 for 循环(或使用 map/lapply 函数)。

    您可以构建一个函数,使两个绘图和摘要文件仅用于作为参数传递的一个文件,然后在 R 函数中命名绘图,例如将 .gz 替换为 _1.png 和 _2.png 使用这两个绘图stringr::str_replace(filename_gz, '\\.gz', '_1\\.png)

    要列出作为循环索引的 *gz 文件,可以使用list.files() R 函数。

    所以:

    list_of_gz <- list.files(repo, pattern = '\\.gz')
    
    your_plotting_function <- function(one_file){
       save_your_png_with_one_file_name # you can replace 
                                        # .gz by .png for instance 
                                        # programmatically
       return(summary) # for example
    }
    
    # for loop
    for (f in list_of_gz){
      your_plotting_function(f)
    }
    
    # map
    purrr::map(list_of_gz, your_plotting_function)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多