如何使用R中的Lappy将列表中的绘图保存为jpeg格式?

如何使用R中的Lappy将列表中的绘图保存为jpeg格式?,r,list,plot,jpeg,lapply,R,List,Plot,Jpeg,Lapply,我从model_list中获得了一个包含10个绘图/图形的列表,我使用了下面的代码。我将这些图存储在列表var\u list中 library(mixOmics) var_list<-lapply(model_list, function(x) plotVar(x)) 我想将此列表中的这些绘图保存为jpeg(生成10个不同的jpeg)。我使用了下面的代码,R创建了10个图像,但是所有的图像都是相同的(所以只创建了第一个图,其余的都复制了) 我看到过类似的问题,但我找不到正确的解决方案,

我从
model_list
中获得了一个包含10个绘图/图形的列表,我使用了下面的代码。我将这些图存储在列表
var\u list

library(mixOmics)

var_list<-lapply(model_list, function(x) plotVar(x))
我想将此列表中的这些绘图保存为jpeg(生成10个不同的jpeg)。我使用了下面的代码,R创建了10个图像,但是所有的图像都是相同的(所以只创建了第一个图,其余的都复制了)

我看到过类似的问题,但我找不到正确的解决方案,为列表中的每个数据帧的每个图都有一个jpg!我怎样才能解决这个问题?非常感谢


通过这篇文章,您可以找到
dput(model_list[[1]])

以及您在类似文章中提供的数据,这里是您问题的可能解决方案。如果您处理
模型列表
会更好,因为当您转换到
变量列表
时,所有数据都会变成图形元素。下一个代码包含使用
datalist
复制的
model_list
,但在实际问题中,您必须拥有它,还必须包含列表中每个组件的名称:

> var_list[[1]]
                x          y Block  names pch cex     col font                  Overlap
TPI200 -0.6975577 -0.5582925     X TPI200   1   5 #388ECC    1 Correlation Circle Plots
TPI350 -0.8561514 -0.4101970     X TPI350   1   5 #388ECC    1 Correlation Circle Plots
TPI500 -0.9403552 -0.1074518     X TPI500   1   5 #388ECC    1 Correlation Circle Plots
TPI700 -0.9256605  0.3070954     X TPI700   1   5 #388ECC    1 Correlation Circle Plots
TPI900 -0.8697037  0.4699423     X TPI900   1   5 #388ECC    1 Correlation Circle Plots
library(mixOmics)
#Data
datalist <- list(df1 = structure(list(OID = c(-1, -1, -1, -1, -1, -1), POINTID = c(1, 
2, 3, 4, 5, 6), WETLAND = c("no wetl", "no wetl", "no wetl", 
"wetl", "wetl", "wetl"), TPI200 = c(70, 37, 45, 46, 58, 56), 
    TPI350 = c(67, 42, 55, 58, 55, 53), TPI500 = c(55, 35, 45, 
    51, 53, 51), TPI700 = c(50, 29, 39, 43, 49, 49), TPI900 = c(48, 
    32, 41, 46, 47, 46), TPI1000 = c(46, 16, 41, 36, 46, 46), 
    TPI2000 = c(53, 17, 53, 54, 54, 54), TPI3000 = c(47, 35, 
    47, 47, 47, 47), TPI4000 = c(49, 49, 49, 49, 49, 49), TPI5000 = c(63, 
    63, 63, 62, 62, 61), TPI2500 = c(48, 26, 48, 49, 49, 49)), row.names = c(NA, 
6L), class = "data.frame"), df2 = structure(list(OID = c(-1, 
-1, -1, -1, -1, -1), POINTID = c(1, 2, 3, 4, 5, 6), WETLAND = c("no wetl", 
"no wetl", "no wetl", "wetl", "wetl", "wetl"), TPI200 = c(70, 
37, 45, 46, 58, 56), TPI350 = c(67, 42, 55, 58, 55, 53), TPI500 = c(55, 
35, 45, 51, 53, 51), TPI700 = c(50, 29, 39, 43, 49, 49), TPI900 = c(48, 
32, 41, 46, 47, 46), TPI1000 = c(46, 16, 41, 36, 46, 46), TPI2000 = c(53, 
17, 53, 54, 54, 54), TPI3000 = c(47, 35, 47, 47, 47, 47), TPI4000 = c(49, 
49, 49, 49, 49, 49), TPI5000 = c(63, 63, 63, 62, 62, 61), TPI2500 = c(48, 
26, 48, 49, 49, 49)), row.names = c(NA, 6L), class = "data.frame")) 
#Function
custom_splsda <- function(datalist, ncomp, keepX, ..., Xcols, Ycol){
  Y <- datalist[[Ycol]]
  X <- datalist[Xcols]
  res <- splsda(X, Y, ncomp = ncomp, keepX = keepX, ...)
  res
}
#Create model_list, you must have the object
model_list <- lapply(datalist, custom_splsda,
                     ncomp = 2, keepX = c(5, 5),
                     Xcols = 4:8, Ycol = "WETLAND")
这将在您的文件夹中生成绘图,您可以在此处看到:

以及变化的绘图(参见标题):


由于没有提供有关
模型列表的数据,请尝试以下操作:
for(i in 1:length(model_list)){jpeg(paste0(names(model_list[i]),“.jpg”))plotVar(model_list[i])dev.off()
@Duck,谢谢您的回答,但我收到了错误消息
总计错误(sapply(cord.X,nrow)):无效的参数“type”(list)
。我在问题中添加了
var_列表的第一个元素作为额外信息。试图复制您的问题,由于数据类型的原因,我遇到了错误,请您将
dput(model_list[[1]])
添加到帖子中好吗?@Duck,在帖子末尾,您可以找到一个链接(wetranfer),该链接打开一个包含
dput(model_list[[1]的文本文件]
。仅仅把它作为文本放在帖子里就太大了。我期待着你的回答!非常感谢!你能做这个并在WetTransfer中分配:
保存(model_list[[1]],file='Object.RData)
拿着这个对象并上传它。我对你上传的txt文件有问题。这似乎有效,但如果你替换第一个文件的话模型列表后面的plotVar行中的“1”由“i”!
#循环(i in 1:长度(模型列表)){jpeg(粘贴0(名称(模型列表)[i],“.jpg”))plotVar(模型列表[[**i**]],title=名称(模型列表)[i])dev off()
非常感谢!@Lies非常感谢您的更正,这是一个打字错误。我现在已经修复。我希望这个答案对您有所帮助,并解决了您的问题!
library(mixOmics)
#Data
datalist <- list(df1 = structure(list(OID = c(-1, -1, -1, -1, -1, -1), POINTID = c(1, 
2, 3, 4, 5, 6), WETLAND = c("no wetl", "no wetl", "no wetl", 
"wetl", "wetl", "wetl"), TPI200 = c(70, 37, 45, 46, 58, 56), 
    TPI350 = c(67, 42, 55, 58, 55, 53), TPI500 = c(55, 35, 45, 
    51, 53, 51), TPI700 = c(50, 29, 39, 43, 49, 49), TPI900 = c(48, 
    32, 41, 46, 47, 46), TPI1000 = c(46, 16, 41, 36, 46, 46), 
    TPI2000 = c(53, 17, 53, 54, 54, 54), TPI3000 = c(47, 35, 
    47, 47, 47, 47), TPI4000 = c(49, 49, 49, 49, 49, 49), TPI5000 = c(63, 
    63, 63, 62, 62, 61), TPI2500 = c(48, 26, 48, 49, 49, 49)), row.names = c(NA, 
6L), class = "data.frame"), df2 = structure(list(OID = c(-1, 
-1, -1, -1, -1, -1), POINTID = c(1, 2, 3, 4, 5, 6), WETLAND = c("no wetl", 
"no wetl", "no wetl", "wetl", "wetl", "wetl"), TPI200 = c(70, 
37, 45, 46, 58, 56), TPI350 = c(67, 42, 55, 58, 55, 53), TPI500 = c(55, 
35, 45, 51, 53, 51), TPI700 = c(50, 29, 39, 43, 49, 49), TPI900 = c(48, 
32, 41, 46, 47, 46), TPI1000 = c(46, 16, 41, 36, 46, 46), TPI2000 = c(53, 
17, 53, 54, 54, 54), TPI3000 = c(47, 35, 47, 47, 47, 47), TPI4000 = c(49, 
49, 49, 49, 49, 49), TPI5000 = c(63, 63, 63, 62, 62, 61), TPI2500 = c(48, 
26, 48, 49, 49, 49)), row.names = c(NA, 6L), class = "data.frame")) 
#Function
custom_splsda <- function(datalist, ncomp, keepX, ..., Xcols, Ycol){
  Y <- datalist[[Ycol]]
  X <- datalist[Xcols]
  res <- splsda(X, Y, ncomp = ncomp, keepX = keepX, ...)
  res
}
#Create model_list, you must have the object
model_list <- lapply(datalist, custom_splsda,
                     ncomp = 2, keepX = c(5, 5),
                     Xcols = 4:8, Ycol = "WETLAND")
#Loop
for(i in 1:length(model_list))
{
  jpeg(paste0(names(model_list)[i], ".jpg"))
  plotVar(model_list[[i]],title = names(model_list)[i])
  dev.off()
}