Базовый пакет R сохраняет графики в цикле

Я пытаюсь оптимизировать параметры для baseline в базовом пакете R, изменяя каждый параметр в цикле и сравнивая графики, чтобы определить, какие параметры дают мне наилучший базовый уровень. В настоящее время у меня есть код, написанный так, что цикл создает каждый график, но у меня возникают проблемы с сохранением графика, поскольку класс каждого объекта, который я создаю, зависит от базового пакета (что, я подозреваю, проблема здесь).

foo <- data.frame(Date=seq.Date(as.Date("1957-01-01"), by = "day", 
                        length.out = ncol(milk$spectra)),
          Visits=milk$spectra[1,],
          Old_baseline_visits=milk$spectra[1,], row.names = NULL)
foo.t <- t(foo$Visits)
#the lines above were copied from https://stackoverflow.com/questions/37346967/r-packagebaseline-application-to-sample-dataset to make a reproducible dataset

df <- expand.grid(lambda=seq(1,10,1), p=seq(0.01,0.1,0.01))
baselinediff <- list()

for(i in 1:nrow(df)){
  thislambda <- df[i,]$lambda
  thisp <- df[i,]$p
  thisplot <- baseline(foo.t, lambda=thislambda, p=thisp, maxit=20, method='als')
  print(paste0("lambda = ", thislambda))
  print(paste0("p = ", thisp))
  print(paste0("index = ", i))
  baselinediff[[i]] <- plot(thisplot)
  jpeg(file = paste(baselinediff[[i]], '.jpeg', sep = ''))
  dev.off()
}

Я знаю, что смогу извлечь скорректированные спектры, используя baseline.als, но я просто хочу сохранить изображения графика с красной базовой линией, чтобы видеть, насколько хорошо прорисовываются базовые линии. Кто-нибудь из baseline пользователей может помочь?


person Jennifer    schedule 05.06.2019    source источник


Ответы (1)


Я предлагаю вам изменить цикл следующим образом:

for(i in 1:nrow(df)){
  thislambda <- df[i,]$lambda
  thisp <- df[i,]$p
  thisplot <- baseline(foo.t, lambda=thislambda, p=thisp, maxit=20, method='als')
  print(paste0("lambda = ", thislambda))
  print(paste0("p = ", thisp))
  print(paste0("index = ", i))
  baselinediff[[i]] <- thisplot
  jpeg(file = paste('baseline', i, '.jpeg', sep = ''))
  plot(baselinediff[[i]])
  dev.off()
}

Обратите внимание, что это не пытается захватить уже нанесенный на график элемент (thisplot) внутри списка. Вместо этого построение графика выполняется после вызова команды jpeg. Это решает вашу проблему с экспортом. Еще одна проблема заключалась в именовании файла. Если вы вызовете baselinediff[[i]] внутри paste, вы, очевидно, получите ошибку. Поэтому я заменил его на более простое имя. Чтобы построить результирующий список, вызовите:

lapply(baselinediff, plot)

Если вы полны решимости сохранить уже построенный элемент, хорошим началом может стать функция capture.plot из пакета imager.

person Ben Nutzer    schedule 06.06.2019
comment
Это именно то, что я пытался сделать, большое спасибо! - person Jennifer; 06.06.2019