Вы можете создать функцию с помощью уже созданного вами сценария, а затем применить его к вектору, содержащему каталоги, в которых находятся файлы. Внутри функции имена файлов, которые будут использоваться, можно искать как файлы, которые соответствуют определенному шаблону, используя list.files
. Наконец, вам просто нужно сохранить ggplot в правильном каталоге и назвать файл именем станции. Вот ваш код с изменениями, которые я сделал. Я прокомментировал все части, где я не внес изменений, чтобы было легче следовать. Надеюсь, что это работает!
#Added two libraries
library(stringr)
library(ggplot2)
my_function<-function(dirs)
{
#apply the same function for all the entries in the dirs vector
sapply(dirs, function(workd){
#Locate the file inside each directory that has "CNRM" and is a txt file
CNRM_location<-list.files(path = workd,
pattern = glob2rx("*CNRM*4.5*.txt"),
full.names = T)
#read that file
REF_CNRM <- read.table(CNRM_location, header=TRUE,dec=".",sep=" ", encoding="UTF-8")
# summary(REF_CNRM)
#
# colnames(REF_CNRM)[1] <-"date"
# colnames(REF_CNRM)[4] <-"Tasmin"
# colnames(REF_CNRM)[5] <-"Tasmax"
# colnames(REF_CNRM)[6] <-"Pre"
# colnames(REF_CNRM)[7] <-"Neige"
#
#
# REF_CNRM$date <- as.Date(as.character(REF_CNRM$date), format = "%Y%m%d")
# REF_CNRM$year <- year(ymd(REF_CNRM$date))
# REF_CNRM$month <- month(ymd(REF_CNRM$date))
# REF_CNRM$day <- day(ymd(REF_CNRM$date))
# REF_CNRM<- REF_CNRM[,c(8,9,10,1,2,3,4,5,6,7)]
# REF_CNRM <- REF_CNRM[,-4]
#
# REF_CNRM = subset(REF_CNRM,REF_CNRM$year>1970)
# REF_CNRM = subset(REF_CNRM,REF_CNRM$year<2006)
# REF_CNRM = subset(REF_CNRM,REF_CNRM$month>3)
# REF_CNRM = subset(REF_CNRM,REF_CNRM$month<10)
# summary(REF_CNRM)
# #convert to celecius
#
# REF_CNRM$Tasmoy = (REF_CNRM$Tasmin+REF_CNRM$Tasmax)/2
# Tasmoy <- convert.temperature(from="K", to="C",REF_CNRM$Tasmoy)
# REF_CNRM <- cbind(REF_CNRM,Tasmoy)
# REF_CNRM <- REF_CNRM[,-10]
# CNRM = aggregate(REF_CNRM[,10],FUN=mean,by=list(REF_CNRM$year))
#
# #precipitation moyenne annuelle
#
# CNRM_Pre = aggregate(REF_CNRM[,8],FUN=mean,by=list(REF_CNRM$year))
# DAta IPSL
#Locate the file inside each directory that has "IPSL" and is a txt file
IPSL_location<-list.files(path = workd,
pattern = glob2rx("*IPSL*4.5*.txt"),
full.names = T)
#read that file
REF_IPSL <- read.table(IPSL_location,header=TRUE,dec=".",sep=" ")
# summary(REF_IPSL)
#
# colnames(REF_IPSL)[1] <-"date"
# colnames(REF_IPSL)[4] <-"Tasmin"
# colnames(REF_IPSL)[5] <-"Tasmax"
# colnames(REF_IPSL)[6] <-"Pre"
# #colnames(REF_IPSL)[7] <-"Neige"
#
# #Date
# REF_IPSL$date <- as.Date(as.character(REF_IPSL$date), format = "%Y%m%d")
# REF_IPSL$year <- year(ymd(REF_IPSL$date))
# REF_IPSL$month <- month(ymd(REF_IPSL$date))
# REF_IPSL$day <- day(ymd(REF_IPSL$date))
# REF_IPSL<- REF_IPSL[,c(7,8,9,1,2,3,4,5,6)]
# REF_IPSL <- REF_IPSL[,-4]
#
# REF_IPSL = subset(REF_IPSL,REF_IPSL$year>1970)
# REF_IPSL = subset(REF_IPSL,REF_IPSL$year<2006)
# REF_IPSL = subset(REF_IPSL,REF_IPSL$month>3)
# REF_IPSL= subset(REF_IPSL,REF_IPSL$month<10)
# summary(REF_IPSL)
# #convert to celecius
# REF_IPSL$Tasmoy=(REF_IPSL$Tasmin+REF_IPSL$Tasmax)/2
# Tasmoy <- convert.temperature(from="K", to="C",REF_IPSL$Tasmoy)
# REF_IPSL <- cbind(REF_IPSL,Tasmoy)
# REF_IPSL <- REF_CNRM[,-9]
# IPSL = aggregate(REF_IPSL[,9],FUN=mean,by=list(REF_IPSL$year))
#
# #precipitation moyenne annuelle IPSL
# IPSL_Pre = aggregate(REF_IPSL[,8],FUN=mean,by=list(REF_IPSL$year))
# Données d'observations Laval
#Locate the file inside each directory that is a csv
Station_location<-list.files(path = workd,
pattern = glob2rx("*.csv"),
full.names = T)
#Read the file
obs <- read.table(Station_location,header=TRUE,sep=";",dec=",", skip=3)
#This is for extracting the name of the station, so you can save the plot with
#that name
Station_name<-list.files(path = workd,
pattern = glob2rx("*.csv"),
full.names = F)
#Remove the ".csv" part and stay only with the Station name
Station_name <- strsplit(Station_name,".csv")[[1]][1]
# summary(obs)
# colnames(obs)[2] <-"an"
# colnames(obs)[3] <-"mois"
# colnames(obs)[5] <-"Tasmax"
# colnames(obs)[6] <-"Tasmin"
# colnames(obs)[7] <-"Tasmoy"
# colnames(obs)[8] <-"Pre"
# summary(obs)
# obs = subset(obs,obs$an>1970)
# obs = subset(obs,obs$an<2006)
# obs = subset(obs,obs$mois>3)
# obs = subset(obs,obs$mois<11)
# summary(obs)
# OBS = aggregate(obs[,7],FUN=mean,by=list(obs$an))
#
# #precipitation mean IPSL
#
# obs_Pre = aggregate(obs[,8],FUN=mean,by=list(obs$an))
#
#
# #merge temperature
#
# CNRM_IPSL = merge(CNRM,IPSL, by="Group.1")
# CNRM_IPSL_obs=merge(CNRM_IPSL,OBS, by ="Group.1")
# colnames(CNRM_IPSL_obs)[1] <-"an"
# colnames(CNRM_IPSL_obs)[2] <-"CNRM"
# colnames(CNRM_IPSL_obs)[3] <-"IPSL"
#Paste the station name with "OBS_" to rename the column 4
colnames(CNRM_IPSL_obs)[4] <- paste0("OBS_",Station_name)
# CNRMIPSL <- reshape2::melt(CNRM_IPSL_obs, id.var='an')
# library(ggplot2)
# laval <- ggplot(CNRMIPSL, aes(x=an, y=value, col=variable)) + geom_line()+xlab('Années') +
# ylab('Température Moyenne (°C)')
# laval + scale_x_continuous(name="Années", limits=c(1988, 2006)) +
# scale_y_continuous(name="Température Moyenne (°C)", limits=c(12.5, 17))
#Finally save the plot to the directory using the station name
ggsave(paste0(workd,"/",Station_name,"_CNRM_IPSL.png"), width = 11, height = 8)
})
}
#Set the directories where you want to apply your function
station_directories<-c("C:/Users/majd/Documents/laval",
"C:/Users/majd/Documents/Paris",
"C:/Users/majd/Documents/Toulouse")
#Apply your function
my_function(station_directories)